Ja nawet… ja tylko dziwne!

36

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 >

M.Herzkamp
źródło
10
Odrzuciłem to wyzwanie, ponieważ jest to wyzwanie „Wykonaj X bez Y”.
Leaky Nun
4
Co dokładnie does nothing otherwiseznaczy? W Haskell funkcja typu Int -> 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?
Laikoni
2
Jeśli chcesz wiedzieć, czy możesz użyć kodu źródłowego, wypróbuj te skrypty w konsoli przeglądarki. Tworzenie ważnego charset: 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, "=> \";)
kamoroso94 11.07.17
14
@LeakyNun „do X bez Y” nie odnosi się do ogólnych wyzwań o ograniczonym źródle , ale do wyzwań, które zabraniają korzystania z niektórych funkcji języka. Nie jest to wyzwanie i nie ma w nim żadnych problemów, które sprawiają, że faktyczne wyzwania „zrób X bez Y” są problematyczne.
Martin Ender
1
@Laikoni Ponieważ istnieją już odpowiedzi, które wchodzą w nieskończoną pętlę, powiedziałbym, że takie zachowanie jest w porządku. Brak powrotu można interpretować jako brak działania.
M.Herzkamp

Odpowiedzi:

1

Japt -f , 1 bajt

u

uma wartość znaku char wynoszącą 117.

Spróbuj

Oliver
źródło
1
Późno na imprezę, ale moja ... co za odpowiedź!
M.Herzkamp
67

Lenguage , 645529908926937253684695788965635909332404360034079 9394157991500940492270727190763049448735 1174269748937617561533841898064735499551 2293382937520069758100171520285

Jest 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.

Okx
źródło
@Okx Mój błąd. Ale dlaczego po prostu nie użyjesz ,[<<+>+>-]<[>>+<<-]+>>[-[->]<]<[<[<]>.<]?
user202729,
1
Co powiesz ,[[>]++[-<]<+>>]>[<<<.<]na tylko 3452857532394791089951 bajtów?
Jo King
W rzeczywistości, ponieważ dozwolone są nieskończone pętle, ,-[-->++<]>+.działa również
Jo King
20

x86-64 Kod maszynowy, 8 bajtów

Zainspirowany rozwiązaniem Bruce'a Forte'a , ale nieco poniżej par. :-)

8D 07          lea      eax, [rdi]    ; put copy of input parameter in EAX
D1 EF          shr      edi, 1        ; shift LSB into CF
             InfiniteLoop:
F3 73 FD       rep jnc  InfiniteLoop  ; test CF; infinite loop back here if input was even
C3             ret                    ; return with original input in EAX if it was odd

Pojedynczy parametr liczby całkowitej jest brany do EDIrejestru, zgodnie z konwencją wywoływania AMD64 Systemu V.

