Po wejściu do Obfuscated Hello World pomyślałem, że fajnie byłoby dzielić się kodem źródłowym. Ale po prostu pokaż kod, zróbmy z niego golfa!
Wyzwanie
Napisz skrypt, który przewija ciąg znaków przez terminal, od prawej do lewej, osiadając po lewej stronie.
Wejście
Bierze ciąg jako argument.
Wynik
Drukuje przewijaną markizę na STDOUT. Maksymalna szerokość ~ 50 znaków. Zaczyna się od pokazania 0 lub 1 znaków. Odstęp między literami podczas przewijania. Zatrzymuje się po ustaleniu (bez dodatkowego odstępu między znakami słów). Powolne przewijanie, ale niezbyt wolne (<1 s na iterację).
Przykład
Uruchamianie skryptu z arg 'Hello World'
H
później
H e l l o W o
później
H e l l o W o r l d
później
Hell o W o r l d
Wreszcie
Hello World
Na bieżący przykład wypróbuj mój kod z wyzwania „Hello World”. W końcu opublikuję moje. Obecnie w Perlu jest 202 znaków. Teraz, kiedy jest kilku konkurentów, zamieściłem mój w odpowiedziach.
Zwycięzca
Nie chcę, aby ograniczenia były bezwzględne, dlatego zostawiłem je trochę niejasne. Zwycięży najkrótszy scenariusz zgodny z duchem mojego oryginału.
Notatki
Ta gra zakłada xterm
środowisko. Jeśli inne środowisko okaże się przydatne, zostaną porównane tylko podobne środowiska i dla każdego z nich może zostać ogłoszony osobny zwycięzca.
Dodatek (25 kwietnia 2012 r.)
Aby rozwiązać kilka problemów, podejmuję decyzję. Twoja liczba znaków musi zawierać kod potrzebny do:
- Flush STDOUT (Patrzy na ciebie Ruby)
- Implementuj
sleep
z opóźnieniem <1s (Looking at you Perl)
Można tego dokonać, gdy linia poleceń przełącza się na interpreter, ale znaki te są liczone łącznie (bez otaczania białych znaków).
xterm
,vt102
...?Odpowiedzi:
python 2 - 146 znaków
edit: uczyniło ją funkcją zamiast wprowadzania przez stdin. pierwszy argument to ciąg znaków, a drugi argument to długość, jaką chcesz. więc wywołanie byłoby
f('Hello World', 50)
. Sprawiłem, że stało się to znacznie płynniejsze; kiedy każda postać „wylądowała”, nastąpiła niezręczna pauzastare, 158 znaków:
źródło
f("Hello World, 40)
zadziałało dla mnie.Ruby,
939189 znakówTekst do wyświetlenia musi być podany jako argument wiersza poleceń, np
dla przykładu pokazanego powyżej. Niestety nie mogę tutaj wyświetlić animacji, więc musisz sam wypróbować kod.
Poprzednia wersja:
źródło
STDOUT.sync=true;
tak ustawić , aby automatycznie się wypłukiwał. Równanie Perla to$|++
. To dodatkowe 17 znaków, ale wciąż znacznie poniżej moich. Nie mogę pozwolić, żeby Ruby pokonała Perla! Muszę zacząć działać. Niezłe.ruby1.8 "Hello World"
, nie jest dla mnie zaskoczeniem błąd, mówiąc:ruby1.8: No such file or directory -- Hello World (LoadError)
ruby foo.rb args
;-)C,
948380173 znakówEDYCJA: Dodano dużo kodu, teraz implementuje wszystkie wymagane funkcje. Stałą
1e8
można dostosować, aby kontrolować prędkość. Na mojej maszynie jest dość szybki.Niektóre postacie z pewnością można tu zapisać.
l
może być statyczny (zapisuje inicjalizację),c
może stać się wskaźnikiem (zamieniab+c
).Stara wersja (80 znaków), z częściową funkcjonalność:
Zapisane parę znaków zastępując
char**t
zint*t
. Działa dobrze w wersji 32-bitowej (int**t
obsługuje 64-bit).źródło
K&R C -
431416 znakówW wysokim stopniu przestrzega normy. Używa ncurses, więc powinna być w dużej mierze niezależna od terminali. Występuje niewielkie jąkanie, gdy tekst uderza w bok z powodu pewnych sztuczek, które zachowały zamierzoną spację w łańcuchu.
Ciąg znaków, który ma być użyty, powinien zostać przekazany jako pierwszy argument w wierszu poleceń (i powinien być poprzedzony znakiem ucieczki, jeśli zawiera spacje, a tym bardziej, jeśli zawiera znak taki
!
jak mój ciąg testowy (Hello, World!
)).W bardziej czytelnej i skomentowanej formie:
źródło
if
operatorów. Na przykład -if((s-q)%2)s--;else usleep(1e5);
->s-q&1?s--:usleep(1e5);
(lubs-=s-q&1||usleep(1e5);
)' '
s odpowiednikami liczbowymi.x==32
zx-32
(odwraca znaczenie, więc odwrotna if-else) lub zx<33
(zakładając 0..31 nigdy nie używany). Zainicjuj za pomocą wartości, które masz (for(curs_set(c=0);...
).*(s+1)
->s[1]
. Usuń niepotrzebne aparaty ortodontyczne (zastąpienie;
go,
pomoże).Perl 5.13.2, 96
Kradnąc dużo z odpowiedzi @ Kevina Reida , zwłaszcza
/r
sztuczka dostępna w nowszych Perlach.Perl, 115
Podobnie jak odpowiedź @ Joela Bergera , stałbym się znacznie krótszy, gdybym mógł użyć
sleep 1
i być powolnym lub przekazać-MTime::HiRes=sleep
wiersz poleceń, aby włączyćsleep.1
. W przeciwnym razie jedynym wbudowanym sposobem na uzyskanie krótkich snówselect'','','',.1
jest dość długi.Perl, 128Perl, 133źródło
x
a blokowa formamap
uratuje kilka.JavaScript
180218 znakówWersja produkcyjna:
Wersja bez golfa:
Oto demo jsFiddle
Uwaga: jeśli spróbujesz go odtworzyć, upewnij się, że kod znajduje się pod treścią
źródło
Perl 5.13.2, 115 znaków
/r
.Kredyty:
$"
jako źródło" "
zaczerpnięte z odpowiedzi ephemienta , zmniejszenie o 1 znak.źródło
r
flagę, najlepszy dodatek do języka od tego czasustate
bash 234
Stosowanie:
bez golfa:
źródło
R, 319 znaków
Zgodnie z filozofią z przykładu @Blazer (d to opóźnienie w sekundach):
Stosowanie:
źródło
Perl :
144133Aby uzyskać sen <1s, musisz uruchomić jako:
Ponieważ nie ogłoszę się zwycięzcą, nie będę się kłócił o to, co się tam liczy, czy nie (ale naprawdę nie mogę wygrać tego Ruby ;-))
źródło
s/' '/$"/g
is/shift/pop/
push
oświadczenia. Po prostu jeszcze tego nie opublikowałem.Q, 145
Nie do końca spełnia wymagania, ponieważ ostatni wiersz usuwa wszystkie spacje, które były w oryginalnym ciągu wejściowym.
Wymaga dwóch argumentów, ciągu wejściowego i prędkości przewijania
źródło
PowerShell, 135
Niezbyt gra w golfa i prawdopodobnie okropne podejście, ale jestem chory i nie mogę tak naprawdę myśleć ...
źródło
J (116)
Pobiera ciąg wejściowy w wierszu polecenia, tj
jconsole marquee.ijs 'Hello, world!'
Jeśli nie trzeba wyczyścić ekranu, tzn. Wydrukować tak:
jest dozwolone, będzie on krótszy o 12 znaków.
Wyjaśnienie:
s.=>2{ARGV
: pobierz ciąg z wiersza poleceńk.=50,3#~<:#s
: początkowa ilość białych znaków dodawana przed każdą postacią, 50 przed pierwszą i 3 przed wszystkimi pozostałymi. (daje tablicę „50 3 3 3 ...”)([-=&0@/:@\:@~:&0)
: biorąc pod uwagę tablicę, zmniejsza pierwszy niezerowy element w tablicy^:(i.>:+/k)
: ta funkcja była stosowana N razy, gdzie N wynosi 0 do sumy dodanej białej spacji. (daje macierz:50 3 3 3; 49 3 3 3; 48 3 3 3; ... 0 0 0 1; 0 0 0 0)
."1
: uruchom następującą funkcję w każdym rzędzie macierzy;@:(([,~#&' '@])@.>)
: dodaj określoną liczbę spacji przed każdym znakiem w ciągu(50&{.)
: weź pierwsze 50 znaków ciągu([[i.@]&2e7)
: funkcja, która generuje listę od 0 do 2 * 10 ^ 7, a następnie ją wyrzuca. Na moim komputerze zajmuje to około jednej trzeciej sekundy, co powoduje opóźnienie.((50#LF)&,)
: dodaj 50 znaków przed ciągiem, aby wyczyścić ekranecho
: wypisuje ciągs (...)
: podaj ciąg jako lewy argument funkcjiźródło
APL (70)
Pobiera dane z klawiatury, dane wyjściowe znajdują się w
⎕SM
oknie (który, jak sądzę, byłby terminalem, gdybyś miał tekstowy APL). Rozmiar okna jest wykrywany automatycznie, jeśli naprawdę ma to być 50 Zmiana1↓⎕SD
celu50
.Wyjaśnienie:
1↓⎕SD,1↓3⍴⍨⍴D←⍞
: przeczytaj ciąg i zapisz wD
. Wygeneruj wektor opisujący, ile białych znaków należy dodać przed każdym znakiem, czyli szerokość ekranu przed pierwszym znakiem (1↓⎕SD
) i 3 przed pozostałymi (1↓3⍴⍨⍴D
).⎕DL÷8
: poczekaj 1/8 sekundyP←⍵-{⍵×~×⍺}\×⍵
: w wektorze w prawym argumencie odejmij 1 od skrajnie lewego niezerowego elementu i zapisz nowy wektor w P.,/D{⍺,⍨⍵⍴⍕⍬}¨P
: dla każdego znaku w D poprzedza ilość białych znaków podanych w P.⎕SM∘←1,⍨1,⍨
: wyświetla się na ekranie, w lewej kolumnie w górnym rzędzie0∨.≠P:∇P
: jeśli w P jest element niezerowy, powtórz z P.źródło
PowerShell , 129 bajtów
Wypróbuj online!
Ten skrypt nie usuwa spacji z argumentów, w przeciwieństwie do skryptu Joeya .
TIO
nie wyświetla poprawnie wyniku. Dzięki konsoli Powershell otrzymujesz przewijaną linię znaków.źródło
05AB1E , 42 bajty
Wypróbuj online (bez snu). UWAGA: Nie mam zainstalowanego 05AB1E lokalnie, więc nie jestem w 100% pewien, czy lewica
\r
działa (teoretycznie powinna jednak działać). W TIO\r
są one interpretowane jako znaki nowej linii. Ponadto TIO wykorzystuje starszą wersję, ponieważ.e
jest wyłączona w nowej wersji TIO (program jest taki sam zarówno w starszej, jak i nowej wersji 05AB1E).Wyjaśnienie:
Zobacz moją wskazówkę 05AB1E (sekcja Jak korzystać ze słownika? ), Aby zrozumieć, dlaczego tak
“…¢('\r')“
jest"print('\r')"
.źródło
Python, 139 bajtów
Musi zadzwonić,
f('Hello World', 50)
aby rozpocząć.źródło