Script des Tages: ruler

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script des Tages: ruler

Beitrag von Meillo » 18.03.2013 14:53:50

linuxCowboy hat geschrieben:Mach doch einen eigenen Thread auf und lass deinen Code optimieren:
Ha! Dafuer sollten wir unbedingt ein neues Unterforum anlegen lassen. Nach dem Motto: Poste deinen Code und wir optimieren (= verkuerzen) ihn fuer dich. Das wird garantiert grandios einschlagen. :-D
Use ed once in a while!

Benutzeravatar
habakug
Moderator
Beiträge: 4313
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: Script des Tages: ruler

Beitrag von habakug » 19.03.2013 00:56:02

Hallo!

Code: Alles auswählen

$ echo -e \\b"12345678_"{1..8}  # 28 
12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_8
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Script des Tages: ruler

Beitrag von linuxCowboy » 19.03.2013 01:01:54

Teufelskerl!

Code: Alles auswählen

e -e \\b12345678_{1..8} # 23
12345678_112345678_2123
Die bash schlägt zurück!

Code: Alles auswählen

c=8;eval "e -e \\\\b12345678_{1..${c}}"
12345678_112345678_212345678_312345678_
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script des Tages: ruler

Beitrag von Meillo » 19.03.2013 08:18:54

habakug hat geschrieben:

Code: Alles auswählen

$ echo -e \\b"12345678_"{1..8}  # 28 
12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_8
Uff ... Respekt! Das ist zwar unportabel, aber der kreative Ansatz beeindruckt mich. :-)

btw: Wenn du das `\b' noch in die Quotes packst, dann musst du den Backslash nicht escapen und sparst damit noch ein Zeichen. ;-)
Use ed once in a while!

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Script des Tages: ruler

Beitrag von linuxCowboy » 19.03.2013 15:26:19

state of play

Champion perl:

Code: Alles auswählen

c=$COLUMNS;perl -E"print 1..8,_,\$_%10for 1..$c/10;say 1..$c%10" # 64
12345678_112345678_212345678_312345678_412345678_512345678_61234
Underdog bash:

Code: Alles auswählen

i=;while((i++<$COLUMNS));do((i%10))&&e -n $((i%10))||e -ne \\b_$((i/10%10));done # 80
12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_8
Gelingt die Sensation!??

Edit: -1

Code: Alles auswählen

for i in `seq $COLUMNS`;do((i%10))&&e -n $((i%10))||e -ne \\b_$((i/10%10));done # 79
12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Script des Tages: ruler

Beitrag von ThorstenS » 19.03.2013 16:11:03

Die echo -e \\b-Lösung ist wirklich großartig! :hail:

ChronoBoost
Beiträge: 140
Registriert: 29.01.2013 11:03:50

Re: Script des Tages: ruler

Beitrag von ChronoBoost » 19.03.2013 17:50:56

ThorstenS hat geschrieben:Die echo -e \\b-Lösung ist wirklich großartig! :hail:
Ich schließe mich dem an. Sehr elegant/clever gelöst.

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Script des Tages: ruler

Beitrag von linuxCowboy » 20.03.2013 17:19:54

bash:

Code: Alles auswählen

printf "%c" $(seq $COLUMNS|sed -r 's/9$/_/;s/(.)0/\1/'|rev) # 59
12345678_112345678_212345678_312345678_412345678_512345678_
Sensation perfekt!?

Edit: -1

Code: Alles auswählen

printf "%c" `seq $COLUMNS|sed -r 's/9$/_/;s/(.)0/\1/'|rev` # 58
12345678_112345678_212345678_312345678_412345678_512345678
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Script des Tages: ruler

Beitrag von ThorstenS » 21.03.2013 09:20:02

Code: Alles auswählen

printf %c `seq $COLUMNS|sed -r 's/9$/_/;s/(.)0/\1/'|rev` # 56

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Script des Tages: ruler

Beitrag von linuxCowboy » 22.03.2013 00:38:08

bash legt nach:

Code: Alles auswählen

printf %c `seq $COLUMNS|sed 's/9$/_/;s/\(.\)0/\1/'|rev` # 55
12345678_112345678_212345678_312345678_412345678_512345
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Script des Tages: ruler

Beitrag von r900 » 22.03.2013 11:57:31

Das "\(.\)0" Konstrukt ist doch gar nicht nötig..

Code: Alles auswählen

printf %c `seq $COLUMNS|sed 's/9$/_/;s/0$//'|rev` # 49
12345678_112345678_212345678_312345678_412345678_512345

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script des Tages: ruler

Beitrag von Meillo » 22.03.2013 12:13:36

r900 hat geschrieben:Das "\(.\)0" Konstrukt ist doch gar nicht nötig..

Code: Alles auswählen

printf %c `seq $COLUMNS|sed 's/9$/_/;s/0$//'|rev` # 49
12345678_112345678_212345678_312345678_412345678_512345
Ab dreistelligen Zahlen aber schon, oder?
Use ed once in a while!

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Script des Tages: ruler

Beitrag von r900 » 22.03.2013 12:22:45

Meillo hat geschrieben:Ab dreistelligen Zahlen aber schon, oder?
Nein, denn das rev am Ende dreht die Zahlen um und durch printf %c wird dann nur die erste Ziffer gedruckt.
D.h. mit \(.\)0:
100 101 102 110 120 -> 10 11 12 11 12 -> 01 11 21 11 21
mit 0$:
100 101 102 110 120 -> 10 101 102 11 12 -> 01 101 201 11 21

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Script des Tages: ruler

Beitrag von linuxCowboy » 23.03.2013 00:44:46

another one bytes the dust

Code: Alles auswählen

printf %c `seq $COLUMNS|sed s/9$/_/\;s/0$//|rev` # 48
12345678_112345678_212345678_312345678_412345678
-der_linux_cowboy --- Besser werden! ... f*** w$$

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Script des Tages: ruler

