Opis
Liczby Chicken McNugget to liczby, które można wyrazić jako sumę 6, 9 lub 20 - początkowe rozmiary słynnych pudełek Chicken McNuggets sprzedawanych przez McDonald's. W tej sumie liczba może wystąpić więcej niż jeden raz, podobnie 6 + 6 = 12
jak liczba taka, a liczba musi „zawierać” co najmniej jeden z wymienionych rozmiarów. Pierwsze numery Chicken McNugget to:
6
9
6 + 6 = 12
6 + 9 = 15
9 + 9 = 6 + 6 + 6 = 18
20
6 + 6 + 9 = 21
...
Wyzwanie
Twoim zadaniem jest napisanie programu lub funkcji, która przy dodatniej liczbie całkowitej określa, czy tę liczbę można wyrazić w opisany sposób, dlatego jest to taka liczba Chicken McNugget. Powinien następnie wygenerować wartość prawdy lub fałszu na podstawie swojej decyzji.
Przypadki testowe
6 -> true
7 -> false
12 -> true
15 -> true
21 -> true
40 -> true
42 -> true
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach i obowiązują standardowe luki!
code-golf
number
decision-problem
racer290
źródło
źródło
Odpowiedzi:
Python, 27 bajtów
Wypróbuj online!
źródło
~
ponieważ możesz zamienić dane wyjściowe.8953174650303
ma dokładnie taką samą długość z0x82492cb6dbf
(choć mniej czytelny).Python 3 , 24 bajty
Wypróbuj online!
Wyjaśnienie
Z
6
i9
spokoju, można dokonać wszystkich liczb całkowitych podzielnych przez3
które są większe niż3
, jak to stwierdził w komentarzu OVS na wyzwanie . Zakłada się, że można również zrobić0
. Podsumowując, można zrobić0,6,9,12,15,...
.Z jednej instancji
20
, można zrobić:20,26,29,32,35,...
.Z dwóch wystąpień
20
, można zrobić:40,46,49,52,55,...
.Trzy przypadki nigdy nie są konieczne, ponieważ
3 x 20 = 10 x 6
.Zauważ, że przypadki, w których nie
20
jest to konieczne, można również podzielić przez 3; przypadki, w których jeden20
jest potrzebny, pozostawiają resztę2
; przypadki, w których20
potrzebne są dwa , pozostawia resztę1
.Liczba
20
potrzebnych może być zatem obliczona przez(-n)%3
. Następnie robimy,n-(((-n)%3)*20)
aby usunąć liczbę20
potrzebnych z numeru. Następnie sprawdzamy, czy ta liczba nie jest ujemna, ale nie jest3
.źródło
f=lambda n:n%3<1<n-2or n>20and f(n-20)
Czy to działa?f=
teraz, ponieważ nie jest rekurencyjny.Python 2 , 28 bajtów
Wypróbuj online!
źródło
(n%3,n/20)
z listy wykluczonych to{(2, 0), (1, 0), (1, 1)}
. Używanie-n%3
zamiast tego dawało nierównośćn/20>=(-n)%3
. Stamtąd{3,23,43}
błąkałem się, aby odwrócić, które są 3 mod 20 bez wpływu na 63,83, ... Znalazłem przesunięcie punktu końcowego nierówności dla tych, którzy działali najlepiej.Galaretka , 11 bajtów
Wypróbuj online!
Jak to działa
źródło
Haskell , 36 bajtów
Wypróbuj online!
Wyjaśnienie
To rozwiązanie jest tak proste, jak to tylko możliwe. Pierwszy wiersz deklaruje, że dla dowolnej liczby mniejszej niż 1 jest to liczba McNugget, jeśli
n==0
. To znaczy, że0
jest to liczba McNugget, a wszystkie liczby ujemne nie są.Druga linia deklaruje, że dla wszystkich innych liczb
n
jest liczbą McNugget, jeśli minus jeden z rozmiarów Nugget jest liczbą McNugget.Jest to dość proste wyszukiwanie rekurencyjne.
źródło
Python 3 ,
484642 bajtówWypróbuj online!
Przełączniki
True
iFalse
.źródło
True
iFalse
domyślnieGalaretka , 11 bajtów
Wypróbuj online!
Port mojej odpowiedzi w Pythonie , ale nieco zmodyfikowany: odejmij,
20
aż będzie podzielny przez3
, a następnie sprawdź, czy należy do0,6,9,...
niego, odwzorowując0
dane wejściowe (za pomocąor
), a następnie sprawdź, czy jest większy niż3
.Jedyne trzy liczby, które powstają
0
po ukończeniu pierwszego kroku, to0
,20
lub40
, przy czym pierwszy jest poza domeną, a reszta jest większa niż3
.źródło
Mathematica, 53 bajty
źródło
FrobeniusSolve
funkcji.Mathematica, 30 bajtów
Wypróbuj na Wolfram Sandbox.
źródło
Mathematica, 20 bajtów
Funkcja anonimowa. Pobiera liczbę jako dane wejściowe i zwraca
True
lubFalse
dane wyjściowe. Logika została skopiowana z odpowiedzi Dziurawej Zakonnicy , z dodatkowym nadużyciemInequality
.źródło
Kod maszynowy x86-64, 22 bajty
Powyższe bajty definiują funkcję w 64-bitowym kodzie maszynowym x86, który określa, czy wartością wejściową jest liczba Chicken McNugget. Pojedynczy dodatni parametr liczby całkowitej jest przekazywany do
ECX
rejestru zgodnie z 64-bitową konwencją wywoływania Microsoft stosowaną w systemie Windows. Wynikiem jest wartość logiczna zwrócona doEAX
rejestru.Mnemoniki do montażu bez golfa:
Oczywiście ma to duży wpływ na rozwiązanie Andersa Kaseorga w Pythonie , ponieważ opiera się na polu bitowym reprezentującym wartości, które są liczbami Chicken McNugget. W szczególności każdy bit w tym polu, który odpowiada prawidłowemu numerowi Chicken McNugget, jest ustawiony na 1; wszystkie inne bity są ustawione na 0. (Uważa to 0 za prawidłowy numer Chicken McNugget, ale jeśli ci się to nie podoba, twoja preferencja jest modyfikacją jednobitową).
Zaczynamy od załadowania tej wartości do rejestru. Jest to wartość 64-bitowa, która do kodowania zajmuje już 8 bajtów, a ponadto potrzebujemy jednobajtowego prefiksu REX.W, więc tak naprawdę jesteśmy dość rozrzutni w kategoriach bajtów, ale to jest sedno rozwiązania, więc Myślę, że warto.
Następnie przesuwamy pole w prawo o wartość wejściową. * Wreszcie, maskujemy wszystkie bity oprócz najniższego rzędu, i to staje się naszym wynikiem logicznym.
Ponieważ jednak nie można przesunąć o więcej niż rzeczywistą liczbę bitów wartości, działa to tylko dla danych wejściowych od 0–63. Aby obsługiwać wyższe wartości wejściowe, wstawiamy test u góry funkcji, która rozgałęzia się na dole wartości wejściowej to> = 64. Jedyne interesujące w tym jest to, że wstępnie ładujemy stałą pola bitowego
RAX
, a następnie rozgałęziamy aż do instrukcji, która maskuje bit najniższego rzędu, zapewniając w ten sposób, że zawsze zwracamy 1.Wypróbuj online!
(Wywołanie funkcji C tam jest opatrzone adnotacją, która powoduje, że GCC wywołuje ją przy użyciu konwencji wywoływania Microsoft, której używa mój kod zestawu. Gdyby TIO dostarczyło MSVC, nie byłoby to konieczne).
__
* Alternatywnie do zmiany moglibyśmy użyć
BT
instrukcji x86 , ale jest to 1 bajt dłuższy do zakodowania, więc nie ma przewagi. Chyba że byliśmy zmuszeni zastosować inną konwencję wywoływania, która nie przekazała wygodnie wartości wejściowej doECX
rejestru. Byłby to problem, ponieważSHR
wymaga, aby jego operand źródłowy służyłCL
do dynamicznego liczenia przesunięcia. Dlatego inna konwencja wywoływania wymagałabyMOV
edycji wartości wejściowej z dowolnego rejestru, do którego została przekazanaECX
, co kosztowałoby nas 2 bajty.BT
Instrukcja może wykorzystać dowolny rejestr jako argumentu źródłowego, kosztem tylko 1 bajt. W takiej sytuacji byłoby lepiej.BT
wstawia wartość odpowiedniego bitu do flagi carry (CF), więc użyłbyśSETC
instrukcji, aby uzyskać tę wartość w rejestrze liczb całkowitych, takAL
aby mogła zostać zwrócona do wywołującego.Alternatywne wdrożenie, 23 bajty
Oto alternatywna implementacja wykorzystująca operacje modulo i mnożenia w celu ustalenia, czy wartością wejściową jest liczba Chicken McNugget.
Korzysta z konwencji wywoływania AMD64 Systemu V , która przekazuje wartość wejściową do
EDI
rejestru. Wynikiem jest nadal wartość logiczna, zwrócona wEAX
.Zauważ jednak, że w przeciwieństwie do powyższego kodu, jest to odwrotna wartość logiczna (dla wygody implementacji). Zwraca,
false
jeśli wartość wejściowa to liczba Chicken McNugget lubtrue
jeśli wartość wejściowa nie jest liczbą Chicken McNugget.Brzydka w tym jest potrzeba jawnego obsługiwania wartości wejściowych> = 43 przez porównanie i odgałęzienie u góry. Istnieją oczywiście inne sposoby wykonania tego zadania, które nie wymagają rozgałęzienia, takie jak algorytm Caira coinheringaahing , ale kodowanie zajmie znacznie więcej bajtów, więc nie jest to rozsądne rozwiązanie. Myślę, że prawdopodobnie brakuje mi sztuczki, która sprawiłaby, że to zadziałałoby bardziej elegancko i było mniej bajtów niż powyższe rozwiązanie oparte na polu bitowym (ponieważ kodowanie samego pola bitowego zajmuje tak wiele bajtów), ale przestudiowałem to dla jakiś czas i wciąż tego nie widzę.
No cóż, spróbuj mimo to online !
źródło
05AB1E,
1716 bajtówWypróbuj online!
Wyjaśnienie
źródło
…
do łańcucha (istnieją buitins ciągów 1-, 2-, i 3-char, będąc'
,„
i…
odpowiednio). Mam wrażenie, że więcej można zagrać w golfa, być może stosując inne podejście, ale niezależnie od tego jest to miła pierwsza odpowiedź. +1 ode mnieÅœ
:… ÇIÅœåPOĀ
. Jest to zupełnie inne podejście, więc jeśli chcesz, żebym opublikował je jako oddzielną odpowiedź, niż twój golf, daj mi znać. PS: Nie jestem w 100% pewien, czy materiały niedrukowalne są dozwolone na stronie kodowej 05AB1E . W takim przypadku może być konieczne inne kodowanie, co sprawiłoby, że niektóre znaki byłyby liczone jako 2 bajty. W takim przypadkuŽBo21в
może być alternatywą dla bajtu +1.ŽGç₂в
zamiast ciągu, jednocześnie zapisując bajt w tym procesie.JavaScript (ES6),
6964 bajtówPokaż fragment kodu
Wyjścia
false
dla numerów Chicken McNugget,true
inaczej.źródło
n=>~'ABCDEFHIKLNOQRTWXZ]`cfl'.search(String.fromCharCode(n+65))
dla 63 bajtówJava,
215724 bajtówWypróbuj online!
Gra w golfa:
Nie golfowany:
źródło
26 = 20 + 6
.Python 2 , 51 bajtów
-1 bajt dzięki @LeakyNun
Wypróbuj online! Stopka drukuje wszystkie numery inne niż McNugget
źródło
n%3
może wynosić tylko 0 lub 1 lub 2, więcn%3==2
jest równoważne zn%3>1
.Pyth , 15 bajtów
Wypróbuj online!
Ciąg zawiera znaki odpowiadające punktom kodowym 6, 9 i 20.
źródło
Haskell,
6456 bajtówNie zrobiłem żadnych podstępów, ale patrząc na inne odpowiedzi, może być krótsze zaimportowanie
Bits
modułu i użycie tych metod. To podejście sprawdza się znacznie bardziej bezpośrednio.źródło
66
nie jest64
. Ale możesz zaoszczędzić wiele nawiasów ix/=0
ochronić się, aby zaoszczędzić trochę bajtów, patrz tutaj .JavaScript,
927872 bajtów* zapisano 14 bajtów dzięki @Jonasw
Wykorzystuje fakt, że „Wszystkie liczby całkowite są liczbami McNugget z wyjątkiem 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31, 34 , 37 i 43. ” z komentarza @ LeakyNun
źródło
APL (Dyalog) , 19 bajtów
z
⎕IO←0
Ten sam algorytm z odpowiedzią Dennisa
Wypróbuj online!
źródło
Siatkówka , 26 bajtów
Wypróbuj online!
źródło
Dodaj ++ , 35 bajtów
Wypróbuj online!
Spójrz mam, nie pętle while. Lub struny. Lub listy. Lub naprawdę wszystko, co pomaga zaoszczędzić bajty. Ale głównie dlatego, że Add ++ nie wie, co to jest.
3 miesiące później zdałem sobie sprawę, że to było nieprawidłowe i naprawiłem to. W jakiś sposób to golfa o 13 bajtów. Jest to funkcja, która pobiera jeden argument i sprawdza, czy jest to numer Chicken McNugget, czy nie.
Jak to działa
źródło
Excel, 87 bajtów
Alternatywnie 92 bajty:
źródło
PHP, 69 + 1 bajtów
wychodzi z
1
numeru Chicken McNugget, w przeciwnym razie0
.Uruchom jako potok z
-n
lub spróbuj online .źródło
Python 2 , 61 bajtów
Wypróbuj online!
źródło
chr
.Mathematica, 59 bajtów
źródło
Javascript 37 bajtów
Pobiera dodatnią liczbę całkowitą
n
i wyprowadzatrue
dla liczb Chicken McNugget ifalse
dla innych.Wyjaśnienie
Rekurencja w tej funkcji jest haniebna, a dla każdej wystarczająco dużej
n
przekroczenia limitów stosów wywołań. Oto wersja, która omija te limity, sprawdzając, czyn
jest większa niż największy numer nie-Chicken McNugget (43 bajty [punkty bonusowe za bycie największym nie-Chicken McNugget?]):Pokaż fragment kodu
źródło
JavaScript ES5, 46 bajtów
Jawna odpowiedź logiczna, 50 bajtów:
Niezdarny, ale załatwia sprawę. Zwraca
false
lub0
dla każdej wartości, która nie jest 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31, 34 , 37, lub 43, itrue
,-1
lub1
do wszystkiego innego.Jawne rozwiązanie zwraca
true
lubfalse
tylko.źródło
Clojure 33 bajty
Szybka próba na ok:
#(-> %(rem 20)(rem 9)(rem 6)(= 0))
źródło
Pari / GP , 48 bajtów
0
jest fałszem. wszystko inne jest prawdą.Wypróbuj online!
źródło
0.25
test.