Kopia tej wartości jest początkowo tworzona i umieszczana, EAXaby w razie potrzeby mogła zostać zwrócona. (LEA jest używany zamiast normalnego, MOVponieważ 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ą JNCinstrukcji, 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 JNCinstrukcją - ma REPprefiks! Zwykle REPprzedrostki są używane tylko z instrukcjami łańcuchowymi, ale ponieważ zarówno instrukcje Intel, jak i AMD zgadzają się, że nieistotne / zbędne / nadmiarowe REPprefiksy 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 RETjest 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

8D 07         lea   eax, [rdi]   ; put copy of input parameter (EDI) in EAX

B1 F7         mov   cl, 0xf7     ; put 0xF7 into low-order bits of CX
B5 03         mov   ch, 0x03     ; put 0x03 into high-order bits of CX
FE C1         inc   cl           ; increment low-order bits of CX to 0xF8 (so all together it's now 0x3F8)
0F B7 D1      movzx edx, cx      ; move CX to DX ("MOV DX, CX" would have a 16-bit prefix of 0x66)

D1 EF         shr   edi, 1       ; shift LSB of input parameter into CF
73 01         jnc   IsEven       ; test CF: branch if 0 (even), fall through if 1 (odd)
EF            out   dx, eax      ; output EAX (original input) to I/O port 0x3F8 (in DX)
            IsEven:
C3            ret                ; return

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 OUTinstrukcji 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średnich OUTinstrukcji 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ć DXrejestr (za pośrednictwem CXrejestru) na górze pętli, chociaż jest to potrzebne tylko wtedy, gdy wartość jest nieparzysta, aby zapewnić, że JNCinstrukcja będzie miała nieparzyste przesunięcie. Ponieważ jednak pomijamy OUTinstrukcję, 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ą w EAX- 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.

Cody Gray
źródło
+1 za wyjaśnienie! Dlaczego możesz używać mov w drugiej linii, ale nie w pierwszej?
M.Herzkamp
Oprócz kodowania, że ​​jest to MOVinstrukcja, 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ć tego mov eax, edi, ale to jest 89 F8w bajtach. Zobacz o wiele więcej niż kiedykolwiek chciałeś wiedzieć na temat kodowania tutaj, w sekcji „kod” . @ M.Herzkamp
Cody Gray
19

Galaretka , 2 bajty

ẋḂ

Znaki te odpowiadają bajtów 0xF7 i 0xBF w stronie kodowej Jelly .

Wypróbuj online!

Dennis
źródło
5
Szkoda by było, gdyby to rozwiązanie z nawet liczbą bajtów wygrało wyzwanie ... 1 bajtowe rozwiązanie ktoś?
M.Herzkamp
9

05AB1E , 3 bajty

Éi=

Kod odpowiada bajtowym wartościom C9,69,3Dlub 201,105,61wszystkim nieparzystym.

Wypróbuj online!

Wyjaśnienie

É     # input % 2 == 1
 i    # if true
  =   # print without popping
Emigna
źródło
= # print without newlineto właściwie drukuj z
nową
@EriktheOutgolfer: True. Naprawię wyjaśnienie.
Emigna,
Niestety É×nie działa):
kalsowerus,
@kalsowerus: Tak, też to zauważyłem. Działa poprawnie z Dprzodu, 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.
Emigna,
@Emigna, ale dziwne jest to, że zamiana dwóch górnych wartości na stosie dwa razy sprawia, że ​​również działa ...
kalsowerus
5

MATL , 3 bajty

o?G

MATL używa znaków ASCII, więc o?Godpowiada bajtom (dziesiętnie) 111,63 , 71.

Wypróbuj online!

Wyjaśnienie

o     % Push (implicit) input modulo 2
?     % If nonzero
  G   %   Push input
      % End (implicit)
      % Display stack contents (implicit)
Luis Mendo
źródło
5

Haskell , 36 33 bajtów

c[1]=1;c[m]=1+1+c[m-1-1];o	m=c[m]

Wypróbuj online!

Zastosowanie: o 7yiedls 7,o 8 wchodzi w nieskończoną pętlę.

Rzeczywisty algorytm to

o 1 = 1
o m = 2 + o(m-2)

Pierwszym problemem, z którym się spotkałem, był brak miejsca, a (ponieważ funkcja, októra przyjmuje argument, mjest zwykle definiowana jako o m=...lub o(m)=.... Jednak dowiedziałem się, że komentarz wbudowany {- some comment -}działa również jako ogranicznik tokena, więc definicja o{--}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). -2jest 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 pomocnika c, który działa na listach i rozmowy cz októrego ma poprawny format .

Laikoni
źródło
Możesz użyć tabulacji zamiast spacji.
Ørjan Johansen
@ ØrjanJohansen Mogę sprawdzić, czy to działa \tzamiast {--}.
Esolanging Fruit
@ ØrjanJohansen Dzięki, dobrze wiedzieć.
Laikoni,
5

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).

'%s'%[['']+[_]][-1][[_%[1+1][-1]][-1]]

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, nie eval, 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.

mbomb007
źródło
Sława. Jako bonus działa również dla Ruby IRB :) Nitpick: czy można zwracać ciąg znaków dla liczb nieparzystych, czy dobrze jest zwracać ciąg pusty dla liczb parzystych?
Eric Duminil,
Pomyślałem, że nic nie robię, nic nie drukuję ani nie zwracam. W pewnym sensie pusty ciąg znaków jest niczym.
mbomb007
Tak, naprawdę mnie to dręczyło. Nadal zwraca ciąg zamiast niczego. W Python REPL powiedziałbym, że Nonebyłoby to lepsze dopasowanie niż ''. W każdym razie to wciąż 10000 razy lepsze niż cokolwiek, co mogłem wymyślić.
Eric Duminil,
@EricDuminil Mógłbym wrócić False. Nie wiem, jak możesz się dostać None.
mbomb007
4