Beitrag von linuxCowboy » 23.03.2013 22:44:54

state of play

bash triumphiert:

Code: Alles auswählen

printf %c `seq $COLUMNS|sed s/9$/_/\;s/0$//|rev` # 48
12345678_112345678_212345678_312345678_412345678
perl verbessert, aber es reicht nicht:

Code: Alles auswählen

printf %c `seq $COLUMNS|perl -pes/9$/_/\;s/0$//|rev` # 52
12345678_112345678_212345678_312345678_412345678_512
Der Champ am Ende!??
-der_linux_cowboy --- Besser werden! ... f*** w$$

deberik
Beiträge: 1177
Registriert: 30.09.2009 13:27:23

Re: Script des Tages: ruler

Beitrag von deberik » 23.03.2013 22:53:13

Gegen den Dollar - gegen den Kapitalismus ;)

Code: Alles auswählen

printf %c `seq $COLUMNS|sed s/9$/_/\;s/0//|rev` # 47
12345678_112345678_212345678_312345678_412345678
Debians Paketbeschreibungen übersetzen? Hilf mit!

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Script des Tages: ruler

Beitrag von linuxCowboy » 25.03.2013 01:34:08

perl hängt in den Seilen

Code: Alles auswählen

seq $COLUMNS|perl -pe's/9$/_/;s/0//;s/.*(.)\n/$1/m' # 51
12345678_112345678_212345678_312345678_412345678_51
vernascht von den coreutils

Code: Alles auswählen

printf %c `seq $COLUMNS|perl -pes/9$/_/\;s/0//|rev` # 51
12345678_112345678_212345678_312345678_412345678_51
Welcher Monk kann das mit ansehen!??
-der_linux_cowboy --- Besser werden! ... f*** w$$

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Script des Tages: ruler

Beitrag von linuxCowboy » 25.03.2013 23:15:44

damned!

Code: Alles auswählen

seq $COLUMNS|perl -pe's/9$/_/;s/0//;s/.*(.)\n/$1/' # 50
12345678_112345678_212345678_312345678_412345678_5
-der_linux_cowboy --- Besser werden! ... f*** w$$

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Script des Tages: ruler

Beitrag von linuxCowboy » 28.03.2013 00:32:42

ruler - der Blick zurück

12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_812345678_912345678_012345678_11234

Code: Alles auswählen

for i in `seq $COLUMNS`;do case $((i%10)) in 0) e -n $((i/10%10));;9) e -n _;;*) e -n $((i%10));;esac;done # 106

Code: Alles auswählen

for i in `seq $((COLUMNS/10))`;do e -n "`seq -s '' 8`_$((i%10))";done;seq -s '' $((COLUMNS%10)) # 95

