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:
- Nie ma żadnych nagród. ;)
- Program ma wyświetlać liczby od 1 do 100.
- 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)
- Nie można używać liczb ani pętli (czyli
until
,while
orazfor
). Można natomiast używać positional parameters ($1
,$2
itd.). - 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$?$?