Twoim zadaniem jest napisanie niepusty program / funkcję count bajtów L , która, gdy powtarzane M czasy, sprawdza, czy dana liczba całkowita dodatnia N jest równa L x M .
Teoretycznie powinieneś popierać dowolną liczbę powtórzeń (arbitralną dodatnią wartość całkowitą M ), ale w porządku, jeśli z powodu ograniczeń językowych nie może działać powyżej pewnego progu. Czytanie kodu źródłowego programu lub uzyskiwanie dostępu do informacji na jego temat jest surowo zabronione .
Aby uzyskać dane wyjściowe, należy wybrać spójną wartość dla jednego ze stanów (prawda lub fałsz) i użyć innego (niekoniecznie spójnego) możliwego wyniku dla drugiego stanu ( Dyskusja ).
Twoje odpowiedzi zostaną ocenione na podstawie długości początkowego programu L (w bajtach), przy czym mniej bajtów będzie lepszych.
Przykład
Powiedzmy, że twój (początkowy) program to ABCDE
. Następnie:
ABCDE
(1 powtórzenie) powinno sprawdzić, czy wartość wejściowa wynosi 5 .ABCDEABCDE
(2 powtórzenia) powinny sprawdzić, czy wartość wejściowa wynosi 10 .ABCDEABCDEABCDE
(3 powtórzenia) powinny sprawdzić, czy wartość wejściowa wynosi 15 . Itp...
Wynik tego przykładowego kodu wynosiłby 5 , ponieważ początkowe źródło ma 5 bajtów.
źródło
L
skonkatenowanej po sobieM
razy powinien zwrócić, czy jego dane wejścioweN
są równeL*M
?Odpowiedzi:
Galaretka , 1 bajt
Dane wyjściowe wynoszą 0 dla dopasowania, a niezerowe dla braku dopasowania.
Wypróbuj online!
Jak to działa
Wykorzystuje to zbyt liberalny format wyjściowy. Powtarzanie
’
M razy po prostu zmniejsza wejściowe M razy, więc wynik wyniesie zero wtedy i tylko wtedy, gdy dane wejściowe to LM , gdzie L = 1 .źródło
Haskell, 8 bajtów
Wypróbuj online!
Podobnie jak wiele innych odpowiedzi, zwraca wartość 0 dla prawdy i wartość inną niż 0 dla fałszu poprzez wielokrotne odejmowanie długości kodu od liczby wejściowej.
źródło
Siatkówka ,
2120 bajtówWypróbuj online! Wystarczy powtórzyć część w oknie Kod, aby zobaczyć, jak obsługuje wielokrotności.
Podaje
0
poprawne wielokrotne i dodatnie liczby całkowite dla wszystkiego innego.Wyjaśnienie
Najpierw spójrzmy na pojedynczy program:
Konwertuje liczbę dziesiętną na unarną (używając
_
jako cyfry unary).Jeśli ciąg znaków jest pusty (co nie może się zdarzyć w tym momencie, ponieważ wejście jest gwarantowane jako dodatnie), zastępujemy go pojedynczym
_
.Teraz pozbywamy się pierwszych 20 znaków podkreślenia. Iff wejściowy był
20
, to powoduje, że pusty ciąg.Na koniec zliczamy liczbę znaków podkreślenia w wyniku, która wynosi zero, jeśli dane wejściowe były
20
.Co się stanie, gdy powtórzymy kod źródłowy. Ponieważ nie wstawiamy kanału przy dołączaniu do programów, pierwsza linia pójdzie w prawo na końcu ostatniej linii, otrzymamy to, gdy program podwoi się:
Teraz zamiast liczyć podkreślenia, kończymy na następującym etapie:
Ten etap nic nie robi, ponieważ w tym momencie nie ma już cyfr w ciągu roboczym, więc wyrażenie regularne nie może się zgadzać.
Teraz ten etap staje się istotny. Jeśli dane wejściowe były mniejsze od wielokrotności 20, ciąg został opróżniony przez poprzednią kopię kodu źródłowego. W takim przypadku zamieniamy go w pojedynczy znak podkreślenia, który, jak wiemy, nigdy nie może zostać zmieniony w pusty ciąg znaków przez nasz program. W ten sposób mamy pewność, że tylko w M th wielokrotność jest akceptowana (i nie wszystkie wielokrotności aż do M Th).
Po raz kolejny usuwamy pierwsze 20 znaków podkreślenia. Tak więc M powtórzeń kodu źródłowego usunie 20M podkreślników z łańcucha, jeśli to możliwe.
Kiedy dochodzimy do końca programu, nadal liczymy podkreślenia, aby prawidłowe dane wejściowe dawały zero.
źródło
x86 32-bitowy fragment kodu maszynowego, 1 bajt
Dane wejściowe w EAX, dane wyjściowe w EAX: 0 dla wartości true, niezerowe dla wartości false. (Pozostawia również flagę ZF ustawioną na wartość true, a nie ustawioną na wartość false, abyś mógł
je was_equal
). Jako „bonus” nie musisz się martwić o opakowanie; 32-bitowy procesor x86 może adresować tylko 4GiB pamięci, więc nie możesz zrobić M wystarczająco dużego, aby owinąć go dookoła i znaleźć1 == 2**32 + 1
lub coś w tym rodzaju.Aby włączyć funkcję wywoływaną, dołącz
0xC3
ret
instrukcję po powtórzeniu0x48
M razy. (Nie liczony w łącznej liczbie, ponieważ wiele języków musi powtarzać tylko treść funkcji lub wyrażenie, aby móc konkurować).Możliwe do wylogowania z GNU C za pomocą atrybutu funkcji x86 prototypu
__attribute__((regparm(1))) int checkeqM(int eax);
GNU Cregparm
, na przykład-mregparm
, używa EAX do przekazania pierwszej liczby całkowitej arg.Na przykład ten kompletny program pobiera 2 argumenty, a kopie instrukcji JIT M +
ret
bufor do bufora, a następnie wywołuje je jako funkcję. (Wymaga pliku wykonywalnego; kompiluj zgcc -O3 -m32 -z execstack
)pliki wykonywalne inne niż PIE są ładowane niżej w pamięci wirtualnej; może zrobić większy ciągły malloc.
Zauważ, że GNU C nie obsługuje obiektów o rozmiarach większych niż
ptrdiff_t
(32-bitową), alemalloc
imemset
zrobić jeszcze pracy, więc ten program się powiedzie.Fragment kodu maszynowego ARM Thumb, 2 bajty
Pierwszy argument arg
r0
i zwracana wartośćr0
to standardowa konwencja wywoływania ARM. To także ustawia flagi (s
sufiks). Śmieszny fakt; non FLAG ustalania wersjasub
jest 32-bitowe instrukcje szerokości.Instrukcja zwrotu, którą musisz dołączyć, to
bx lr
.Fragment kodu maszynowego AArch64, 4 bajty
Działa dla 64-bitowych liczb całkowitych. Wejście / wyjście w
x0
, zgodnie ze standardową konwencją wywoływania.int64_t foo(uint64_t);
AArch64 nie ma (jeszcze) trybu kciuka, więc 1 instrukcja jest najlepsza, co możemy zrobić.
źródło
__builtin___clear_cache
jest konieczne tylko dlatego, że wykonujesz pamięć, z której maszmalloc
. Jeślimmap
zamiast tego dostaniesz pamięć , optymalizacja nie nastąpi.V , 16 (lub 1) bajtów
Nudna odpowiedź:
jeden bajt.
Mniej nudna odpowiedź:
Wypróbuj online!
Hexdump:
Napisałem to około 5 minut po tym, jak wyszło wyzwanie. Zajęło mi 30 minut, aby załatać ten okropny stos kodu spaghetti, który nazywam językiem .
źródło
Perl 5
-p
, 6 bajtówWypróbuj online!
używa
0
dla równościźródło
-p
rozwiązanie Perl 6 .Brachylog , 2 bajty
Wypróbuj online!
źródło
Python 3 , 27 bajtów
Wypróbuj online!
Kod powtórzony dwukrotnie:
Wypróbuj online!
źródło
Brain-Flak , 24 bajty
Wypróbuj online!
Zwraca
0
za równe i coś innego za nie równe.Jak to działa:
n
Czasy działania tego kodu odejmą sięn * 24
od danych wejściowych, dając 0 tylko wtedy, gdy dane wejściowe =n*24
.źródło
Stax , 1 bajt
Wypróbuj online!
źródło
TI-Basic (seria 83), 4 bajty
Bierze dane wejściowe
Ans
: na przykład możesz wpisać,17:prgmCODEGOLF
aby uruchomić to z danymi wejściowymi17
. Wyświetla (i zwracaAns
) wartość,0
jeśli wartość wejściowa jest równa L × M , a wartość niezerowa w przeciwnym razie.Zauważ, że
:
jest to część kodu, więc jeśli wpisujesz to w edytorze programów, powinieneś zobaczyćjeśli wpiszesz go raz i
jeśli wpiszesz to trzy razy.
źródło
Haskell , 12 bajtów
Wypróbuj online!
Wyjścia
0
dla prawdy i niektóre niezerowe liczby całkowite dla fałszu.Alternatywne rozwiązanie, 12 bajtów
Wypróbuj online!
źródło
Befunge-98 , 15 bajtów
Wypróbuj online!
Spróbuj dwukrotnie!
Używa 0 dla równości i cokolwiek innego dla nierówności.
Wyjaśnienie:
Ten wielokrotnie powtarzany kod będzie wyglądał mniej więcej tak:
]
skręt w prawo. Wysyła adres IP w dół.>
przesuń się na wschód. Wysyła adres IP w prawo.f
naciśnij 16.v
idź na południe. Wysyła adres IP w dół. Jeśli jest to ostatni raz, przejdź do kroku 8.]
skręt w prawo. Wysyła adres IP w lewo.+
Dodaj. Dodaje 16 do góry stosu.v
idź na południe. Wysyła adres IP w dół. Idź do kroku 2.<
idź na zachód. Wyślij adres IP w lewo.#
pominąć. przeskocz nad]
i zawiń do końca.+
Dodaj. Dodaje 16 do góry stosu.&
Wejście. Naciśnij numer od użytkownika.-
odejmować. uzyskać różnicę sumy, nad którą pracowaliśmy i dane wejściowe..
wydrukować. Wydrukuj wynik.@
koniec.źródło
Pure Bash , 15 lat
Dane wejściowe podane jako parametr wiersza polecenia. Wyjście jako kod wyjścia powłoki -
1
dla PRAWDA i0
FAŁSZ.źródło
Węgiel drzewny , 13 bajtów
Wypróbuj online! Na podstawie mojej odpowiedzi, że podwoiłem źródło, podwoiłeś moc wyjściową! Wyjaśnienie:
1
Udaje się wyjść na prawdę i0
na fałsz. Kolejne powtórzenia porównać wejście na13
,26
,39
,52
itd., Ale za każdym razem odpowiedź jest nadrukowany tak tylko ostateczna odpowiedź jest postrzegana.źródło
JavaScript ES6, 32 bajty
jeśli true, równe 0, a false - 31 bajtów
źródło
MIPS, 4 bajty
Wykorzystuje
$a0
jako argument i zwraca wartość.MIPS, 8 bajtów (przy użyciu konwencji wywoływania MIPS)
x 86, 5 bajtów
To moja pierwsza odpowiedź na x86, więc proszę o opinie. Używa konwencji _fastcall z ecx jako pierwszym argumentem.
Peter Cordes ma jednobajtowe rozwiązanie w komentarzach.
Komentarz Brainfuck : Trudność polega na tym, żeby pieprzyć mózg, żeby zwrócił jedną wartość. W przeciwnym razie coś takiego byłoby łatwe.
źródło
sub $4, %al
/mov %al, %dl
. Lub nadal wróć do AL / EAX, a następnie otrzymasz rozwiązanie Dennisa, zdec %eax
(1 bajt w trybie 32-bitowym). I tak, niestandardowe konwencje wywoływania są odpowiednie dla asm. To asm, nie tylko „asm, do którego łatwo jest zadzwonić z C”; prawdziwy kod napisany w asm korzysta z niestandardowych konwencji wywoływania, gdy jest to pomocne, więc jest to całkowicie uzasadnione.r0
którym jest również retval, więc Thumbsub r0, #2
ma 2 bajty.ret
na końcu bloku powtarzania, zanim będziesz mógł je wywołać. Zwykleret
do moich odpowiedzi asm x86 dołączam liczbę bajtów. Ale myślę, że naginanie reguł tutaj tylko dla funkcji ciała ma sens, w przeciwnym razie wiele języków nie będzie w stanie konkurować.xchg %eax, %ecx
/sub $4, %al
/xchg %eax, %ecx
Jest 4 bajty, a następująca konwencję _fastcall. Korzystanie z krótkich kodowań AL, imm8 i xchg-with-eax jest często pomocne dla golfa kodowego.objdump -drwC -Mintel
aby uzyskać zrzut heksowy bajtów kodu maszynowego.add r32, imm8
ma również 3 bajty: opcode + ModR / M + imm8. Wszystkie instrukcje, które mogą przyjąć imm32, mają alternatywny kod operacji, który przyjmuje imm8 z rozszerzonym znakiem. Zobacz na przykład felixcloutier.com/x86/ADD.html ; wszystkie „klasyczne” instrukcje ALU (ale nie MOV) datowane na 8086 mają wszystkie te kodowania, w tym specjalne AL / AX / EAX bez modr / m, tylko op + imm8 / 16/32. Ta odpowiedź zawiera przykładyOktawa: 23 bajty
Jeśli N = L * M, wyrażenie jest zwracane
0+i
(tj. Liczbę wyłącznie urojoną), w przeciwnym razie wynikiem jest liczba zespolona z rzeczywistym składnikiem.Aby uzyskać nieco lepszy wynik kosztem dodatkowego bajtu:
Jeśli N = L * M, wyrażenie zwraca
-1
, w przeciwnym razie liczba dodatnia.Próbny:
PS, możesz uzyskać ten sam wynik z
+24;if N==ans;-1;end;ans
ale liczba bajtów jest taka samaźródło
Lua,
5646 bajtówZwraca 0 (bez końcowego nowego wiersza), jeśli jest równe, albo albo nic, albo szereg liczb ujemnych (w niektórych przypadkach poprzedzających zero), jeśli nie jest równy.
Sam: Wypróbuj online!
Powtarzano kilka razy: Wypróbuj online!
Wyjaśnienie
Przy pierwszej iteracji (gdy
a
nie została jeszcze zdefiniowana i dlatego jestnil
), ustawiaa
się na liczbę pobraną z danych wejściowych, w przeciwnym razie do siebie. W obu przypadkach odejmuje się następnie 46a
.To po prostu drukuje
a
jeśli jest mniejsze niż (aby zająć się przypadkami, w których dane wejściowe były większe niż całkowita długość) lub równe zero, a pusty łańcuch w przeciwnym razie.-10 bajtów do zapamiętania, że Lua automatycznie przekształca liczby i ciągi znaków. Ups
źródło
JavaScript (ES6), 47 bajtów
Używa tej samej techniki, co Benoit Esnard w tej odpowiedzi (od podwoić źródło, podwoisz wynik! ).
Wyświetla 0, jeśli n = 47 * M lub w przeciwnym razie wartość niezerową.
Demo dla M = 1
Demo dla M = 2
źródło
Brain-Flak , 24 bajty
Wypróbuj online!
Po prostu odejmuje 24 od wartości wejściowej. Wyjścia
0
dla true i cokolwiek innego dla false.Brain-Flak , 68 bajtów
Wypróbuj online!
Ten jest bardziej wyrafinowany i wyświetla wartości
1
prawda i0
fałsz.źródło