Code: Alles auswählen

i=;while((i++<$COLUMNS));do((i%10))&&e -n $((i%10))||e -n $((i/10%10));done|sed s/89/8_/g # 89

Code: Alles auswählen

c=$COLUMNS;for i in `seq $((c/10))`;do e -n 12345678_$((i%10));done;seq -s '' $((c%10)) # 87

Code: Alles auswählen

i=;while((i++<$COLUMNS));do e -n $((i%10));((i%10))||e -en \\b\\b_$((i/10%10));done # 83

Code: Alles auswählen

for i in `seq $COLUMNS`;do((i%10))&&e -n $((i%10))||e -ne \\b_$((i/10%10));done # 79

Code: Alles auswählen

printf %c `seq $COLUMNS|sed -r 's/9$/_/;s/(.)0/\1/'|rev` # 56

Code: Alles auswählen

printf %c `seq $COLUMNS|sed s/9$/_/\;s/0//|rev` # 47

12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_812345678_912345678_012345678_11234

Code: Alles auswählen

perl -E '$c='$COLUMNS';while(++$i<=$c/10){print "12345678_".$i%10}say substr"123456789",0,$c%10' # 96

Code: Alles auswählen

c=$COLUMNS;perl -E"print 1..8,_,\$_%10for 1..$c/10;say 1..$c%10" # 64

Code: Alles auswählen

printf %c `seq $COLUMNS|perl -pes/9$/_/\;s/0//|rev` # 51

Code: Alles auswählen

seq $COLUMNS|perl -pe's/9$/_/;s/0//;s/.*(.)\n/$1/' # 50
Sollte ein ruler nicht zum Linux-Werkzeugkasten gehören? Oder ist er einfach ein gutes Beispiel für die Anwendung desselben?

Ich kann mir auch gut vorstellen, ihn über einen extra Schalter in die bewährten Hände eines seq zu legen.
-der_linux_cowboy --- Besser werden! ... f*** w$$

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Script des Tages: ruler

Beitrag von Cae » 28.03.2013 19:29:26

linuxCowboy hat geschrieben:Ich kann mir auch gut vorstellen, ihn über einen extra Schalter in die bewährten Hände eines seq zu legen.
Vielleicht bei fold(1). Das kann Text nach bestimmten Kriterien umbrechen, u.a. nach Zeichen. Dann koennte man mit demselben Tool ausmessen, wie breit der Text nun (oder hinterher) ist. Vielleicht auch bei cat(1), in Anlehnung an cat -n (gibt Zeilenummern mit aus). Aber so wirklich passt's nicht in die "one tool for one job"-Philosophie, also eher eigenstaendiges Programm.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Script des Tages: ruler

Beitrag von linuxCowboy » 25.08.2015 21:40:25

Es ist endlich soweit: der ruler zieht in die coreutils ein!

Code: Alles auswählen

### coreutils 8.24 seq.c

#include <sys/ioctl.h>

/* print a ruler */
static bool ruler;
 
  if (ruler) {
    char *p = "012345678_";

    struct winsize w;
    ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);

    for (int i = 1; i <= w.ws_col; ++i) {
      if (i % 10)
        printf("%c", p[i % 10]);
      else
        printf("%c", i / 10 % 10 + 48);
    }
    return EXIT_SUCCESS;
  }
Hier ist die diff. Vielleicht implementiert es auch jemand in fold, wie Cae vorschlägt?

Nur ich patche mein seq sowieso, da bietet es sich an.

Der ruler könnte sicher noch optimiert werden, diesmal in C... :wink:
-der_linux_cowboy --- Besser werden! ... f*** w$$

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Script des Tages: ruler

Beitrag von linuxCowboy » 26.08.2015 13:34:39

Sicher ist sicher, wobei mir 256 ein guter Wert erscheint.

Code: Alles auswählen

  if (ruler) {
    char *p = "012345678_";

    struct winsize w;
    ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);

    for (int i = 1; i <= (w.ws_col > 0 && w.ws_col < 256 ? w.ws_col : 80); ++i) {
      if (i % 10)
        printf("%c", p[i % 10]);
      else
        printf("%c", i / 10 % 10 + 48);
    }
    fputs (terminator, stdout);

    return EXIT_SUCCESS;
  }
diff-file
-der_linux_cowboy --- Besser werden! ... f*** w$$

Antworten