Zastanów się nad pytaniem napisanym zwykłym angielskim, którego odpowiedź zawiera dwa dość dokładne (ale potencjalnie sprytne) słowa lub frazy, które można oddzielić słowami „i”:
P: Jakie są dwie strony monety? Odp .: głowy i ogony
P: Jakie są najlepsze sposoby podróżowania? Odp .: samolot i plecak odrzutowy
P: Dlaczego kruk jest jak biurko? Odp .: ponieważ w obu występuje „b”, aw żadnym nie ma „n”
Cel
Napisz program, który przy normalnym działaniu generuje takie pytanie.
Kiedy każdy inny znak zostanie usunięty z programu, zaczynając od drugiego znaku, a wynik zostanie ponownie uruchomiony, wynik powinien być taki, jaki jest po lewej stronie „i” w odpowiedzi.
Kiedy każdy inny znak zostanie usunięty z programu, zaczynając od pierwszego znaku, a wynik zostanie ponownie uruchomiony, wynik powinien znajdować się po prawej stronie „i” w odpowiedzi.
(Same „i” nie są generowane.)
Przykład
Jeśli program jest
A1B2C3D4E5F6G7H8I9
a jego wynikiem jest
What are the two sides of a coin?
Wtedy wyjście ABCDEFGHI
powinno być heads
, a wyjście 123456789
powinno być tails
.
Zasady dotyczące pytań i odpowiedzi
- Możesz skorzystać z moich przykładowych pytań, ale zachęcam do samodzielnego przygotowania własnych.
- Pytanie i dwie części odpowiedzi:
- wszystko musi być wyraźne
- powinien być powszechnym gramatycznie znaczącym angielskim
- może zawierać tylko drukowalne ASCII (szesnastkowo od 20 do 7E)
- Idealnie byłoby, gdyby pytanie było pisane wielkimi literami i interpunkcyjne (ale odpowiedzi nie muszą być).
- Pytanie musi mieć co najmniej 30 znaków i entropię większą lub równą 3,5. (Wpisz ciąg, naciśnij oblicz , szukaj ostatniego H (X) .)
- Każda z dwóch części odpowiedzi (bez uwzględnienia
[space]and[space]
między nimi) musi mieć co najmniej 5 znaków z entropią powyżej lub równą 2. - Słowo „i” może pojawić się w obu częściach odpowiedzi.
Zasady dotyczące kodu
- Żaden z 3 fragmentów kodu nie może:
- zawierają komentarze lub inne elementy tradycyjnie ignorowane przez kompilator / interpreter (nie martw się o wstawienie dodatkowego średnika lub dwóch, ale jeśli uważasz, że to komentarz, prawdopodobnie tak jest)
- zamknij program w trakcie wykonywania
- Kod może zawierać dowolne znaki, w tym Unicode i niedrukowalne ASCII.
- Może mieć nieparzystą lub parzystą liczbę znaków.
- Dane wyjściowe trafiają do standardowego lub pliku lub cokolwiek wydaje się rozsądne. Brak danych wejściowych.
Punktacja
Ponieważ nie chcę zachęcać do gry w golfa, ale chcę jeszcze bardziej zachęcić do sprytnych odpowiedzi, punktacja będzie czymś pomiędzy zawodów w golfie kodowym i konkursie popularności:
Wynik = (upvotes - downvotes) - floor((bytes in code that outputs question) / 3)
Najwyższy wynik wygrywa.
(Użyj http://mothereff.in/byte-counter jako licznika bajtów.)
źródło
x0=00;;
. Świetne wyzwanie!00;
jest tradycyjnie ignorowany przez kompilator ...It may have an odd or even number of characters
Czy istnieje liczba znaków, które nie są nieparzyste, a nawet parzyste?Odpowiedzi:
JavaScript (148 bajtów)
Tworzy nonsensowne literały z efektem ubocznym tworzenia alertu * dla pytania. (podziały robią podobnie, ale tworzą alerty * dla każdej odpowiedzi).
Dzieli:
i
Pytanie:
What is the ideal breakfast???
Odpowiedzi:
bacon
iscrambled eggs
źródło
Brainfuck (437 znaków)
Muszę wyznać, że to mój pierwszy program, który robi coś sensownego. Program jest wysoce zoptymalizowany dla systemów o niskiej pamięci, ponieważ wykorzystuje tylko 4 lokalizacje pamięci.
Pytanie:
What are the two main groups of trees?
Odpowiedzi:
conifers
ibroadleafs
Główna pętla
Program składa się z głównej pętli (która tak naprawdę nie jest pętlą, ponieważ wszystkie bloki [] są wykonywane tylko raz) i dwóch sekcji.
Jeśli chcesz testować sekcje niezależnie, musisz wziąć pod uwagę główną pętlę. Lokalizacja 0 zawiera -1 w parzystej odpowiedzi, 1 w parzystej odpowiedzi i 2 w pytaniu.
Sekcja odpowiedzi
Parzysta odpowiedź (usunięte nieparzyste instrukcje):
Dziwna odpowiedź (nawet instrukcje usunięte):
Sekcja pytań
Postanowiłem przechowywać miejsce w oddzielnej lokalizacji, ponieważ jego wartość różni się drastycznie od innych postaci. Umożliwia to proste drukowanie miejsca
<.>
.Ostatnia aktualizacja
W mojej ostatniej aktualizacji zoptymalizowałem mnożenie, aby były używane minimalne instrukcje. Również włączenie „l” do drugiej grupy postaci w sekcji nieparzystych odpowiedzi okazało się ogromną poprawą. Oszczędności na pojedynczym znaku w odpowiedzi nieparzystej w zasadzie oznaczały dwa znaki z całego programu, ponieważ zmniejszają również dopełnianie od parzystej odpowiedzi. Usunąłem też kilka niepotrzebnych instrukcji tu i tam i nie sądzę, żebym mógł dalej optymalizować kod.
źródło
Partia - 84
Całkiem dumny z tego
Pełny program: Jakie są dwie strony monety? (konsola)
Tylko Evens: głowy (plik „c”)
Tylko kursy: ogony (plik „x”)
Działa poprzez przekierowanie wyjścia błędu do pliku w obu przypadkach.
źródło
Python -
10496 (gra w golfa: 76)Moje rozwiązanie jest raczej proste (i jakoś czytelne):
Wydajność:
Szczerze mówiąc, znalazłem pomysł na pierwszą linię w odpowiedzi Bitpwnera.
Jeszcze bardziej czytelna alternatywa: -
11310597Jeszcze krótsza alternatywa: -
8676źródło
zebra
. I ładnie pasuje do wersji „golfowej” z pytaniem dokładnie 30 znaków. W ten sposób nieznacznie zmodyfikowałem swoje rozwiązanie. :)Rebmu : 79 znaków LUB (37 + długość (p1) + 2 * max (długość (p2), długość (p3)))
Najpierw dam 79-znakowe rozwiązanie, które pyta, jakich języków musisz się nauczyć? (entropia 4.0, z wyłączeniem 30 liter
?
) i oferuje sugestie Rebola i [czerwonego] :Unikalna taktyka dostępna tutaj, która nie jest w innych językach, wynika z faktu, że nawiasy klamrowe są asymetrycznym ogranicznikiem łańcucha, który może legalnie zagnieżdżać się:
To pozwoliło mi stworzyć uogólnione rozwiązanie, które może bez wysiłku działać na każdym programie, który nie używa sekwencji specjalnych. Wersja z 79 znakami była na tyle prosta, że można ją było skrócić, ale aby poprawnie zawierać dowolne źródło programów dla programów p2 i p3, potrzebny byłby pełny szablon. Gdybyśmy tego użyli, byłoby 87 znaków:
Wzorzec używania tej ogólnej formy jest taki, że jeśli masz trzy źródłowe teksty kolejnych znaków o różnych długościach (użyjmy przykładu
AAA
:BBBBB
,CCCCCCC
) można zakodować je jako coś wzdłuż linii:(Uwaga: Chociaż ten wzorzec nie będzie działał bez poprawiania programów używających znaków zmiany znaczenia, nie jest to poważna wada. Uzyskanie niedopasowanego lewego nawiasu w ciągu ograniczonym nawiasami wymaga czegoś takiego jak
{Foo ^{ Bar}
... ale można łatwo przepisać to za pomocą alternatywna notacja strun"Foo { Bar"
i połączone przypadki mogą być zarządzane przez sklejenie ze sobą mieszanki strun nieskalowanych).Więc ... a może przykład? Po udostępnieniu ogólnej formy, ten program znaków 573 został złożony w zaledwie kilka minut z 3 wcześniejszych rozwiązań golfowych:
Jeśli nie zmodyfikujesz programu, jest to rozwiązanie Hourglass .
Jeśli weźmiesz tylko nieparzyste postacie i uruchomisz je, zrobi to wydrukuje 99 butelek poematu z piwem
Tylko parzyste postacie wykonają dla ciebie małą konwersję cyfr rzymskich .
Jeśli ktoś chce spróbować napisać ten program w wybranym przez siebie języku i myśli, że może pokonać 573, daj mi znać. Jeśli to zrobisz, nagrodzę cię dużą reputacją - zakładając, że twoim językiem nie jest Rebmu, ponieważ wiem, że te programy nie są minimalne. :-)
To „marnotrawstwo” odstępów, które dostajesz na końcu, dzieje się, gdy p2 i p3 mają niezrównoważone długości. Ale wszystkie 3 programy mają w tym przypadku różne rozmiary, więc nie ma szczególnie dobrego parowania do wyboru dla p2 / p3. (Wybrałem je, ponieważ nie było danych zewnętrznych jako danych wejściowych, takich jak labirynt itp., Nie dlatego, że miały one podobną długość. Chociaż mogłem napisać nowe programy, które byłyby bardziej optymalne, spędziłem wystarczająco dużo czasu i chodziło o ty nie trzeba pisać nowych programów ...)
Jak to działa
(Uwaga: zacząłem od bardziej „kreatywnego” podejścia, które nie było tak usprawnione, ale bardziej interesujące. Przeniosłem je do wpisu na moim blogu, ponieważ opisywanie tego podejścia jest już długie).
Kluczem tutaj jest sztuczka „eval code as a string”, podobnie jak niektóre inne wpisy, ma ona tylko kartę atutową asymetrycznego ogranicznika łańcucha. Zacznę od wyjaśnienia działania przypadku 80 znaków.
Oto „cały” program, dostosowujący białe znaki do czytelności tego przypadku:
Tutaj kończymy ustawianie DD na synonim DO (aka „eval”). Ale sztuczka polega na tym, że gdy uruchomione zostaną połówki programów, uruchamiają kod, którego jedynym efektem jest zdefiniowanie D na nieszkodliwym literale 1.
Oto, co robi kod nieparzystych znaków, ponownie dostosowuje białe znaki:
A oto kod parzystych znaków:
W rzeczywistości w przypadku programu bez połówek program
dd {dd {(arbitrary code)qt}}
wykona dowolny kod. Istnieją jednak dwa wezwania do oceny zamiast tylko jednego. Jest tak, ponieważ podczas gdy zagnieżdżone nawiasy klamrowe działają świetnie w przeplecionym kodzie, zaburzają one ewaluacyjne zachowanie DO. Dlatego:Załaduje ciąg jako program, ale ten program kończy się jako ciąg stały
{print "Hello"}
. Zatem sztuczka, której tu używam, polega na wzięciu mojego DD (zachowującego tę samą wartość funkcji co DO) i uruchomieniu go dwa razy. Połówki żują różne części sznurka, ale nie żują obu, jeśli parzystość / nieparzystość jest poprawna dla zawartości, a ponieważ to, co pozostało poza sznurkiem po połówce, jest tylko stałą stałąd
, są nieszkodliwe.Przy takim wzorcu pisanie zachowania programu nie jest wyzwaniem, gdy nie jest ono przecięte na pół - możesz wstawić wszystko, o ile długość znaków w kodzie jest parzysta (nieparzyste, jeśli liczysz QT, czyli QUIT). Jeśli potrzebujesz uzyskać parzystą liczbę z nieparzystej, wrzuć spację (tak naprawdę w mojej formule powyżej na p1 znajduje się +1 dla nieparzystych długości programu p1) . Wydaje się, że sztuczka polega na napisaniu kodu z przeplotem, który musi przejść przez analizator składni, jeśli nie jest podzielony na pół. (Nie zostanie uruchomiony z powodu QT, ale musi być ŁADOWALNY, zanim zostanie wykonany).
Ta sprawa jest trywialna;
pp
ładuje się dobrze jako symbol, mimo że jest niezdefiniowany, i jest podzielony nap
druk w każdym programie połówkowym. Ale możemy zrobić kolejną sztuczkę, ponownie używając literału łańcuchowego. Połówki programów nadal mają DO zdefiniowane normalnie, więc moglibyśmy również powiedzieć:Ponieważ jedyną częścią wybraną przez analizator składni w całym przypadku jest słowo symboliczne
ddoo
i literał łańcuchowy, możemy następnie przeplatać dowolne dwa programy, które chcemy w tym łańcuchu literalnym, i nie gniewać parsera. Połówki wersji powiedzą tylko:..i...
Jak mówię, ta część wygląda znajomo na inne rozwiązania, które traktują programy jako ciągi znaków i je ewaluują. Ale w przypadku konkurencji, gdy pakowane programy zawierają zagnieżdżone ciągi znaków, to rzuca za nie klucze. Tutaj jedyne rzeczy, które wpędzą cię w kłopoty, to ucieczka przez carets (
^
) ..., którą można łatwo obejść.(Mała uwaga „oszukująca”: dodałem QT do „QUIT” w odpowiedzi na ten problem. Właściwie wcześniej celowo usunąłem skrót dla quit… ponieważ jakoś myślałem, że to jest dobre tylko do użycia na konsoli i po prostu biorąc dwuliterowe spacja, jeśli nie było go w REPL. Dodam go, ponieważ widzę, że się myliłem, nie dodając go w tym przypadku w szczególności. Jednak przed tą zmianą byłoby o 2 znaki dłużej. Ponadto, kiedy po raz pierwszy opublikowałem rozwiązanie, w Rebmu wystąpił błąd, który uniemożliwiał jego faktyczne działanie, mimo że powinien mieć ... teraz działa.)
źródło
Perl
186139135Jakie są najlepsze rzeczy w życiu?
zmiażdżyć swoich wrogów
usłyszeć lamenty ich kobiet
Korzystanie z krótszych odpowiedzi:
Perl
7972What are my preferred weapons?
(30 bajtów, H (X) = 3,76)swords
(H (X) = 2,25) imaces
(H (X) = 2,32)źródło
Python -
139103What are the ingredients for success?
->Unicorns
iRainbows
Test:
Stara wersja:
źródło
Haskell, 117
Konieczność pracy z paradygmatem funkcjonalnym Haskell oznacza, że wszystko musi być przypisane do zmiennej lub skomentowane komentarzem liniowym
--
lub blokowym{- -}
; uruchamianie bezsensownych funkcji bez przypisania jest wyłączone. Aby zachować rozsądek, zadałem pytanie i odpowiedzi tak krótkie, jak pozwalają na to reguły.Pytanie: Czego nie mam dość?
„Buty” i „ciastka”:
NB Pojawienie się
crank
pod „Czego nie mam dość?” nie powinny być postrzegane jako znaczące.źródło
Wa
jest w komentarzu do bloku, więc nie, to właściwie nie jest anpttLWa.Lisp (76 znaków)
31-znakowe pytanie, 6 znaków w każdej odpowiedzi ⟹ długość - ładunek = 33
Chciałem użyć „Jaki jest twój ulubiony kolor?”, Ale nawet rozciągnięty na pisownię brytyjską, osiągnął on jedynie minimum 30 znaków dla długości pytania i potrzebowałem pytania o nietypowej długości, aby zrównoważyć podwójne cudzysłowy.
Mówi się, że Common Lisp jest gadatliwy, ale nie pomyślałbyś, że tak będzie. To nawet nie jest bardzo zaciemnione, wystarczy wstawić odrobinę spacji, aby zobaczyć, co jest cytowane i co jest wykonywane.
Wiele implementacji Lisp wykrzykuje kolory, ponieważ wypacza symbole na wielkie litery. Jeśli ci to przeszkadza, zmień
''fmuacghesnitaa
na""fmuacghesnitaa""
.źródło
STATA 295
Pytanie: Jakie są najlepsze desery do wypieku w tej chwili? Odpowiedź: ciasteczka i ciasteczka.
Objaśnienie: Polecenia w STATA są ograniczone nowymi wierszami.
Podczas gdy „//” jest komentarzem w STATA, „///” informuje kompilator o przejściu do następnego wiersza i dołączeniu jego zawartości do bieżącego polecenia.
Polecenia w STATA można często skracać do tego stopnia, że uważa się je za wystarczająco unikalne, aby można je było rozróżnić (więc „generuj” staje się „g”, „globalny” staje się „gl” lub „glo”, „przechwytywanie” staje się „cap”, „ display „staje się„ di ”itp.). Polecenie display wyświetla tekst na ekranie. Polecenie przechwytywania rejestruje wszystkie błędy (w tym błędy składniowe), dlatego ten program poprawnie się kompiluje.
Myślę, że jeśli chcesz być wybredny, wszelkie dodatkowe „/” po pierwszych 3 kolejnych w linii są ignorowane przez kompilator. Ponadto w programie „ciasteczka” technicznie + „” jest komentarzem. Ale twierdzę, że nadal się liczy, ponieważ polecenie przechwytywania nadal uczyniłoby go nieistotnym, nawet gdyby nie był komentarzem.
Dziękuję za przeczytanie mojego naprawdę długiego wyjaśnienia. Teraz kod:
„Jakie są najlepsze desery do wypieku?”
„ciasteczka”
"ciasteczka"
źródło
Ksh (82 znaków)
35-znakowe pytanie, 5 znaków w każdej odpowiedzi ⟹ długość - ładunek = 37
Nadużywam składni definicji funkcji poza POSIX. Dash i bash nie mogą tego zrobić, ale ksh (domena publiczna lub ATT) może.
Nie dzieje się nic niezwykłego, tylko echo. Nie marnuj nie chcij.
źródło
PowerShell 88
Jaki jest mój ulubiony sprzęt? (30 znaków, H (X) = 4,0314)
miecz (5 znaków, H (X) = 2,32193)
tarcza (5 znaków, H (X) = 2,58496)
W pełnym programie przekierowuje puste ciągi do nieistniejącej zmiennej
${x}
(cudzysłowy dla tych pustych ciągów są używane do utworzenia nonsensownego ciągu, który jest przekierowywany do pustego bloku{}
lub nieistniejącej zmiennej$x
w wersjach parzystych / nieparzystych), a następnie drukuje pytanie i deklaruje 2 nieużywane zmienne (które są drukowane i umieszczane obok innej nieużywanej zmiennej$XXXXXX
lub$XXXXXXX
w różnych przypadkach).źródło
GolfScript, 51 bajtów
Wydajność
Jak to działa
.;
duplikuje ciąg i usuwa kopię.""
wypycha pusty ciąg.thaeialdss
jest niezdefiniowany, więc nic nie robi.Dziwne znaki
Wydajność
Jak to działa
;
usuwa pierwszy ciąg ze stosu.Nawet znaki
Wydajność
Jak to działa
Wihaetesdso
ion
są noops..
duplikuje pusty ciąg na stosie.źródło