Czy kiedykolwiek chciałeś zapytać kompilatora „Dlaczego?” Większość z nas była sfrustrowana, gdy kod nie działa tak, jak powinien. Mathworks wdrożył więc ładną małą funkcję why
, która odpowiada na pytanie. Aby podać kilka przykładów z MATLAB:
why
The programmer suggested it.
why
To fool the tall good and smart system manager.
why(2)
You insisted on it.
why(46)
Bill insisted on it.
Twoim zadaniem jest wdrożenie why
funkcji w Twoim języku. Funkcja powinna działać z argumentem wejściowym i bez niego (alternatywnie użyj danych wejściowych 0
lub -1
). Funkcja musi zostać nazwana why
(lub napisanie why(n)
w STDIN powinno spowodować wydrukowanie odpowiedniego łańcucha).
Jeśli nie podano żadnego argumentu lub argument jest zerowy lub ujemny, ciąg wyjściowy powinien być losową, prawidłową frazą. Więc nie powinno być funkcją why
, why()
, why(0)
lub why(-1)
że zwraca losowego zdania.
Jeśli podano argument wejściowy n
(argument funkcyjny, a nie STDIN), wynik powinien być n-tym ciągiem (zdefiniowanym poniżej). Dlatego why(1)
zawsze powinien wypisywać (drukować / wyświetlać) ten sam wynik.
Zdania są budowane w następujący sposób (Typ 1, Typ 2 i Specjalne). Wszystkie zdania kończą się na !
.
"Person" "ending" !
"Verb" "adjective" "Person" !
A list of special cases
Lista osób:
Stewie
Peter
Homer
The programmer
The system manager
You
Lista zakończeń:
suggested it
insisted on it
did it
Lista czasowników to:
To fool
To satisfy
To please
Lista przymiotników:
the smart
the bald
the tall
the rich
the stupid
Lista przypadków specjalnych:
How should I know?
Stop asking!
Don't ask!
Sposób na wybranie numeru jest:
Rodzaj zdań:
Odd number => Type 1
Even number => Type 2
n % 7 = 0 => Type 3 (% is the modulus operator)
Nazwy: n-ta nazwa jest definiowana za pomocą modułu (%).
n = 1: 1 % 7 => Stewie
n = 2: 2 % 7 => Peter
...
n = 6: 6 % 7 => You
n = 7: 7 % 7 => How should I know?
n = 11: 11 % 7 => The programmer
n = 14: 14 % 7 => Stop asking!
n = 21: 21 % 7 => Don't ask!
Zakończenia: n-te zakończenie jest również definiowane za pomocą modułu. Załóżmy, że zakończenia (1, 2 i 3) są wymienione podobnie (1 2 2 3)
. Ponieważ liczby są zawsze nieparzyste, użyj((n+1)/2 % 4)
n = 1: ((1+1)/2 % 4) => suggested it
n = 3: ((3+1)/2 % 4) => insisted on it
n = 13: ((13+1)/2 % 4) => did it
Przymiotniki: n-ty przymiotnik definiuje się za pomocą modułu. Ponieważ liczby są zawsze parzyste, użyj:(n % 10)/2
n = 2: (2 % 10)/2 => Smart
n = 6: (6 % 10)/2 => The tall
...
Czasowniki: n-ty czasownik jest również definiowany za pomocą modułu. Załóżmy, że czasowniki (1, 2 i 3) są wymienione tak, (1 2 2 3)
jak w przypadku czasowników, więc zawsze używaj liczb(n % 8) / 2
n = 2: (2 % 8)/2 => To fool
n = 4: (4 % 8)/2 => To satisfy
n = 6: (6 % 8)/2 => To satisfy
n = 8: (8 % 8)/2 => To please
Teraz sposób utworzenia losowego powinien być dość prosty, wystarczy wybrać losowy n
.
Kilka przykładów:
why
You suggested it!
why
To fool the tall Homer!
why
Don't ask!
why(1)
Stewie suggested it!
why(14)
Stop asking!
why(8)
To please the rich Stewie!
Obowiązują standardowe zasady gry w golfa. Zwycięzca zostanie wybrany tydzień po opublikowaniu wyzwania.
why
czy byłobyWHY
do przyjęcia?/2
działać. To daje wartości ułamkowe.13
powinno być równieżinsisted
(14/2 = 7% 4 = 3 = 2 z naleganych).the rich The programmer
powodu określonegothe
?The
iTo
listy powinny byćOdpowiedzi:
JavaScript (ES6) 345
Nie jestem pewien co do liczb, ale oto moja próba.
Przetestuj poniższy fragment kodu w przeglądarce zgodnej z EcmaScript.
źródło
0
jako separatora ciągu zamiast,
!split(0)
ma taką samą długośćsplit','
(udawaj, że to backticks)C #, 502 bajtów
Ten projekt musi mieć AssemblyName zestaw do dlaczego która będzie produkować wykonywalny z poprawną nazwą.
W pełni golfa:
Wcięcia i nowe linie dla przejrzystości:
Przykładowe wejście / wyjście:
źródło
PowerShell
437461453 bajtówEdycja: pominięto zduplikowane czasowniki
Podział między ciałem a obliczeniami dla liczby bajtów
to
,the
,it
i!
ponieważ mają stałe miejsca).Ustawia domyślny argument na 0, jeśli nie został określony. Jeśli argument jest
<1
taki, otrzymuje losową liczbę<99
fn:1
i uruchamia się ponownie. Technicznie oznacza-50
to również, że będzie działać jako przypadek.Wyjaśnienie:
fn:1
99 Wybrano, aby zapisać bajt. Jeśli jest więcej niż 99 możliwych zdań powyżej (nie obliczono), zwiększ odpowiednio do 999 lub 9999 (+1/2 bajtów)źródło
MUMPS, 379 bajtów
Gdy nie podano danych wejściowych, generowana jest liczba losowa w 0..839.
Stosowanie:
Strategia oceny od lewej do prawej MUMPS pozwala zaoszczędzić kilka dobrych bajtów w nawiasach.
Uwaga dodatkowa: widzisz te ciągi, które wyglądają
"foo^bar^baz^qux"
? Są to tak zwane „łańcuchy rozdzielane” i są standardowym sposobem przechowywania list, które mieszczą się w limicie maksymalnego rozmiaru łańcucha, ponieważ MUMPS tak naprawdę nie ma list / tablic (a nawet żadnych struktur danych oprócz drzew). W przypadku list zbyt dużych, aby zmieściły się w jednym ciągu, zamiast tego używamy drzew o głębokości 1 i umieszczamy wartości na liściach drzewa. Zabawa!źródło
why
funkcji. ;)Emacs Lisp 473 Bytes
Największy „odpady” to prawdopodobnie
format
,%s
... sekcje. Jeśli zmienne mogłyby zostać wstawione do ciągów bez specyfikacji, zapisałoby to 10 bajtów%s
i kolejne 12format
źródło
Rubinowy
396378372 bajtówJestem pewien, że nie gra w golfa na maksa.
Edycja: Właśnie zdałem sobie sprawę, że nie znam pierwszeństwa operatora. No cóż..
źródło
CJam, 281 bajtów
Permalink
Nie korzystałem wcześniej z CJam, więc wezmę jakieś wskazówki. Jestem pewien, że jest wiele sztuczek, których nie znam!
(Nie mogłem wymyślić, jak nazwać to jako funkcję o nazwie „dlaczego” - wygląda na to, że funkcje nie istnieją w CJam - więc nie jestem pewien, czy odpowiedź CJam jest dobra, czy nie ...)
źródło
Lua 5.3.0,
452460446 bajtówTo moja pierwsza próba gry w golfa kodowego, więc popraw mnie, jeśli zrobiłem coś złego!
Nie golfowany:
źródło
Python (2), 692 bajty
Wciąż się uczę, więc proszę, bądź delikatny! :)
Działa z lub bez int jako argument wiersza poleceń.
Starałem się podkreślać poprawność kodu tak bardzo, jak to możliwe, jak przy generowaniu liczb losowych od
-sys.maxint - 1
dosys.maxint
i wyświetlaniu zdań w odpowiednim przypadku.Kod w dużej mierze opiera się na instrukcjach if, które z pewnością mogłyby zostać zastąpione przez coś bardziej wydajnego pod względem miejsca.
Informacje zwrotne są bardzo mile widziane!
Niegolfowany (1341 bajtów)
źródło
argument%8/2-1
i usuń drugi. Można również wymienić==0
się<1
.