Jednolinijkowiec w Bashu – liczby od 1 do 100

4

Zainspirowałem się tym wątkiem założonym przez @Freja Draco -> Jednolinijkowiec w JS na temat napisania jednolinijkowego programu w JavaScripcie (a więc w konsekwencji ma w moim wątku swój udział @Adam Boduch (Pamiętacie, że kiedyś mieliś...) ;) ).

Chciałem napisać tylko wpis na mikroblogu, ale pomyślałem sobie, że jak ktoś będzie chciał konkurować, to tu będzie mu lepiej pisać.

W tym wątku zadanie jest podobne do tego, jak u Fre – zasady są takie:

  1. Nie ma żadnych nagród. ;)
  2. Program ma wyświetlać liczby od 1 do 100.
  3. Program ma być w Bashu – czystym Bashu, bez programów zewnętrznych. Musi dać się uruchomić tutaj -> https://ideone.com/ (wersja Basha: 5.0.3)
  4. Nie można używać liczb ani pętli (czyli until, while oraz for). Można natomiast używać positional parameters ($1, $2 itd.).
  5. Program ma być krótszy co najmniej o jeden znak niż zaproponowany przeze mnie.

Mój program jest taki – 87 znaków:

x=$([ "" ];echo $?);f(){ [ $1 -gt $? ]&&f $(($1-$x));echo $(($1+$x));};f $(($x$?$?-$x))

Mała wskazówka: znaki liczyć można poleceniem wc -c. Jeśli korzystacie przy tym z echo, róbcie echo -n, będzie jeden znak mniej. ;)


UPDATE Biorąc sobie składnię ${##} z rozwiązania @Pyxis oraz składnię $[] z rozwiązania @plx211 , poprawiłem trochę swój rekurencyjny kod. Teraz jest 69 znaków:

x=${##};f(){ [ $1 -gt $? ]&&f $[$1-$x];echo $[$1+$x];};f $[$x$?$?-$x]

UPDATE2 Usuwając niektóre niepotrzebne składnie, udało mi się zejść do 56 znaków:

x=${##};f(){ [ $1 -gt $x ]&&f $[$1-x];echo $1;};f $x$?$?

UPDATE3 Działa także z operatorem -gt zamienionym na != – 55 znaków:

x=${##};f(){ [ $1 != $x ]&&f $[$1-x];echo $1;};f $x$?$?

https://ideone.com/NxnbOp

1

Kiedyś pisałem skrypty w Bashu ale teraz to wolę używać Pythona.

8

Ilość znaków: 23 (jeśli dobrze policzyłem :) )

seq $(printf "%d" "'d")

https://ideone.com/AFOYxI

Update:
Ilość znaków: 20

seq $(printf %d \'d)

https://ideone.com/unUjvj

Update #2:
Ilość znaków 19

seq `printf %d \'d`

https://ideone.com/eI06eN

Update #3
Pierwszy który spełnia wymagania :)
Ilość znaków: 43

eval echo -e '\\n'{$[++z]..$[$[++g]$[]$[]]}

https://ideone.com/b8zl1a

Update #4
Ilość znaków: 40

eval echo -e '\\n'{$[++z]..$[++g]$[]$[]}

https://ideone.com/vu71sF

Update #5
Ilość znaków: 32

eval echo {$[++z]..$[++g]$[]$[]}

https://ideone.com/f6GcHf

6

Da się jeszcze krócej, 28 znaków:

eval echo {${##}..${##}$#$#}

https://ideone.com/1ky8oX

3

14 znaków:

seq ${PWD##*/}

O ile wywołamy to w katalogu o nazwie 100 ;)

W sumie to się nie kwalifikuje, bo seq to zewnętrzny program, ale i tak wyszło całkiem fajne.

EDIT:

15 znaków bez programów zewnętrznych:

eval ${PWD##*/}

Ale trzeba to wywołać w katalogu o nazwie echo {1..100} xD

$ mkdir "echo {1..100}"
$ cd echo\ \{1..100\}/
$ eval ${PWD##*/}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

EDIT

A tu rozwiązanie analogiczne do tego od @Pyxis ale skrócone do 25 znaków poprzez wykorzystanie powrotnego kodu błędu polecenia fg bez argumentów:

$ fg;eval echo {$?..$?$#$#}
bash: fg: current: no such job
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
0

echo {1..100}|tr " " \\n
echo -e \\n{1..100}

1 użytkowników online, w tym zalogowanych: 0, gości: 1