Wprowadzenie
Pamiętasz ryczące lata 80-te? Mam na myśli, wiesz, jak 30 lat temu? Bez telefonów komórkowych, bez internetu, bez bankomatów, fluorescencyjne ubrania (co to było ?!) i przewijane markizy ! Nie nie nie! Nie online, ale prawdziwe, ze światłami LED.
Ponieważ jestem w nostalgicznym nastroju, chciałbym, żebyś stworzył przewijany namiot.
Wyzwanie
Utwórz program, w którym możesz wprowadzić ciąg jednego wiersza. Program musi utworzyć markizę przewijającą o szerokości 80 znaków, w razie potrzeby powtarzając tekst.
Zasady
- Użytkownik musi mieć możliwość wprowadzenia ciągu znaków do programu jako danych wejściowych. Ciąg może być parametrem wiersza poleceń lub ciągiem wprowadzonym podczas działania programu.
- Twój program musi stale drukować ciąg dokładnie 80 (widocznych) znaków.
- Ciąg musi być aktualizowany co 0,1 sekundy (mniej więcej; nie będę go mierzył w czasie), przesuwając znaki co każdą iterację o jedną pozycję w lewo.
- Ciąg „obraca się”. Na końcu łańcucha podanego przez użytkownika musi pojawić się kolejne wystąpienie łańcucha.
- Musisz program wydrukować jego wynik w jednym wierszu, bez wysuwu wierszy (użyj „\ r” zamiast „\ n”)
- Twój program musi działać ad infinitum , dopóki użytkownik nie przerwie.
- To jest codegolf, więc wygrywa najkrótszy kod w bajtach.
- Jest 10% premii (w zaokrągleniu do góry do najbliższej liczby całkowitej) do drukowania w kolorze czerwonym na białym tle.
- Obowiązują standardowe luki.
Implementacja referencji w Pythonie 2.7
Ten program nie jest golfem, ale zapewnia implementację referencyjną (a zatem górną granicę wielkości).
import time,sys
s=raw_input()*99
while 1:
for i in range(80):
print s[i:i+80]+'\r',
sys.stdout.flush()
time.sleep(0.1)
1 2 3 4 5 6 7 8 9 10 11 ... 300
odcięcia po około 56.Odpowiedzi:
CJam, 31 bajtów
Czeka dokładnie 100 ms.
Będzie to działać tylko z oficjalnym interpreterem Java , ponieważ interpreter online wyświetla dane wyjściowe tylko po wyjściu z programu.
Czerwony tekst na czarnym tle jest możliwy w 40 (lub 39) bajtach, co daje wynik 36:
Jak to działa
źródło
;
że wyjaśnienie jest niepoprawnePowerShell,
118 113 112 108 102 101 9996 - 10% = 86Kod
Z zastrzeżeniem, że teraz zaczyna się pierwsza pętla z drugą postacią; Reguły nie mówią, że musi zaczynać się od przodu sznurka, a pierwsza jest ogólnie włączona, więc nie mam nic przeciwko. Jakoś dostanę go do 100 znaków - edytuj: dzięki @ConnorLSW za zmiany, aby uzyskać go poniżej 100.
Instrukcje
Wynik
Notatki
Bardziej czytelna wersja z nieco zmienionymi nazwami i parametrami zmiennych:
-F R
są wystarczająco wyjątkowe, aby na przykład ustawić czerwony kolor pierwszego planu.-B 0
ustawia kolor na wartość Enum 0, która jest interpretowana jako czarna.Alternatywna, bardziej „poprawna” markiza:
Kod referencyjny nie obsługuje ładnie ciągów dłuższych niż 80 znaków, pomijając wszystko w wiadomości przekraczającej ~ 160 znaków, i resetuje usterkę co 99 * len (ciąg) znaków. np. jeśli szerokość znaku wynosiła 5 znaków, robi to:
Ta wersja indeksuje modulo długość tekstu zamiast szerokości znaku, więc biegnie przez cały ciąg. 106 - 10% = 95 znaków.
Alternatywnie: znak, który cykli jak .gif w pytaniu, 118-10% = 106
Ponieważ wygląda lepiej.
źródło
Bla
do0
-Write-Host
zinterpretuje numery kolorów.while(1)
, abyfor()
zaoszczędzić kilka bajtów :)for()
możesz zapisać jeszcze jeden bajt, zmieniając$s=(Read-Host)*180;for(){
nafor($s=(Read-Host)*180){
Matlab, 76 bajtów
Uważam, że miło jest, że wektory mogą mieć indeksy tablicowe. Zwraca wektor odpowiadających pozycji tablicy, co bardzo ułatwia dołączenie danego ciągu niezależnie od długości.
Wynik:
źródło
clc
. Zapomniałeś dodać's'
winput
a=input('','s')
'
ograniczniki w postaci danych wejściowych. Wiele języków potrzebuje ogranicznika ciągu lub interpretują argument wiersza poleceń w formie zdania (słowa oddzielone spacjami) jako wielu argumentów.QBasic,
116113 bajtów - 10% =105102Oto sformatowana wersja z kilkoma komentarzami:
Kilka uwag:
PRINT
poFOR
.CLS
powinien za każdym razem resetować kursor do lewego górnego rogu. Ale przynajmniej na QB64, jeśli nie dodam dodatkowegoPRINT
, markiza kończy się na drugiej linii zamiast pierwszej. Jeśli ktoś ma skonfigurowane QBasic na DosBox lub coś takiego, chciałbym wiedzieć, czy to samo się tam dzieje, czy jest to błąd QB64.TIMER
(opóźnieniu od liczby sekund od północy). Jeśli kod działa o północy, markiza utknie, ponieważTIMER
resetuje się0
i zawsze będzie mniejsza niżt
później.źródło
PRINT
ale z -CLS
poCLS
, bez względu na to, co zostało wydrukowane, następnaPRINT
instrukcja powinna mieć wynik 1,1; ale zamiast tego natknąłem się na sytuację, w której dane wyjściowe wynoszą 2,1.Perl,
9998 bajtów (-10% = 89)Pobiera dane wejściowe z parametru wiersza polecenia.
źródło
pb , ⌈ (216 + 3) * 0,9⌉ = 198
+3 bajty dla flagi interpretera
d=1
Całkiem okropny wynik, ale biorąc pod uwagę, jak trudno jest zrobić coś w tym języku, mogłoby być gorzej. Stosunek tej odpowiedzi do (bajtów używanych do uzyskania czerwonego tekstu) do (premia z posiadania czerwonego tekstu) jest naprawdę dobry, całe wyjście zmienia kolor na czerwony z
c
samym początkiem!Czas między każdym tikiem różni się w zależności od długości ciągu wejściowego, ale wynosi około 0,1 sekundy.
Nawiasem mówiąc, dane wyjściowe tego programu wyglądają jak śmieci, ponieważ interpreter jest tak zły. Co milisekundę czyści terminal i przerysowuje wszystko, więc robi się naprawdę migotliwy.
Z komentarzami:
źródło
Perl - 120 bajtów (-10% = 108)
źródło
Matlab, ⌈188 * .9⌉ = 170
Działa to w wersji Matlab R2014b lub nowszej. Wynik jest pokazany w oknie figury.
W poniższym przykładzie tekst jest pogrubiony dla lepszej wizualizacji (nie zrobiono tego w powyższym kodzie, ponieważ kosztuje on kilka bajtów). Należy również zauważyć, że szybkość animacji GIF nie odpowiada wymaganej pauzie 0,1 s, ale taktowanie jest prawidłowe na rzeczywistym rysunku pokazanym przez uruchomienie programu.
źródło
SpecBAS, 130 bajtów (-10% = 117)
Mnoży oryginalny ciąg, aby uzyskać 80 lub więcej znaków, a następnie przycina go dokładnie do 80.
TEXT
to polecenie w SpecBAS, które działa tak samo jakPRINT
(w tym przykładzie), ale zapisuje jeden znak.SCALE
Polecenie dodaje kilka dodatkowych znaków w kodzie, ale sprawia, że wyglądają bardziej markizy-dosyć.Program trwa do momentu naciśnięcia klawisza Esc.
źródło
Perl, 63 (70 znaków - 10% na bonus)
Nie jest to zupełnie inne rozwiązanie od pozostałych, ale zmarnowałem czas na tworzenie, więc pomyślałem, że też to opublikuję!
Opiera się na terminalu kompatybilnym z Uniksem dla kodów ANSI i wywołaniu coreutils
sleep
. Dwa\x..
znaki powyżej są dosłownie dosuwane do wiersza i znaku ucieczki zgodnie z tym zrzutem heksów:źródło
Rubinowy,
797675 bajtówNadal nie jestem ekspertem od rubinów, prawdopodobnie można grać w golfa.
Z czerwonym i czarnym tym samym wynikiem:
źródło
Perl, 84 bajtów (- 10% = 76)
Pobiera argument wiersza poleceń, który jest tekstem w namiocie.
Wyjaśnienie:
$_
\b
) i spację (). To usuwa ostatni znak z poprzedniego wydruku. Następnie wydrukuj zwrot karetki i kolor.
$p
$p = ($p+1) % length of text
źródło
bash, 121 bajtów
źródło
Python 3, 96 bajtów
Działa to tylko na terminalach obsługujących sekwencje specjalne ANSI. Jeśli korzystasz z systemu Windows, spróbuj ansicon .
Hurra za
flush
słowo kluczowe w Pythonie 3, więc nie musimy wykonywać drogichsys.stdout.flush()
połączeń.źródło
C,
293269 bajtów(Dodano nowe linie dla czytelności)
Pobiera to dane ze standardowego wejścia zakończonego przez EOF; więc najlepiej wpisać ciąg, nowy wiersz, a następnie EOF (np. Ctrl ^ D).
Nie golfowany:
źródło
SmileBASIC BIG, 79 bajtów
Miałem dobre rozwiązanie graficzne, prawie gotowe, kiedy zdałem sobie sprawę, że musi przewijać 1 całą postać na raz.
źródło
Galaretka ,
201918 bajtów80
przez⁹
(= 256), ponieważ należy go pomnożyć przez co najmniej 80Çß
(zÇ1¿
).Kilka sztuczek z odpowiedzi @Dennis tutaj . Galaretka jest nowsza niż wyzwanie, ale nie jest specjalnie do niej dostosowana. Sugestie dotyczące poprawy są mile widziane! Jeśli twoja konsola jest w utf-8, uruchom
export LC_ALL=en_US
lub podobnie przed próbą.Przykład
Wyjaśnienie
źródło
LOVE2D Lua, 197-10% = 178 bajtów
Wymaga, aby dane wejściowe znajdowały się w pliku o nazwie „tt” w katalogu głównym, dlatego do oceny dodano 3 dodatkowe bajty.
Niezwykle podstawowa funkcjonalność, tylko w pętli for 80 powtórzeń, dołącza znak o indeksie i plus bieżący czas w sekundach modulowany długością bieżącego ciągu, dając powtarzający się ciąg znaków o długości 80 znaków, który przesuwa się w lewo w miarę upływu czasu.
Użyłem LOVE2D do śmiechu.
źródło
Sinclair ZX81 / Timex TS1000 / 1500 BASIC,
110 bajtów182 bajty (dla wpisu)Działa, drukując pierwsze
3280 znaków ciąguA$
w pozycji ekranu 0,0 w drugim wierszu, a następnie manipulując ciągiem od pozycji 2 do końca żądła w wierszu 3 (Sinclair ZX81 BASIC indeksuje ciągi od 1, a nie zero ), dlatego dodając pierwszy znak na końcu i przekazując go z powrotem doA$
zmiennej; wtedy jest bezwarunkowa pętla z powrotem do linii 2.źródło
Commodore 64, 434 bajty
Ponieważ wymaga to 80 znaków do wyświetlenia, a C64 domyślnie ma tylko 40 znaków, wówczas 40 znaków przewijania jest drukowanych w górnej linii obszaru ekranu, a pozostałe 40 są drukowane blisko dołu.
Aby wyjaśnić, co
{HOME}
oznaczają te i inne symbole jako PETSCII, oto zrzut ekranu pobrany z mojego emulatora:Zrobię pełną wersję gry w golfa, gdy zainstaluję CBM PRG Studio (lub gdy nie będę na lunchu w pracy).
źródło
Ruby,
7977 znakówźródło
PHP, 136 bajtów
php -f marquee.php hello\ world
ciągiem „hello world”.hello worlddddddddddddddddddddddddddddddddddddddd
, ale będzie przechodził tylko przez 80 znaków - mam nadzieję, że nadal się liczy.To był długi dzień, prawdopodobnie mogę coś zrobić, aby to poprawić
źródło
PHP, 85 bajtów
pobiera dane wejściowe z argumentu pierwszego wiersza poleceń; biegać z
-nr
.Rozpoczyna przewijanie z drugim znakiem. Dodaj jeden bajt, aby rozpocząć od pierwszego znaku:
Wymień
=++$i%
się%=
i;;
z;;$i++,
.źródło