CJam, 6 bajtów

q_iY%%

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

geokavel
źródło
Miły! Zamierzałem pisać, qi_Y%]W%{}/M?a potem to zobaczyłem.
Esolanging Fruit 12.07.17
4

Cubix , 23 19 17 bajtów

;;u!I1)%/;O=!;;/;

Spró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:

    ; ;
    u !
I 1 ) % / ; O =
! ; ; / ; . . .
    . .
    . .

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 nieparzysta
    • 1;;/; ;is (59): przygotowuje stos na wyjście
    • O (79) : Dane wyjściowe jako liczba.
    • Następnie ponownie wprowadza algorytm, ale Iodczytuje 0koniec danych wejściowych, więc gwarantujemy wejście do parzystej gałęzi
  • u (117) : zawracanie w prawo
  • ;;;!I : pętla, skutecznie nic nie robiąc.
Giuseppe
źródło
@MickyT, który zawodzi w przypadku negatywnych danych wejściowych, dlatego unikałem używania?
Giuseppe
Przepraszam, nie sprawdziłem tego poprawnie
MickyT
3

Węgiel , 9 bajtów

¿﹪Iθ÷χ⁵→θ

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:

  • ¿: kod BF.
  • : kod A5.
  • : kod C9.
  • θ: kod F1.
  • ÷: kod AF.
  • χ: kod E3.
  • : kod B5.
  • : kod 13.

W rzeczywistości koniec jest zbędny, ale potem zobaczyłem, że odpowiedź musiała mieć dziwną długość ...

Wyjaśnienie:

¿      if (
 ﹪      Modulo (
  Iθ      the input as number,
  ÷χ⁵      χ (predefined value: 10) divided by 5 = 2 ) [is 1])
 →θ      then print rightwards the input as string
Charlie
źródło
Drukujesz, a następnie poruszasz się w prawo; wydrukuj po prawej stronie →θ.
Neil,
@Neil oops, naprawione. Przynajmniej to nie unieważniło mojej odpowiedzi ... :-D
Charlie
3

kod maszynowy x86_64 (Linux), 12 11 bajtów

Niestety 0x80jest parzysty, ale i tak się udało (zakładając, że „nic nie robi” oznacza nie wracać):

0000000000000000 <odd>:
   0:   8d 07                   lea  (%rdi), %eax
   2:   83 e7 01                and    $0x1, %edi
   5:   83 ff 01                cmp    $0x1, %edi
   8:   75 fb                   jne       5  <odd+0x5>
   a:   c3                      retq

-1 bajt, dzięki @CodyGray!

Wypróbuj online!

ბიმო
źródło
1
Ponieważ jest to x86-64, lea (%edi),%eaxwymaga prefiksu wielkości nadpisania adresu ( 0x67), gdy źródłem jest rejestr 32-bitowy. Możesz to zrobić, robiąc to lea (%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.)
Cody Gray
Również naprawdę sprytne rozwiązanie dla TIO! Pomijam go w większości odpowiedzi na asm, ponieważ nie chciałem pisać całej tablicy na temat „stopki”, aby wydrukować wyjście w asm. W końcu się zepsułem i zrobiłem to innego dnia, ale jest to o wiele lepszy pomysł, pozwalający używać C do wszystkiego innego. Odtąd będę to kradł! :-)
Cody Gray
Pozdrawiam za wasz wkład, jestem kompletnym noobem przy montażu, ale wydawało się to dość łatwe! Ciekawy dla twojego rozwiązania. Och, podziękowania należą się @ceilingcat - sam to ukradłem;)
ბიმო
Tak naprawdę nie zapisałem ci bajtu… To, co masz teraz, ma nawet byte ( F6) dla JNEinstrukcji, 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życie OUTnieparzystych 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.
Cody Gray
W rzeczywistości jest to dość głupie wyzwanie, ponieważ żadne z rozsądnych rozwiązań nie działa. To naprawdę tylko testuje, jak dobrze znasz niewyraźne rogi zestawu instrukcji x86. Próbowałem nawet BTrodziny 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.
Cody Gray
3

