Wybierz cytat lub frazę o długości dokładnie 5 słów, np Programming puzzles and code golf!
.
Napisz program, który po dodaniu do siebie n razy, wyświetli pierwsze n + 1 słów frazy w kolejności.
Na przykład, jeśli kod Twojego programu był, MYPROG
a Twoja fraza była Programming puzzles and code golf!
uruchomiona ...
MYPROG
powinien wyjśćProgramming
MYPROGMYPROG
powinien wyjśćProgramming puzzles
MYPROGMYPROGMYPROG
powinien wyjśćProgramming puzzles and
MYPROGMYPROGMYPROGMYPROG
powinien wyjśćProgramming puzzles and code
MYPROGMYPROGMYPROGMYPROGMYPROG
powinien wyjśćProgramming puzzles and code golf!
Dodanie więcej niż 4 razy jest niezdefiniowane, twój program może zrobić wszystko.
Zasady
- Twoje zdanie musi być gramatycznie znaczącym angielskim. Najlepiej byłoby, gdyby był odpowiednio pisany wielkimi literami i interpunkcyjny.
- Twoja fraza może mieć dowolną długość, ale jej entropia, obliczona przez http://www.shannonentropy.netmark.pl/ , nie może być mniejsza niż 3,5 .
(Wklej frazę, kliknij Oblicz i poszukaj ostatniego H (X) .) - Twoja fraza może zawierać tylko drukowalne znaki ASCII (szesnastkowo od 20 do 7E). Twój kod może zawierać tylko ASCII do wydruku oraz tabulatory i znaki nowej linii.
- Twoja fraza musi zawierać dokładnie 5 unikatowych słów i 4 spacje. Wszystkie spacje liczą się jako części słów. Spacje to granice słów. Mogą nie być wiodące ani końcowe; w końcu powinno być jedno oprócz ostatniego słowa.
- Wynik powinien również zawierać jedną spację między wyrazami. Dane wyjściowe na każdym dołączanym kroku mogą zawierać spacje końcowe, ale nie spacje wiodące.
- Wyjście na standardowe wyjście. Brak danych wejściowych.
Punktacja
Twój wynik to długość w bajtach początkowego nieza dołączonego programu. (np. MYPROG
wyniki 6)
Ponieważ jest to gra w golfa, wygrywa najniższy wynik.
code-golf
source-layout
Hobby Calvina
źródło
źródło
Odpowiedzi:
CJam - 24
Wypróbuj na http://cjam.aditsu.net/
Wyjaśnienie:
Lm
usuwa litery zawarte w L (początkowo „”) z „TheguywasnotI”3<
bierze pierwsze 3 litery]
zbiera zawartość stosu w tablicyS*
dołącza do tablicy za pomocą spacji, ponieważ separator:L
przypisuje wynikowy ciąg L (pozostawiając go również na stosie )Stara wersja (28 bajtów):
Wyjaśnienie:
S/
dzieli wedługW):W
przyrostów miejsca W (początkowo W = -1)=
dostaje W'te słowo]
zbiera zawartość stosu w tablicyS*
łączy się z tablicą używając spacji jako separatoraźródło
Piet (odpowiedź honorowa)
Wije się w dół, biegnie w prawo przez niebieski i ponownie wchodzi przez zielony. Drukuje „Muchy owocowe jak banan”.
Użyłem PietCreatora, aby to zrobić, ale możesz to wypróbować tutaj . Przebudowywanie programów Piet jest uciążliwe, więc zacząłem od 35x35 i kontynuowałem w ten sposób, co oznacza, że użyłem o wiele więcej kodów niż potrzebowałem.
Rzeczywiste wersje wielkości
źródło
> <> (42)
Ryby są naprawdę największym zwierzakiem. Niektóre osoby trzymają robaki jako zwierzęta domowe z powodu niezrozumiałego braku logiki. Ten program dokłada wszelkich starań, aby rozumować z takimi ludźmi.
Zauważ, że w programie nie ma końca nowej linii. Pełna moc wyjściowa jest odwracana w pierwszym wierszu; pełna fraza brzmi „Co może zrobić dowolny błąd?” (entropia 3.58418).
Pełne wyjaśnienie:
Jest to jeden z bardziej zabawnych programów, które napisałem, ponieważ jest to pierwszy, który używa refleksji. W pierwszym wierszu znajduje się mięso programu.
!v
to brak!
operacji , ponieważ powoduje pominięcie następnej instrukcji.'?od gub yna nac tahW;'
przechowuje pełną frazę na stosie (jest odwrócona, ponieważ każda litera jest wypychana na stos w zapisanej kolejności, więc należy ją odwrócić, aby ładnie wyskoczyła).00p
tam zaczyna się prawdziwa magia. Zwróć uwagę, że nie tylko przechował frazę, ale także;
.00p
wstawia górny znak na stosie do programu w pozycji (0, 0), więc teraz pierwszym znakiem programu jest a;
.Zakończenie
!
pomija ten średnik i przesuwa kursor nav
, co kieruje przepływ programu w dół.Odtąd wszystko to po prostu procedury drukowania. Ponieważ nie ma końcowego nowego wiersza, kolejne dodatki programu po prostu dodają dwa ostatnie wiersze, ponieważ pierwszy wiersz będzie po prawej stronie
voo <
, a zatem nigdy nie zostanie wykonany.Na koniec kursor jest skierowany w lewy dolny róg programu i zawija się do lewego górnego rogu, gdzie
;
wstawiono go wcześniej, kończąc program.źródło
"It is by a rope."
Twoja fraza powtarza znaki, więc ma niższą entropię niż mogłaby.Python 66
Entropia: 3,61635
Ouput:
Dzięki @JasonS i @grc za wskazówki dotyczące skrócenia części detekcji zmiennych.
Aktualizacja: zobacz odpowiedź JasonS na nikczemną sztuczkę, która zepchnęła to do 55 bajtów. :)
źródło
i=locals().get('i',-1)+1;
ma -5 bajtówi='i'in dir()and i+1
. Edycja: zasady zmienione.i='i'in dir()and i+1;print"Tfpcfhaialetgny"[i::5]+" ."[i>3],
Python 3, 55 (bonus 67)
Masz na myśli, że to się otacza?
OK, jakieś wyjaśnienie na temat nr 2 (spoilery)
credits
jest wbudowanym pytonem zawierającym tekst, którego chciałbym użyć. Jest to specjalny typ ze sformatowanym,repr
dzięki czemu możesz po prostu wpisać go w interaktywnym tłumaczu i zobaczyć ładne wyniki, więc muszę tostr()
zrobić. Spędziłem sporo czasu, szukając wbudowanych narzędzi do tego, a „Dziękuję za wsparcie rozwoju Pythona” jako frazę było zbyt piękne, aby je pominąć.Ponieważ jest dużo tekstu i chcę tylko 5 słów, chcę zapisać pozycje początkową i końcową każdego podłańcucha. To jest w bajtach na początku.
bytes
obiekty w python3 działają jak tablice liczb całkowitych, gdy używasz na nich operacji sekwencji.Ale kod może zawierać tylko znaki do wydrukowania, więc musiałem znaleźć przesunięcie (49), które sprawi, że wszystkie moje wartości pozycji będą drukowane jako znaki.
„Dzięki” znajduje się blisko początku ciągu, podczas gdy inne słowa są bliżej końca, co oznacza, że moje wartości pozycji były zbyt daleko od siebie, aby wszystkie znajdowały się w zakresie do wydrukowania. Mulitplying ciągu o 2 tworzy kolejną kopię „Thanks”, która jest bliższa innym słowom.
Pobranie
[49:]
wycinka ciągu jest o jeden mniej bajtów źródłowych niż dodanie 49 zarówno do a, jak i b.Konstruktem zastosowanym we wszystkich trzech odpowiedziach jest
x=<value>;dostuff and increment;x
. Trailingx
nic nie robi, ale w połączeniu z następną kopią kodu zmienia się w,xx=<value>
co zapobiegax
nadpisywaniu licznika.a,b,*q=q
jest całkowicie normalne rozpakowywanie sekwencji w Pythonie 3.źródło
Python 2 (37)
Po tym, jak Sarah została przewodniczącą lokalnego oddziału Mensa, stała się przedmiotem romantycznej uwagi mężczyzn szukających inteligentnego partnera. Za każdym razem Sarah starała się nawiązać osobisty kontakt, ale mężczyźni po prostu badali ją w zawiłych kwestiach filozoficznych. Sfrustrowana, że nikt nie dbał o jej emocjonalną stronę, wykrzyknęła ...
Wydajność:
Entropia jest
H(x)=3.5
dokładnie.Podziękowania dla Jasona S., którego odpowiedzi w zasadzie użyłem hurtowo. Ta
ii
sztuczka jest cudowna.źródło
print
spacje, zamiast je dodawaćC - 65
Nadużycie komentarzy :)
Z tego powodu nowe linie są ważne, a kod należy dołączyć w następujący sposób:
źródło
CJam, 24 bajty
Jeśli zostanie uruchomiony pięć razy, wydrukuje, że Liz była dla mnie OK . Przepraszam, nie zawiera interpunkcji.
Jak to działa
źródło
Pyth , 32
Fraza: „To przez linę”.
Entropia: 3.5
Jak to działa:
p
oznacza wydruk z określonym separatorem.Pierwszy argument
?kqZ4d
, daje separator.?kqZ4d
środkik if Z==4 else d
.k
jest''
, podczas gdyd
jest' '
.Drugi argument, wartość do wydrukowania, jest generowany przez podział (
P
) na spację (d
) i indeksowanie do tej listy (@
) wZ
.Wreszcie,
Z
która jest automatycznie inicjowana na 0, jest zwiększana o 1 (~Z1
).źródło
Golfscript, 53
Ten był zabawny.
Fraza: „Nie jesteś kaczką”. (co jest całkowicie prawdziwe; entropia 3.5110854081804286)
Wyjaśnienie:
Stos rozpocznie się jak
''
przy pierwszym „uruchomieniu” (ponieważ nie podano STDIN).'1'
s są dołączane do tego, aby wskazać, ile razy kod został wklejony.Co dzieje się przy drugim uruchomieniu:
I tak dalej.
„Ale”, myślisz, „jak sprawić, by cyfry 1 nie generowały?” Ach, to jest zabawna część hacky. Implementuje Golfscript
puts
(który jest wywoływany po zakończeniu programu) w następujący sposób:Po prostu zmieniłem to na
W ten sposób
1
s są pomijane na końcowym wyjściu.źródło
J - 42 char
Mógłbym wybrać krótszą frazę, ale dlaczego? To nie byłby mój ulubiony.
Działa to z powodu dualności monady / dyady J.: każdy czasownik może być przywołany jako monada - z jednym argumentem po prawej stronie - lub jako diada - z argumentem po lewej, a drugi po prawej.
Rozważ następującą sesję z J REPL:
Tam
,
jest traktowany jak diada, ponieważ znajduje się pomiędzy dwoma argumentami i(#~1=6|#\)&.;:
jest monadą, ponieważ nie ma żadnego argumentu. Gdybyśmy mieli czasownik, który mógłby zachowywać się tak, jakby był,
dyadyczny i(#~1=6|#\)&.;:
monadyczny, bylibyśmy nastawieni.Jak już zapewne się domyślacie, taka koniunkcja istnieje i wygląda na to
:
. Monadycznyf :g
jest równoważnyf
i gdy jestg
dyadyczny. To rozwiązuje problem.Przykłady, które możesz wypróbować na stronie tryj.tk :
I tak, natura odwrotności
;:
powoduje, że nie ma żadnych spacji końcowych.Stosując
It is by a rope.
jako wyrażenie daje 35 char:(#~1=6|#\)&.;: :,'It is by a rope.'
. Nie potrzebujemy tylnego miejsca, jak w przypadku mojego zdania, z tajemniczych;:
powodów.źródło
BBC Basic, 40
Obejmuje jedną nową linię. Wyniesie 30, jeśli słowa kluczowe można uznać za tokeny zamiast ASCII.
Przyłapałem swoją dziewczynę śpiącą z mleczarzem, więc ją rzuciłem i śpię z siostrą z zemsty.
As my ex do I!
(pięć dwuliterowych „słów” z unikatowymi znakami) nie wystarczyło entropii, więc na końcu dodałem wymyślną buźkę, aby entropia miała dokładnie 3,5. W końcu mam dość normalne życie, a nie jakąś dziwną fabułę telenoweli.Powtarzamy program 5 razy
Wykonywane jest tylko 5
READ
instrukcji, a pierwsze 5 elementów danych jest odczytywanych z pierwszejDATA
instrukcji. reszta danych jest zbędna. Wydajność:źródło
Ruby, 50
Wykorzystuje własną długość do określenia liczby słów do wydrukowania. Jej powtórzenia są inaczej ignorowane przez kończąc w komentarzu charakteru
#
. Fraza zapożyczona z bitpwnera : bardzo wygodnie jest mieć krótką frazę z taką samą liczbą liter w każdym słowie.Ponieważ każde słowo + końcówka ma 4 znaki, formuła byłaby np. Dla programu o długości 56:
(File.size($0)/56)*4 - 1
ale mogę podzielić z wyprzedzeniem56/4 = 14
, więcFile.size($0)/14 - 1
oszczędzam kilka znaków.50
nie jest wielokrotnością4
, ale12
jest wystarczająco zbliżony do potrzebnego zasięgu.źródło
Chip , 165 + 3 = 168 bajtów
+3 za flagę
-w
„Wygrałem czerwony kolor” (3.5) (właściwie nie wygrałem żadnej takiej rzeczy) (... jeszcze)
Zwróć uwagę na końcowy znak nowej linii, więc konkatenowana kopia pojawia się poniżej istniejącego kodu.
Wypróbuj online! (oryginał)
Wypróbuj online! (oryginał plus wszystkie cztery kopie)
To jest trochę splątany bałagan. Okazało się, że najtrudniejszym elementem był warunek zakończenia. (Moja pierwsza iteracja wypisała słowo (a), a następnie niekończący się strumień pustych bajtów ...).
Jak to działa
Pierwsza fraza:
12 unikalnych znaków + 4 spacje = dokładnie 3,5 entropii.
I kod:
Każda kopia drukuje pierwsze słowo, a następnie informuje kopię poniżej, aby wydrukować następne słowo. Jeśli jest tylko jedna instancja, nie ma drugiej kopii, więc nie jest drukowane nic oprócz pierwszego słowa.
Jeśli są dwie kopie, obie wydrukują jednocześnie pierwsze słowo (bajty są LUB połączone razem, więc jest w porządku), to tylko druga kopia wydrukuje drugie słowo.
Jeśli wszystkie pięć kopii jest obecnych, wszystkie wydrukują pierwsze słowo itp., A piąta kopia sama wydrukuje ostatnie słowo.
Obwód zakończenia zakończy program, gdy tylko wszystkie kopie nie zaczną drukować aktywnie.
źródło
Ruby, 63
źródło
Perl, 37
Podobne do tego, co miał wszechstronny, ale wykorzystując qw Perla, aby uratować jeszcze kilka znaków.
źródło
Długość wiadomości Rebmu + 27
Gdybyśmy poszli z „My IQ to nie ja!” byłoby 43. Ale popieram tę wiadomość:
Odpowiednik Rebol / Red:
Rebol ma 3 podstawowe warunki: JEŻELI, JESZCZE i UNLESS. JEŻELI jest równoważne JEŻELI NIE, ale może być bardziej jasne: „Zawsze wykonuj następujące czynności, JEŚLI ten warunek jest spełniony”.
W tym przypadku warunkiem jest sprawdzenie, czy symbol S otrzymał wartość w bieżącym kontekście. Musimy użyć cytatu, ponieważ próba użycia niecytowanego S w wyrażeniu warunkowym oceniłaby go i prawdopodobnie spowodowałaby błąd. (
value?
domyślnie nie cytuje swojego parametru, ponieważ możesz chcieć, aby sprawdzany symbol był w zmiennej, np.sym: 's
wtedyif value? sym [...]
faktycznie sprawdziłby, czy S został zdefiniowany, a nie SYM)Tylko pierwsza pasta programu przypisze serię ciągów do S. Kolejne wklejenie zabierze ciąg z nagłówka szeregu i przekaże go do opcji DRUKUJ / TYLKO, która wypisze swój argument bez dodawania wiersza.
(Uwaga: DRUKUJ / TYLKO to sugerowany sposób zastąpienia powiedzenia PRIN, który jest rozważany w Rebol 3 i Red; zastępowanie wydruku jest obecnie testowane w Rebmu.)
źródło
AHK , 44 bajty
Zwróć uwagę na nowy wiersz na końcu. Jedyną sprytną rzeczą jest to, że ciąg składa się z trzech liter, więc nie musimy niczego dzielić. Zamiast tego po prostu pobieramy podciąg na podstawie
i
. Dane wyjściowe są wyświetlane na aktywnym ekranie, tak jakby zostały wpisane na klawiaturze.źródło
JavaScript (53)
Wziąłem tekst z aditsu, ponieważ nie robię z nim nic fantazyjnego, więc wybrane słowa są nieco nieistotne dla rozwiązania (z wyjątkiem liczby bajtów).
Czy
alert
w tym przypadku się liczy? Edycja: Czytanie reguł prawdopodobnie tak nie jest, ponieważ nie łączę ciągów ze spacjami. Dodam spacje, aby było sprawiedliwie.Należy również pamiętać, że
var
w tym przypadku koszt jest rzeczywiście istotny.źródło
var i|=0;
NIE działa tutaj?|=
ani nic podobnegovar
. Bez tegovar
dostanieszReferenceError: i is not defined
.var i=i|0
rozwija sięvar i=undefined|0
iundefined|0
najwyraźniej0
.var i=i|0
jest równoważne zvar i;i=i|0
. Dlatego nie pojawia się błąd odniesienia. Powodem, dla którego zostanie ustawiony na 0 za pierwszym razem, jest to, co powiedział @ nyuszika7h.Perl, 43
56Akceptuję, że nie mogę wygrać tego. Moja oryginalna próba wyjaśnia, dlaczego:
źródło
Lua, 77
Dość proste rozwiązanie:
(H (X) = 4,23)
źródło
JavaScript, 138
(dodatkowy znak nowej linii został dodany wyłącznie w celu zapewnienia czytelności)
Wydruki
I'll sleep when I'm dead
. Używa timera, aby mieć pewność, że wydruk zostanie wydrukowany tylko razźródło
Pure Bash, 51 bajtów
H (X) = 3,59447
Można to nieco pograć w golfa, kłusując jedną z krótszych fraz, ale chętnie trzymam się najsłynniejszego cytatu
KartezjuszaLennona. (Przepraszam @Descartes, ale wszystkie słowa muszą być unikalne).Wydajność:
Dba o wstawianie spacji między słowami, ale nie ma spacji początkowych ani końcowych.
Opiera się na tym, że w bash zmienne niezdefiniowane, gdy są rozwijane jako łańcuchy, mają wartość „”, ale gdy są interpretowane arytmetycznie, mają wartość 0.
źródło
!
teraz - wydaje się, że załatwi sprawę .PHP
8978 charJest trochę gadatliwy i zdecydowanie nie wygra, ale i tak było fajnie. Oto co wymyśliłem
Wyrażenie:
code golf is pretty fun
Entropia = 3,82791
Kod:
Gra w golfa:
źródło
Python3 - 122 bajty
Otwórz drzwi wnęki na kapsuły [HAL]
Myślę, że zarobię na tym nerd. Gdyby tylko pytanie pozwoliło na jeszcze jedno słowo ...
Mój program pobiera nazwę pliku (p.py jest podstawą) i sprawdza, ile razy nazwa podstawowa jest iterowana. Następnie pobiera plasterki z ciągu znaków
n
.n
jest liczbąp
s w nazwie pliku.Zaletą wyrażenia regularnego jest to, że program można wywoływać w dowolny sposób i nadal będzie on działał (pod warunkiem zmiany nazwy basename w kodzie): mój oryginalny program nazywał się golfed.py.
źródło
05AB1E , 21 bajtów (niekonkurencyjny)
Wypróbuj online!
Wykorzystuje:
Wyjaśnienie
źródło
“€í€Ü€…‚¿‹·“
heheStax , 24
Uruchom i debuguj
Cytat: Niektóre zwierzęta są bardziej równe.
źródło
SmileBASIC, 54 bajty
Wolałbym „Piasek można jeść”. ale to nie udaje się jakoś testu entropii. Oczywiście mogłem wybrać krótszą frazę, ale to jest nudne.
READ
Kluczowe odczytuje wartości zDATA
i zapisuje ją w zmiennej.READ
Ponowne użycie dostanie następny element i tak dalej.źródło
Pyth , 27 bajtów
Raz , dwa razy , trzy razy , cztery razy i pięć razy . Dołączanie po tym zaczyna powtarzać zdanie.
źródło