Twoje zadanie jest proste: napisz program, który przyjmuje liczbę całkowitą jako dane wejściowe i wyprowadza go, jeśli był nieparzysty, i nie robi nic innego (nie jest dozwolone zatrzymywanie). Wyzwanie polega na tym, że można używać tylko nieparzystych bajtów.
Możesz opcjonalnie dołączyć końcowy znak nowej linii do wyniku.
To jest golfowy kod, wygrywa najkrótsza odpowiedź w (nieparzystych) bajtach.
Standardowe luki są zabronione. Ponadto nie można używać wersji językowych, które są nowsze niż publikacja tego wyzwania.
Przykładowe wejście> wyjście:
13
> 13
42
>
code-golf
restricted-source
M.Herzkamp
źródło
źródło
does nothing otherwise
znaczy? W Haskell funkcja typuInt -> Int
albo zwraca liczbę całkowitą, albo się nie zatrzymuje, albo generuje błąd. Jeśli dane wejściowe są w ogóle, to oczywiście nie powinny zostać zwrócone, więc czy zatrzymanie lub zgłoszenie błędu w tym przypadku nie byłoby dopuszczalne?alphabet=new Set(Array(256).fill(0).map((v,i)=>i).filter(v=>v%2).map(String.fromCharCode));
. Sprawdź, czy źródło jest ważna:[..."SOURCE CODE"].every(v=>alphabet.has(v))
. Zobacz nieprawidłowe znaki w źródle:[...new Set("SOURCE CODE")].filter(v=>!alphabet.has(v))
. Pamiętaj, aby uciec od swoich cytatów,"
=>\"
;)Odpowiedzi:
Japt
-f
, 1 bajtu
ma wartość znaku char wynoszącą117
.Spróbuj
źródło
Lenguage ,
645529908926937253684695788965635909332404360034079939415799150094049227072719076304944873511742697489376175615338418980647354995512293382937520069758100171520285Jest to mniej więcej równe 2 bajtom dwuzdecylowym.
Plik tłumaczy się na następujący program typu „brainfuck”:
Pobiera dane wejściowe jako kod ASCII, z maksymalną wartością 256. Używa zawijania.
źródło
,[<<+>+>-]<[>>+<<-]+>>[-[->]<]<[<[<]>.<]
?,[[>]++[-<]<+>>]>[<<<.<]
na tylko 3452857532394791089951 bajtów?,-[-->++<]>+.
działa równieżx86-64 Kod maszynowy, 8 bajtów
Zainspirowany rozwiązaniem Bruce'a Forte'a , ale nieco poniżej par. :-)
Pojedynczy parametr liczby całkowitej jest brany do
EDI
rejestru, zgodnie z konwencją wywoływania AMD64 Systemu V.Kopia tej wartości jest początkowo tworzona i umieszczana,
EAX
aby w razie potrzeby mogła zostać zwrócona. (LEA
jest używany zamiast normalnego,MOV
ponieważ potrzebujemy instrukcji z nieparzystymi bajtami).Następnie wartość w
EDI
jest przesuwana w prawo o 1, co umieszcza przesunięty bit w chorągiewce przenoszenia (CF). Ten bit będzie wynosił 0, jeśli liczba była parzysta, lub 1, jeśli był nieparzysty.Następnie testujemy CF za pomocą
JNC
instrukcji, która rozgałęzia się tylko wtedy, gdy CF ma wartość 0 (tzn. Liczba była parzysta). Oznacza to, że przejdziemy do nieskończonej pętli dla parzystych wartości. W przypadku wartości nieparzystych wypadamy i wartość oryginalna (wEAX
).Jest jednak trochę sztuczki z
JNC
instrukcją - maREP
prefiks! ZwykleREP
przedrostki są używane tylko z instrukcjami łańcuchowymi, ale ponieważ zarówno instrukcje Intel, jak i AMD zgadzają się, że nieistotne / zbędne / nadmiaroweREP
prefiksy są ignorowane, rzucamy tutaj jedną z instrukcji rozgałęzienia, aby miała długość 3 bajtów. W ten sposób względne przesunięcie zakodowane w instrukcji skoku jest również nieparzyste. (I oczywiście,REP
sam w sobie jest prefiksem nieparzystym).Dzięki Bogu
RET
jest kodowany za pomocą nieparzystego bajtu!Wypróbuj online!
W przypadku, gdy nie myślisz, że zwrócenie wartości, jeśli jest nieparzysta, lub przejście do nieskończonej pętli, jeśli jest ona parzysta (abyś nigdy nie powrócił), spełnia wymagania „wyjściowe” wyzwania, lub po prostu chcesz czegoś bardziej interesującego, oto funkcja który wypisuje wartość na port szeregowy (ale tylko jeśli jest nieparzysty, oczywiście).
x86-64 Kod maszynowy (wyjście do portu szeregowego), 17 bajtów
To, co sprawia, że jest to trochę bardziej interesujące, to fakt, że kod robi więcej , co oznacza, że trudniej było to wszystko zrobić za pomocą instrukcji zakodowanych przy użyciu tylko nieparzystych bajtów. Oczywiście oznacza to również, że zawodzi w golfie kodowym, więc jest to swego rodzaju kompromis - czy chcesz interesujących i wymagających, czy może krótkich?
W każdym razie używa
OUT
instrukcji x86 do zapisu na porcie we / wy 0x3F8, który jest standardowym portem szeregowym COM1 na komputerze. Zabawne jest oczywiście to, że wszystkie standardowe porty I / O (szeregowe i równoległe) mają parzyste adresy, więc nie można ich po prostu zakodować jako bezpośrednichOUT
instrukcji ani przenieść bezpośrednio do rejestru. Musisz zainicjować wartość o jedną mniejszą niż wartość rzeczywista, a następnie zwiększyć wartość wartość w rejestrze. Ograniczasz się również do używania niektórych rejestrów do manipulacji, ponieważ potrzebujesz rejestrów, które są zakodowane przy użyciu nieparzystych bajtów w instrukcji, gdy są używane jako operandy.Musiałem także zainicjować
DX
rejestr (za pośrednictwemCX
rejestru) na górze pętli, chociaż jest to potrzebne tylko wtedy, gdy wartość jest nieparzysta, aby zapewnić, żeJNC
instrukcja będzie miała nieparzyste przesunięcie. Ponieważ jednak pomijamyOUT
instrukcję, wszystko, co robi ten kod, to cykle marnotrawstwa i rejestry scratchowania clobbera; tak naprawdę nie wyprowadza nic , więc nie łamie zasad.Wreszcie funkcja ta powróci (po wykonaniu lub nie wykonaniu danych wyjściowych do portu szeregowego) z pozostawioną wartością wejściową
EAX
. Ale to tak naprawdę nie łamie żadnych zasad; wszystkie funkcje w języku asemblera powrócą z wartością wEAX
- pytaniem jest tylko, czy jest to wartość znacząca, czy wartość śmieciowa . Jest to określone w dokumentacji funkcji (w zasadzie, czy zwraca wartość, czy zwraca)void
), aw tym przypadku dokumentuję ją jako nie zwracającą wartości. :-)Brak linku TIO dla tego, ponieważ nie implementuje on wyjścia do portów szeregowych. Potrzebujesz prawdziwego żelaza lub wyobraźni.
źródło
MOV
instrukcja, jej operandy muszą być również zakodowane w bajtach. W tym przypadku byłyby to rejestry źródłowy i docelowy (chociaż operandy mogą być również wartościami natychmiastowymi, które są jak stałe). Różne rejestry są mapowane na różne bajty, a niektóre z nich są parzyste. Na przykład chciałbym użyć tegomov eax, edi
, ale to jest89 F8
w bajtach. Zobacz o wiele więcej niż kiedykolwiek chciałeś wiedzieć na temat kodowania tutaj, w sekcji „kod” . @ M.HerzkampGalaretka , 2 bajty
Znaki te odpowiadają bajtów 0xF7 i 0xBF w stronie kodowej Jelly .
Wypróbuj online!
źródło
05AB1E , 3 bajty
Kod odpowiada bajtowym wartościom
C9,69,3D
lub201,105,61
wszystkim nieparzystym.Wypróbuj online!
Wyjaśnienie
źródło
= # print without newline
to właściwie drukuj zÉ×
nie działa):D
przodu, ale to jest równe i wcale nie krótsze. Powodem, dla którego nie działa, jest to, że powtarzane niejawne dane wejściowe są traktowane jako drugi argument.MATL , 3 bajty
MATL używa znaków ASCII, więc
o?G
odpowiada bajtom (dziesiętnie)111
,63
,71
.Wypróbuj online!
Wyjaśnienie
źródło
Haskell ,
3633 bajtówWypróbuj online!
Zastosowanie:
o 7
yiedls7
,o 8
wchodzi w nieskończoną pętlę.Rzeczywisty algorytm to
Pierwszym problemem, z którym się spotkałem, był brak miejsca, a
(
ponieważ funkcja,o
która przyjmuje argument,m
jest zwykle definiowana jakoo m=...
lubo(m)=...
. Jednak dowiedziałem się, że komentarz wbudowany{- some comment -}
działa również jako ogranicznik tokena, więc definicjao{--}m=...
jest możliwa na podstawie podanych reguł. Edycja: Ørjan Johansen wskazał, że zamiast spacji można użyć znaku tabulacji, oszczędzając trzy bajty:o m=...
Drugim problemem było połączenie rekurencyjne
o(m-2)
.-2
jest po prostu-1-1
, ale tutaj sztuczka komentarza nie działa, ponieważ wymagane są nawiasy. Naprawiłem to, pozwalając na pracę funkcji na liście jednoelementowy, zawierający numer:o[m-2]
jednak, jak nie jest to standardowy sposób wnoszenia wkładu, ja zlecone obliczeń do funkcji pomocnikac
, który działa na listach i rozmowyc
zo
którego ma poprawny format .źródło
\t
zamiast{--}
.Python REPL, 38 bajtów
Pobiera dane wejściowe jako wartość poprzedniego wyrażenia za pomocą
_
. Wyjściowy będzie ciąg znaków (ciąg reprezentujący liczbę całkowitą dla nieparzystego lub pusty ciąg dla parzystego).Wypróbuj online
Aby uruchomić go w rzeczywistej powłoce, możesz wypróbować tutaj . Wpisz dane wejściowe, naciśnij Enter. Wklej kod, naciśnij Enter.
Wyjaśnienie:
Wymyślenie tego zajęło trochę czasu. Nie ma mnożenia, rozgałęziania, krojenia, przecinków, okresów, importu, nawiasów, nie
exec
, nieeval
, nieprint
żadnych funkcji. Mam jedno rozwiązanie działające na tym wyjściu za pomocą stderr, ale potem zdałem sobie sprawę, że musimy wyprowadzić rzeczywistą liczbę całkowitą, a nie tylko wartość true / falsey.Używam nawiasów zamiast nawiasów z
[expression][-1]
. Uproszczenie, które zamienia powyższy kod w'%s'%(['']+[_])[_%(1+1)]
.Ponieważ nie może być przecinków, użyłem dodawania listy do utworzenia
['',_]
. Korzystając z formatowania ciągów, uzyskuje się pożądany wynik.źródło
None
byłoby to lepsze dopasowanie niż''
. W każdym razie to wciąż 10000 razy lepsze niż cokolwiek, co mogłem wymyślić.False
. Nie wiem, jak możesz się dostaćNone
.CJam, 6 bajtów
113
95
105
89
37
37
Ten program pobiera mod 2 wejścia (nazwij go r ) i wypisuje co r- ty znak w ciągu wejściowym. Jeśli liczba wejściowa jest nieparzysta, drukuje cały ciąg, ale jeśli zostanie poproszony o wydrukowanie co 0 znaku, program zgłasza błąd.
Wypróbuj tutaj
źródło
qi_Y%]W%{}/M?
a potem to zobaczyłem.Cubix ,
231917 bajtówSpróbuj!
@
, która kończy program Cubix, to ascii 64, więc niestety po prostu wchodzi ona w nieskończoną pętlę po przetestowaniu dziwności. Brak linku TIO, ponieważ upłynie limit czasu.=
(ascii 61) nie ma akcji w Cubix.Jest to niewielka modyfikacja wcześniejszego algorytmu (ten sam # bajtów), który faktycznie działa dla liczb całkowitych ujemnych.
Wersja kostki:
Algorytm:
I
(73)
: wczytaj wpis jako liczbę1
(49)
: naciśnij 1)
(41)
: przyrost%
(37)
: weź mod/
(47)
: Skręć w lewo!
(33)
: pomiń następną instrukcję, jeśli jest nieparzysta1;;/;
;
is(59)
: przygotowuje stos na wyjścieO
(79)
: Dane wyjściowe jako liczba.I
odczytuje0
koniec danych wejściowych, więc gwarantujemy wejście do parzystej gałęziu
(117)
: zawracanie w prawo;;;!I
: pętla, skutecznie nic nie robiąc.źródło
?
Węgiel , 9 bajtów
Wypróbuj online!
Zasadniczo drukuje dane wejściowe w prawo, jeśli nie jest to wielokrotność 10/5 (
²
znak znajduje się nawet na stronie kodowej Węgiel ). Używane znaki to:¿
: kodBF
.﹪
: kodA5
.I
: kodC9
.θ
: kodF1
.÷
: kodAF
.χ
: kodE3
.⁵
: kodB5
.→
: kod13
.W rzeczywistości
→
koniec jest zbędny, ale potem zobaczyłem, że odpowiedź musiała mieć dziwną długość ...Wyjaśnienie:
źródło
→θ
.kod maszynowy x86_64 (Linux),
1211 bajtówNiestety
0x80
jest parzysty, ale i tak się udało (zakładając, że „nic nie robi” oznacza nie wracać):-1 bajt, dzięki @CodyGray!
Wypróbuj online!
źródło
lea (%edi),%eax
wymaga prefiksu wielkości nadpisania adresu (0x67
), gdy źródłem jest rejestr 32-bitowy. Możesz to zrobić, robiąc tolea (%rdi),%eax
. To oszczędza bajt i faktycznie poprawiłoby kod nieco bardziej (prefiksy spowalniają dekodowanie i zapełniają pamięć podręczną i). Są jeszcze inne rzeczy, które możesz zrobić, aby jeszcze bardziej to skrócić, ale w gruncie rzeczy stanowi to kompletne przepisanie, więc opublikuję własną odpowiedź. :-) Oczywiście też to głosowałem! (Och, właśnie zdałem sobie sprawę, że mógłeś użyć prefiksu, aby ustawić przesunięcie dziwne. Cóż, będziesz potrzebować więcej magii.)F6
) dlaJNE
instrukcji, ponieważ ma parzyste przesunięcie. To właśnie miałem na myśli przez ostatni nawias edytowany w moim pierwszym komentarzu. Rzeczywiście potrzebujesz tego prefiksu, aby utworzyć nieparzyste wyrównanie. Lub musisz przepisać kod w inny sposób. Grałem z wieloma różnymi odmianami. Rzeczywiście patrzyłem na tę ostatnią noc i próbowałem wymyślić dobry sposób na użycieOUT
nieparzystych wartości, ale tak naprawdę nie przyszło mi do głowy żadne dobre rozwiązanie. Wgląd tutaj jest dla mnie przejście do nieskończonej pętli dla parzystych wartości.BT
rodziny instrukcji, których nikt nigdy nie używa (niestety wszystkie kodowania rejestrów są nawet bajtami). Pomyślałem, że bardziej interesujące może być napisanie kodu wyjściowego na port szeregowy, niż tylko zwracanie wartości lub cokolwiek innego, ale to powoduje zwiększenie liczby bajtów (zwłaszcza, że adresy portów szeregowych w postaci szesnastkowej są równe!), Więc zrezygnowałem z tego.Mathematica, 20 bajtów
Wydają się być pierwszym rozwiązaniem w języku nie golfowym.
W
MacintoshChineseTraditional
kodowaniu znaków.\[Divides]
jest{161, 253}
(2 bajty)Alternatywna wersja (23 bajty)
lub (pokazany w Unicode)
w
Symbol
kodowaniu znaków. (używaj tylko znaków 1-bajtowych)Rozwiązanie definiuje funkcję
g
(lubΓ
), która ocenia wejście, gdy dane wejściowe są nieparzyste, i dosłownie „nic nie rób” (nie ocenia), gdy dane wejściowe są parzyste.źródło
;
na końcu), jeśli liczba bajtów musi być parzysta; a\[Divides]
także mają dziwny punkt kodowy Unicode.I[1+1]
, możesz po prostu użyć{1+1}
. Czy sprawdziłeś również, czy bajty wsporników podłogowych są prawidłowe? Jeśli tak, możesz uzyskać2
od\[LeftFloor]E\[RightFloor]
.Symbol
podłogę ważną, ale nie maE
ani\[ExponentialE]
.D
;v
; anid
, ponieważ mają parzystą wartość bajtową .. :(\[Divides]
to jeden znak w Mathematica, reprezentowany przez 2 bajty{161, 253}
.Perl, 54 bajty
Wymaga
-E
.Naprawdę bardzo podobało mi się to wyzwanie, myślę, że chciałbym spróbować poprawić tę odpowiedź, ale myślę, że może to być najkrótszy czas, jaki mogę zrobić. Bawię się tymi odpowiedziami od kilku dni, ale czuję, że jestem zadowolony z 54-bajtowego rozwiązania!
Wypróbuj online!
Wyjaśnienie
Domyślnie działa większość funkcji łańcuchowych Perla
$_
, które są puste, aby rozpocząć.Po pierwsze,
s//A_=Y[;A_=A_%O?A_W''/
zastępuje pusty ciąg w$_
zA_=Y[;A_=A_%O?A_W''
, a następniey/#A-_/#-A/
zastępuje znaki oparte na poniższej liście (powyżej char char staje poniżej):które aktualizacje
$_
zawierają$_=<>;$_=$_%2?$_:''
. Oboks/[#-}]+/uc/ee
zastępuje wszystkie znaki[#-}]+
zuc
. Bez/ee
tego byłby to tylko ciąguc
, ale/ee
ocenia zawartość ciągu dwa razy. Pierwsza ocena zwraca wynikuc
, który jest wersją wielkiej litery,$_
ale ponieważ$_
nie zawiera znaków alfabetycznych, po prostu zwraca cały ciąg, a następnie drugi/e
ocenia ciąg ponownie, który ustawia$_
się na$_
(numer wejściowy) lub w''
zależności od tego, czy lub nie liczba jest nieparzysta lub parzysta.Wreszcie, ponieważ
$_
teraz zawiera to, co chcemy, nazywamysay
(co jest wymagane-E
zamiast-e
), które odbitki$_
poprzedzane są nową linią.Alternatywny Perl, 93 bajty
Kod 92 bajty + 1 dla
-p
, co, jak sądzę, uczyniłoby go niekonkurencyjnym.Zawiera zakładkę i pionową zakładkę w
y///
, oznaczoną jako\x09
i\x0b
.Wypróbuj online!
źródło
LOGO ,
390465250 bajtówJest to lista szablonów, która zwraca dane wejściowe, jeśli dane wejściowe są nieparzyste i powodują błąd, jeśli dane wejściowe są parzyste.
Stosowanie:
wydajność
ponieważ 5 jest nieparzyste, i
spowoduje błąd, ponieważ 6 jest parzyste.
źródło
TI-BASIC, 14 bajtów
Powoduje to błąd domeny (brak drukowania na ekranie głównym) na parzystej liczbie.
źródło
Pyth ,
1411109 bajtówZestaw testowy .
źródło
I%Qy1Q
również działać?y1
...%
Niestety, nie jest to dozwolone.%
ma wartość ascii 37 i jest nieparzysty.Japt , 4 bajty
Japt korzysta z ISO / IEC 8859-1 , więc odpowiada to (dziesiętnie)
117 41 231 85
.Przetestuj online!
Wyjaśnienie
Najpierw wypróbowałem rozwiązania przy użyciu
p
, w zasadzieç
z odwrotnymi argumentami. Jednakp
wykonuje potęgowanie, jeśli jego lewy argument jest liczbą, więc musielibyśmy jawnie przekonwertować go na ciąg. To rozwiązanie okazuje się być bajtem krótszym, poza tym, że nie zawiera żadnych nieparzystych bajtów.źródło
dc , 21 bajtów
Dziesiętny:
91 99 93 115 97 63 107 75 75 67 73 45 49 59 49 107 37 49 33 61 97
Zgodnie z tym domyślnie IO, program ten pozostawia wejście na głównym stosie jeśli jest to dziwne i opróżnia stosie inaczej. Można to potwierdzić, dodając
f
polecenie debugowania na końcu programu, jak ma to miejsce na stronie TIO.Wypróbuj online!
Wyjaśnienie
źródło
TI-Basic, 18 bajtów
Zaoszczędzono 2 bajty dzięki lirtosiast
w bajtach (+2 nowego wiersza = 3F)
Zobacz http://tibasicdev.wikidot.com/one-byte-tokens
źródło
Input Q[newline]sinֿ¹(gcd(Q²,int(e[newline]Q
(14 bajtów). Czy mogę opublikować jako osobną odpowiedź?MathGolf , 3 bajty
Wypróbuj online!
Używane bajty to
157, 123, 107
.Wyjaśnienie
źródło
Bash , 31 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
rd $20|h
i nowa linia.)