Mathematica, 20 bajtów

Wydają się być pierwszym rozwiązaniem w języku nie golfowym.

a=1+1;g[i_/;!a\[Divides]i]=i

W MacintoshChineseTraditionalkodowaniu znaków. \[Divides]jest{161, 253} (2 bajty)

Alternatywna wersja (23 bajty)

\[CapitalAlpha]=1+1;\[CapitalGamma][\[CapitalChi]_/;\[CapitalAlpha]\[LeftFloor]\[CapitalChi]/\[CapitalAlpha]\[RightFloor]\[NotEqual]\[CapitalChi]]=\[CapitalChi]

lub (pokazany w Unicode)

Α=1+1;Γ[Χ_/;Α⌊Χ/Α⌋≠Χ]=Χ

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.

użytkownik202729
źródło
+1 bajt ( ;na końcu), jeśli liczba bajtów musi być parzysta; a \[Divides]także mają dziwny punkt kodowy Unicode.
user202729,
Nie potrzebujesz 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ć 2od \[LeftFloor]E\[RightFloor].
Martin Ender
@MartinEnder Uczyń Symbolpodłogę ważną, ale nie ma Eani \[ExponentialE].
user202729,
Obawiam się, że nie wolno ci używać znaków D; v; ani d, ponieważ mają parzystą wartość bajtową .. :(
Kevin Cruijssen
1
@KevinCruijssen \[Divides]to jeden znak w Mathematica, reprezentowany przez 2 bajty {161, 253}.
user202729,
3

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!

s//A_=Y[;A_=A_%O?A_W''/;y/#A-_/#-A/;s/[#-}]+/uc/ee;say

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 $_z A_=Y[;A_=A_%O?A_W'', a następnie y/#A-_/#-A/zastępuje znaki oparte na poniższej liście (powyżej char char staje poniżej):

#ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
#$%&'()*+,-./0123456789:;<=>?@A

które aktualizacje $_zawierają $_=<>;$_=$_%2?$_:''. Obok s/[#-}]+/uc/eezastępuje wszystkie znaki [#-}]+z uc. Bez /eetego byłby to tylko ciąg uc, ale /eeocenia zawartość ciągu dwa razy. Pierwsza ocena zwraca wynik uc, który jest wersją wielkiej litery, $_ale ponieważ $_nie zawiera znaków alfabetycznych, po prostu zwraca cały ciąg, a następnie drugi /eocenia 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, nazywamy say(co jest wymagane -Ezamiast -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.

s//_/g;s//uc/e;y/\x09-\x0b/_/;s/____/}[/;s/___/%C]/;s/_/{''H/;y/'{}1CDGH/'-)1-3+--/;s/[#-}]+/uc/ee

Zawiera zakładkę i pionową zakładkę w y///, oznaczoną jako \x09i \x0b.

Wypróbuj online!

Dom Hastings
źródło
2

LOGO , 390 46 52 50 bajtów

[ask    1   se[make]iseq    1-3 cos ?/ask   1[1/sum 1   179]?]

Jest 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:

show invoke [ask ... (paste code here) ... ] 5

wydajność

5

ponieważ 5 jest nieparzyste, i

invoke [ask ... (paste code here) ... ] 6

spowoduje błąd, ponieważ 6 jest parzyste.


użytkownik202729
źródło
2

TI-BASIC, 14 bajtów

Input Q
sinֿ¹(gcd(Q²,int(e
Q

Powoduje to błąd domeny (brak drukowania na ekranie głównym) na parzystej liczbie.

Input Q             Q is a variable with an odd code. We cannot use "Ans" as it's even.

            int(e   floor(e) = 2; "2" is even.
         Q²         Q may be negative, so we square it which preserves parity.
     gcd(Q²,int(e   1 if Q is odd; 2 if Q is even.
sinֿ¹(gcd(Q²,int(e   Error iff Q is even.

Q                   If there was no error, print Q.
lirtosiast
źródło
1

Pyth , 14 11 10 9 bajtów

I + Q_ + K / Q + 3_1KQ 
I! SIcQ + 3_1Q
 I! U + 1_GQ1Q
? u + 1_GQ1k

Zestaw testowy .

Leaky Nun
źródło
To sprytny sposób, ale czy coś takiego nie powinno I%Qy1Qrównież działać?
Jakube,
@Jakube Najwyraźniej nie rozgryzłem y1... %Niestety, nie jest to dozwolone.
Leaky Nun
Dlaczego nie? %ma wartość ascii 37 i jest nieparzysty.
Jakube,
3
@Jakube, ponieważ najwyraźniej zaufałem tej liście, którą zapewnił OP (co jest nie tak)
Leaky Nun
1

Japt , 4 bajty

u)çU

Japt korzysta z ISO / IEC 8859-1 , więc odpowiada to (dziesiętnie) 117 41 231 85.

Przetestuj online!

Wyjaśnienie

Uu)çU   Implicit: U = input integer
Uu)     Return Python-style U % (missing argument = 2). This gives 1 if U is odd, 0 if even.
   çU   Implicitly convert U to a string and repeat it that many times.
        Implicit: output result of last expression

Najpierw wypróbowałem rozwiązania przy użyciu p, w zasadzie çz odwrotnymi argumentami. Jednak pwykonuje 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.

ETHprodukcje
źródło
1

dc , 21 bajtów

[c]sa?kKKCI-1;1k%1!=a

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ącf polecenie debugowania na końcu programu, jak ma to miejsce na stronie TIO.

Wypróbuj online!

Wyjaśnienie

[    # Begin macro definition.
 c   # Clear the main stack.
]sa  # End macro definition and push the macro into register "a".
?k   # Prompt for input and store it into precision parameter "k".
KK   # Push two copies of the input to the main stack.
CI-  # Push C-I = 12-10 = 2 to the main stack  
1;1  # Push the value stored in the first index of array "1" (0 by default) 
     # to the main stack. 
k    # Push 0 into parameter "k" to reset the precision (otherwise the modulus 
     # function will not work correctly).
%    # Push the input (mod 2) to the main stack.
1!=a # If the input (mod 2) does not equal 1, execute the macro in register "a".
f    # OPTIONAL: Output the contents of the main stack.
R. Kap
źródło
1

TI-Basic, 18 bajtów

Zaoszczędzono 2 bajty dzięki lirtosiast

:Prompt Q
:While 5Q/ᴇ1-int(5Q/ᴇ1
:Q

w bajtach (+2 nowego wiersza = 3F)

:Prompt Q
 DD     51
:While 5Q/ᴇ1-int(5Q/ᴇ1
 D1    35 3B B1  35 3B  
        51 31     51 31
         83 71     83
:Q
 51

Zobacz http://tibasicdev.wikidot.com/one-byte-tokens

OK
źródło
1
Dlaczego nie skorzystać z fPart (?
lirtosiast
@lirtosiast wydaje się parzystym bajtem (BA = 186) według tibasicdev.wikidot.com/one-byte-tokens
Oki
Och, źle odczytałem, które wpisy były wierszami, a które kolumnami.
lirtosiast
1
Znalazłem Input Q[newline]sinֿ¹(gcd(Q²,int(e[newline]Q(14 bajtów). Czy mogę opublikować jako osobną odpowiedź?
lirtosiast
@lirtosiast Wow! Jest zdecydowanie wystarczająco inny, aby uzyskać osobną odpowiedź. Uwielbiam to
Oki,
0

Bash , 31 bajtów

read a
[ $[a%2] = 0 ] ||echo $a

Wypróbuj online!

Wyjaśnienie:

read a                   reading the input and define it on the variable a
[ $[a%2] = 0 ]      outputs exit status 0 when a/2 is 0 and exit status 1 if not.
||                           evaluates only when the exit status left of it is 1
echo $a                displays the variable a
ADDB
źródło
Wygląda na to, że przegapiłeś, że jest to ograniczone wyzwanie źródłowe - używasz zabronionych bajtów. ( rd $20|hi nowa linia.)
Ørjan Johansen
@ ØrjanJohansen naprawiono, jak sądzę
ADDB
2
Yyy ... nie. Długość programu nie jest ograniczona, ale każdy znak musi mieć nieparzystą wartość bajtu.
Ørjan Johansen