Aku bahkan tidak ... Aku hanya aneh!

36

Tugas Anda sederhana: tulis sebuah program yang menerima integer sebagai input dan output jika itu aneh, dan tidak melakukan apa pun sebaliknya (tidak berhenti diperbolehkan). Tantangannya adalah, Anda hanya dapat menggunakan byte aneh.

Anda secara opsional dapat menambahkan baris tambahan ke output.

Ini adalah kode-golf, jawaban tersingkat dalam kemenangan (ganjil) byte.

Celah standar dilarang. Selain itu, Anda tidak dapat menggunakan versi bahasa, yang lebih baru daripada memposting tantangan ini.

Contoh input> output:

13 > 13

42 >

M.Herzkamp
sumber
10
Saya menurunkan tantangan ini karena ini adalah tantangan "Lakukan X tanpa Y".
Leaky Nun
4
Apa sebenarnya does nothing otherwiseartinya? Di Haskell, fungsi dengan tipe Int -> Int mengembalikan integer atau tidak menghentikan atau melempar beberapa kesalahan. Jika inputnya bahkan seharusnya tidak dikembalikan, maka tidak akan menghentikan atau melempar kesalahan dalam hal ini dapat diterima?
Laikoni
2
Jika Anda ingin tahu apakah Anda dapat menggunakan kode sumber Anda, coba skrip ini di konsol browser Anda. Buat charset valid: alphabet=new Set(Array(256).fill(0).map((v,i)=>i).filter(v=>v%2).map(String.fromCharCode));. Periksa apakah sumber yang valid: [..."SOURCE CODE"].every(v=>alphabet.has(v)). Lihat karakter yang tidak valid dalam sumber: [...new Set("SOURCE CODE")].filter(v=>!alphabet.has(v)). Ingatlah untuk menghindari kutipan Anda, "=> \";)
kamoroso94
14
@LeakyNun "do X without Y" tidak merujuk pada tantangan sumber terbatas umum , tetapi tantangan yang melarang Anda untuk menggunakan fitur bahasa tertentu. Tantangan ini bukan itu dan juga tidak ada masalah yang membuat tantangan "lakukan X tanpa Y" menjadi masalah.
Martin Ender
1
@Laikoni Karena sudah ada beberapa jawaban yang masuk ke loop tak terbatas, saya akan mengatakan bahwa tidak apa-apa untuk menunjukkan perilaku seperti itu. Tidak kembali dapat diartikan sebagai tidak melakukan apa-apa.
M.Herzkamp

Jawaban:

1

Japt -f , 1 byte

u

umemiliki nilai kode-char 117.

Cobalah

Oliver
sumber
1
Terlambat ke pesta, tapi ... jawabanku!
M.Herzkamp
67

Lenguage , 645529908926937253684695788965635909332404360034079 9394157991500940492270727190763049448735 1174269748937617561533841898064735499551 2293382937520069758100171520285996319 byte

Itu kira-kira sama dengan 2 duodecillion byte.

File diterjemahkan ke program brainfuck berikut:

,[<<+>+>-]<[>>+<<-]+>>[-[->]<]<[<[<]>.<]

Mengambil input sebagai kode ASCII, dengan nilai maksimum 256. Menggunakan pembungkus.

Okx
sumber
@Okx Kesalahan saya. Tapi kenapa tidak Anda gunakan saja ,[<<+>+>-]<[>>+<<-]+>>[-[->]<]<[<[<]>.<]?
user202729
1
Bagaimana dengan ,[[>]++[-<]<+>>]>[<<<.<]hanya 3452857532394791089951 byte?
Jo King
Sebenarnya, karena loop tak terbatas diizinkan, ,-[-->++<]>+.berfungsi juga
Jo King
20

Kode Mesin x86-64, 8 byte

Terinspirasi oleh solusi Bruce Forte , tetapi sedikit di bawah 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

Parameter integer tunggal diambil dalam EDIregister, mengikuti konvensi pemanggilan Sistem V AMD64.

Salinan nilai ini awalnya dibuat, dan dimasukkan ke EAXdalamnya sehingga dapat dikembalikan jika sesuai. ( LEAdigunakan alih-alih yang normal MOVkarena kita memerlukan instruksi dengan byte aneh.)

Kemudian, nilai dalam EDIdigeser ke kanan dengan 1, yang menempatkan bit yang dialihkan ke bendera pembawa (CF). Bit ini akan menjadi 0 jika angkanya genap, atau 1 jika ganjil.

Kami kemudian menguji CF menggunakan JNCinstruksi, yang akan bercabang hanya jika CF adalah 0 (yaitu, angkanya genap). Ini berarti bahwa kita akan masuk ke loop tak terbatas untuk nilai genap. Untuk nilai ganjil, kami melewati dan nilai asli (dalam EAX) dikembalikan.

Ada sedikit trik dengan JNCinstruksinya, tetapi itu memiliki REPawalan! Biasanya, REPawalan hanya digunakan dengan instruksi string, tetapi karena manual Intel dan AMD sama-sama setuju bahwa REPawalan yang tidak relevan / berlebihan / berlebihan diabaikan, kami melemparkan satu pada instruksi cabang di sini untuk membuatnya panjang 3 byte. Dengan begitu, offset relatif yang disandikan dalam instruksi lompat juga aneh. (Dan, tentu saja, REPitu sendiri merupakan awalan byte aneh.)

Syukurlah RETdikodekan menggunakan byte aneh!

Cobalah online!


Jika Anda tidak berpikir mengembalikan nilai jika itu aneh atau masuk ke loop tak terbatas jika itu genap (sehingga Anda tidak pernah kembali) memenuhi persyaratan "output" dari tantangan, atau Anda hanya menginginkan sesuatu yang lebih menarik, inilah fungsi yang menampilkan nilai ke port serial (tetapi hanya jika itu aneh, tentu saja).

x86-64 Kode Mesin (output ke port serial), 17 byte

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

Apa yang membuat ini sedikit lebih menarik adalah bahwa kode melakukan lebih banyak , yang berarti lebih sulit untuk melakukan semuanya menggunakan instruksi yang disandikan menggunakan hanya byte aneh. Tentu saja, ini juga berarti gagal pada kode golf, jadi ini semacam pertukaran - apakah Anda ingin menarik dan menantang, atau Anda ingin pendek?

Bagaimanapun, ini menggunakan OUTinstruksi x86 untuk menulis ke port I / O 0x3F8, yang merupakan port serial standar COM1 pada PC. Bagian yang menyenangkan, tentu saja, adalah bahwa semua port I / O standar (serial dan paralel) memiliki alamat genap, sehingga mereka tidak dapat dengan mudah dikodekan sebagai OUTinstruksi langsung atau dipindahkan langsung ke register. Anda harus menginisialisasi dengan satu kurang dari nilai aktual, dan kemudian menambah nilai dalam register. Anda juga dibatasi untuk menggunakan register tertentu untuk manipulasi karena Anda memerlukan register yang dikodekan menggunakan byte aneh dalam instruksi ketika digunakan sebagai operan.

Juga, saya harus menginisialisasi DXregister (melalui CXregister) di bagian atas loop, meskipun ini hanya diperlukan jika nilainya ganjil, untuk memastikan bahwa JNCinstruksi akan memiliki offset ganjil. Namun, karena apa yang kita lewati adalah OUTinstruksi, semua kode ini lakukan adalah siklus limbah dan register awal clobber; itu sebenarnya tidak menghasilkan apa-apa, jadi itu tidak melanggar aturan.

Akhirnya, fungsi ini akan kembali (setelah selesai atau tidak melakukan output ke port serial) dengan nilai input tersisa EAX. Tapi itu tidak benar-benar melanggar aturan apa pun; semua fungsi dalam bahasa assembly akan kembali dengan nilai dalam EAX— pertanyaannya adalah apakah itu nilai yang signifikan atau nilai sampah . Itu ditentukan oleh dokumentasi fungsi (pada dasarnya, apakah mengembalikan nilai atau mengembalikan void), dan dalam hal ini, saya mendokumentasikannya sebagai tidak mengembalikan nilai. :-)

Tidak ada tautan TIO untuk yang ini, karena tidak menerapkan output ke port serial. Anda akan membutuhkan besi asli, atau imajinasi.

Cody Grey
sumber
+1 untuk penjelasannya! Mengapa Anda bisa menggunakan mov di baris kedua tetapi tidak di baris pertama?
M.Herzkamp
Selain mengkodekan bahwa itu adalah MOVinstruksi, operandnya juga harus dikodekan dalam byte. Dalam hal ini, itu akan menjadi register sumber dan tujuan (meskipun operan juga bisa menjadi nilai langsung, yang seperti konstanta). Register yang berbeda memetakan ke byte yang berbeda, dan beberapa di antaranya bahkan genap. Jadi, misalnya, apa yang ingin saya gunakan adalah mov eax, edi, tetapi itu 89 F8dalam byte. Lihat cara lebih dari yang Anda pernah ingin tahu tentang pengkodean di sini, di bawah bagian "kode" . @ M.Herzkamp
Cody Gray
19

Jelly , 2 byte

ẋḂ

Karakter-karakter ini sesuai dengan byte 0xF7 dan 0xBF di halaman kode Jelly .

Cobalah online!

Dennis
sumber
5
Akan memalukan jika solusi ini bahkan dengan hitungan byte memenangkan tantangan ... solusi 1 byte siapa pun?
M.Herzkamp
9

05AB1E , 3 byte

Éi=

Kode sesuai dengan nilai byte C9,69,3Datau 201,105,61yang semuanya aneh.

Cobalah online!

Penjelasan

É     # input % 2 == 1
 i    # if true
  =   # print without popping
Emigna
sumber
= # print without newlineitu sebenarnya dicetak dengan baris baru tanpa muncul
Erik the Outgolfer
@EriktheOutgolfer: Benar. Saya akan memperbaiki penjelasannya.
Emigna
Sayangnya, É×sepertinya tidak berfungsi):
kalsowerus
@kalsowerus: Ya, saya juga memperhatikan itu. Bekerja dengan benar dengan Ddi depan, tetapi itu bahkan dan tidak lebih pendek. Alasan tidak berhasil adalah bahwa input implisit yang diulang diambil sebagai argumen ke-2.
Emigna
@Emigna tetapi yang aneh adalah, menukar dua nilai teratas pada stack dua kali, membuatnya bekerja juga ...
kalsowerus
5

MATL , 3 byte

o?G

MATL menggunakan karakter ASCII, sehingga o?Gbersesuaian dengan byte (dalam desimal) 111, 63, 71.

Cobalah online!

Penjelasan

o     % Push (implicit) input modulo 2
?     % If nonzero
  G   %   Push input
      % End (implicit)
      % Display stack contents (implicit)
Luis Mendo
sumber
5

Haskell , 36 33 byte

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

Cobalah online!

Penggunaan: o 7yiedl 7, o 8memasuki loop tak terbatas.

Algoritma yang sebenarnya adalah

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

Masalah pertama yang saya hadapi adalah kurangnya ruang dan (, karena fungsi oyang mengambil argumen mbiasanya didefinisikan sebagai o m=...atau o(m)=.... Namun saya menemukan bahwa komentar inline {- some comment -}berfungsi sebagai token delimiter juga, jadi definisi o{--}m=...dimungkinkan berdasarkan aturan yang diberikan. Sunting: Ørjan Johansen menunjukkan bahwa seseorang dapat menggunakan karakter tab alih-alih spasi, menghemat tiga byte: o m=...

Masalah kedua adalah panggilan rekursif o(m-2). -2hanya -1-1, tetapi di sini trik komentar tidak berfungsi karena tanda kurung diperlukan. Aku tetap ini dengan membiarkan pekerjaan fungsi pada daftar tunggal yang berisi nomor: o[m-2]Namun, karena ini bukan cara standar memberikan masukan, saya outsourcing perhitungan untuk fungsi pembantu cyang bekerja pada daftar dan panggilan cdari oyang memiliki format yang benar .

Laikoni
sumber
Anda dapat menggunakan tab alih-alih spasi.
Ørjan Johansen
@ ØrjanJohansen saya dapat memastikan bahwa ia bekerja dengan \tbukan {--}.
Buah Esolanging
@ ØrjanJohansen Terima kasih, itu baik untuk diketahui.
Laikoni
5

Python REPL, 38 byte

Mengambil input sebagai nilai dari ekspresi sebelumnya menggunakan _. Output akan berupa string (representasi string dari integer untuk odd, atau string kosong untuk genap).

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

Cobalah online

Untuk menjalankannya di shell aktual, Anda dapat mencobanya di sini . Ketikkan input, tekan enter. Rekatkan kode, tekan enter.

Penjelasan:

Butuh beberapa saat untuk mencari tahu. Tidak ada perkalian, tidak ada percabangan, tidak ada pengirisan, tidak ada koma, tidak ada periode, tidak ada impor, tidak ada tanda kurung, tidak exec, tidak eval, tidak print, tidak , dan tidak ada fungsi. Saya punya satu solusi yang berfungsi menggunakan stderr, tetapi kemudian saya menyadari bahwa kami harus mengeluarkan integer yang sebenarnya, bukan hanya nilai truey / falsey.

Saya menggunakan tanda kurung dengan tanda kurung [expression][-1]. Penyederhanaan yang mengubah kode di atas menjadi '%s'%(['']+[_])[_%(1+1)].

Karena tidak ada koma, saya menggunakan daftar tambahan untuk membuat ['',_]. Menggunakan pemformatan string, hasil yang diinginkan diperoleh.

mbomb007
sumber
Pujian. Sebagai bonus, ini juga berfungsi untuk Ruby IRB :) Nitpick: apakah boleh mengembalikan string untuk nomor ganjil, apakah boleh mengembalikan string kosong untuk nomor genap?
Eric Duminil
Tidak melakukan apa-apa dan mencetak atau mengembalikan tidak ada yang sama, saya pikir. Di satu sisi, string kosong bukanlah apa-apa.
mbomb007
Ya, saya benar-benar gila. Masih mengembalikan string, bukan apa-apa. Dalam Python REPL, saya akan mengatakan itu Noneakan menjadi pertandingan yang lebih baik daripada ''. Ngomong-ngomong, itu masih 10.000 kali lebih baik dari apa pun yang bisa saya pikirkan.
Eric Duminil
@EricDuminil saya bisa kembali False. Idk bagaimana Anda bisa mendapatkannya None.
mbomb007
4

CJam, 6 byte

q_iY%%

113 95 105 89 37 37

Program ini mengambil mod 2 dari input (sebut saja r ) dan mencetak setiap karakter ke- r dalam string input. Jika nomor inputnya ganjil, ia mencetak seluruh string, tetapi jika diminta untuk mencetak setiap karakter ke-0, program melempar kesalahan.

Coba di sini

geokavel
sumber
Bagus! Saya akan memposting qi_Y%]W%{}/M?dan kemudian saya melihat ini.
Buah Esolanging
4

Cubix , 23 19 17 byte

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

Cobalah!

@, yang mengakhiri program Cubix, adalah ascii 64, jadi sayangnya ini sebenarnya hanya memasuki loop tak terbatas setelah pengujian untuk keanehan. Tidak ada tautan TIO karena akan habis waktu.

= (ascii 61) adalah no-op di Cubix.

Ini adalah sedikit modifikasi dari algoritma sebelumnya (# byte yang sama) yang sebenarnya bekerja untuk bilangan bulat negatif.

Versi kubus:

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

Algoritma:

  • I (73) : baca input sebagai nomor
  • 1 (49) : push 1
  • ) (41) : peningkatan
  • % (37) : ambil mod
  • / (47) : belok kiri
  • ! (33) : lewati instruksi berikutnya jika ganjil
    • 1;;/; ;adalah (59): menyiapkan tumpukan untuk keluaran
    • O (79) : Output sebagai angka.
    • Kemudian masuk kembali algoritma tetapi Imembaca 0untuk akhir input, jadi kami dijamin untuk memasuki cabang genap
  • u (117) : belok kanan
  • ;;;!I : loop, secara efektif tidak melakukan apa pun.
Giuseppe
sumber
@MickyT yang gagal untuk input negatif, itulah sebabnya saya menghindari penggunaan?
Giuseppe
Maaf, saya tidak memeriksanya dengan benar
MickyT
3

Arang , 9 byte

¿﹪Iθ÷χ⁵→θ

Cobalah online!

Pada dasarnya ia mencetak input ke kanan jika bukan kelipatan 10/5 ( ²char bahkan ada di halaman kode Charcoal ). Karakter yang digunakan adalah:

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

Sebenarnya mendekati akhir adalah mubazir tetapi kemudian saya melihat bahwa jawabannya harus memiliki panjang yang aneh ...

Penjelasan:

¿      if (
 ﹪      Modulo (
  Iθ      the input as number,
  ÷χ⁵      χ (predefined value: 10) divided by 5 = 2 ) [is 1])
 →θ      then print rightwards the input as string
Charlie
sumber
Anda mencetak dan kemudian bergerak ke kanan; mencetak dengan benar akan menjadi →θ.
Neil
@Neil oops, diperbaiki. Setidaknya itu tidak membatalkan jawaban saya ... :-D
Charlie
3

kode mesin x86_64 (Linux), 12 11 byte

Sayangnya 0x80bahkan, tetapi masih berhasil (dengan asumsi "tidak melakukan apa-apa" berarti tidak kembali):

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 byte, terima kasih @CodyGray!

Cobalah online!

ბიმო
sumber
1
Karena ini x86-64, lea (%edi),%eaxmemerlukan awalan ukuran alamat override ( 0x67) ketika sumbernya adalah register 32-bit. Anda dapat menghilangkannya dengan melakukan lea (%rdi),%eax. Itu menghemat satu byte, dan sebenarnya akan membuat kode sedikit lebih efisien (awalan memperlambat decoding dan mengisi i-cache). Ada beberapa hal lain yang dapat Anda lakukan untuk mempersingkat ini lebih lanjut, tetapi itu pada dasarnya merupakan penulisan ulang yang lengkap, jadi saya akan memposting jawaban saya sendiri. :-) Saya sudah membatalkan ini juga, tentu saja! (Oh, baru sadar Anda mungkin menggunakan awalan untuk membuat lompatan offset aneh. Nah, Anda akan membutuhkan lebih banyak sihir.)
Cody Gray
Juga, solusi yang sangat pintar untuk TIO! Saya telah melewatkannya di sebagian besar jawaban asm saya karena saya tidak ingin menulis semua pelat di "footer" untuk mencetak hasil dalam asm. Saya akhirnya mogok dan melakukannya beberapa hari yang lalu, tetapi ini adalah ide yang jauh lebih baik, memungkinkan Anda untuk menggunakan C untuk yang lainnya. Saya akan mencuri ini mulai sekarang! :-)
Cody Grey
Terima kasih atas masukan Anda, saya seorang noob yang lengkap di pertemuan tetapi ini tampaknya cukup mudah! Penasaran dengan solusi Anda. Oh, kredit jatuh ke @ceilingcat - Saya mencurinya sendiri;)
ბიმო
Sebenarnya saya tidak menyelamatkan Anda satu byte ... Apa yang Anda miliki sekarang memiliki byte ( F6) untuk JNEinstruksi karena memiliki offset genap. Itulah yang saya maksudkan dengan tanda kurung terakhir yang saya edit pada komentar pertama saya. Anda sebenarnya membutuhkan awalan itu untuk membuat perataan yang aneh. Atau Anda harus menulis ulang kode dengan cara lain. Saya bermain dengan banyak variasi yang berbeda. Saya benar-benar melihat ini tadi malam dan berusaha mencari cara yang baik untuk menggunakan OUTuntuk menghasilkan nilai ganjil, tetapi tidak ada solusi yang baik benar-benar terjadi pada saya. Wawasan di sini bagi saya adalah masuk ke loop tak terbatas untuk nilai genap.
Cody Grey
Sebenarnya ini adalah tantangan yang konyol, karena tidak ada solusi yang masuk akal yang berhasil. Ini benar-benar hanya menguji seberapa baik Anda mengetahui sudut tidak jelas dari set instruksi x86. Saya bahkan mencoba BTkeluarga instruksi, yang tidak pernah digunakan siapa pun (sayangnya, semua penyandian register bahkan byte). Saya pikir mungkin lebih menarik untuk menulis kode yang output ke port serial, daripada hanya mengembalikan nilai atau apa pun, tetapi itu tidak jack byte dihitung di sana (terutama karena alamat port serial di hex bahkan!), Jadi saya menyerah padanya.
Cody Gray
3

Mathematica, 20 byte

Tampaknya menjadi solusi pertama dalam bahasa non-golf.

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

Dalam MacintoshChineseTraditionalpengkodean karakter. \[Divides]aku s{161, 253} (2 byte)

Versi alternatif (23 byte)

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

atau (ditunjukkan dalam Unicode)

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

di Symbol pengkodean karakter. (gunakan hanya karakter 1-byte)

Solusinya mendefinisikan fungsi g(atau Γ) itu, mengevaluasi input ketika input ganjil, dan secara harfiah "tidak melakukan apa-apa" (tidak mengevaluasi) ketika inputnya genap.

pengguna202729
sumber
+1 byte ( ;di akhir) jika jumlah byte harus genap; dan \[Divides]juga memiliki codepoint Unicode yang aneh.
user202729
Anda tidak perlu I[1+1], Anda bisa menggunakannya {1+1}. Juga, sudahkah Anda memeriksa apakah byte dari bracket lantai valid? Jika demikian, Anda dapat memperoleh 2dari \[LeftFloor]E\[RightFloor].
Martin Ender
@ MartinEnder Hanya Symbolmembuat lantai valid, tetapi tidak memiliki Eatau tidak \[ExponentialE].
user202729
Saya khawatir Anda tidak diizinkan menggunakan karakter D; v; juga d, karena mereka memiliki nilai byte yang bahkan .. :(
Kevin Cruijssen
1
@KevinCruijssen \[Divides]adalah satu karakter tunggal di Mathematica, yang diwakili oleh 2 byte {161, 253}.
user202729
3

Perl, 54 byte

Membutuhkan -E.

Saya benar-benar menikmati tantangan ini, saya pikir saya ingin mencoba dan meningkatkan jawaban ini, tetapi saya pikir itu mungkin yang paling singkat yang bisa saya buat untuk saat ini. Saya sudah bermain-main dengan jawaban ini selama beberapa hari sekarang, tetapi saya merasa senang dengan solusi 54 byte!

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

Cobalah online!

Penjelasan

Secara default, sebagian besar fungsi string Perl berfungsi $_ , yang kosong untuk memulai.

Pertama, s//A_=Y[;A_=A_%O?A_W''/ganti string kosong $_dengan A_=Y[;A_=A_%O?A_W'', lalu y/#A-_/#-A/ganti karakter berdasarkan daftar berikut (karakter di atas menjadi karakter di bawah):

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

pembaruan mana yang $_mengandung $_=<>;$_=$_%2?$_:''. Selanjutnya s/[#-}]+/uc/eemenggantikan semua karakter [#-}]+dengan uc. Tanpa /eeini hanya akan menjadi string uc, tetapi /eemengevaluasi isi dari string dua kali. Evaluasi pertama mengembalikan hasil uc, yang merupakan versi huruf besar dari $_tetapi karena $_tidak mengandung karakter alfabet, ini hanya mengembalikan seluruh string, kemudian yang kedua /emengevaluasi string lagi, yang mengatur $_ke salah satu$_ (nomor input) atau ''tergantung pada apakah atau bukan angkanya ganjil atau genap.

Akhirnya, karena $_sekarang berisi apa yang kita inginkan, kita panggil say(yang mana yang mengharuskan, -Ebukan -e) yang mencetak$_ diikuti oleh baris baru.


Alternatif Perl, 93 byte

92 byte kode +1 untuk -p, yang saya rasa akan membuatnya tidak bersaing.

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

Berisi tab dan tab vertikal di y///, ditunjukkan sebagai \x09dan \x0b.

Cobalah online!

Dom Hastings
sumber
2

LOGO , 390 46 52 50 byte

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

Itu adalah daftar templat yang mengembalikan input jika inputnya ganjil, dan menyebabkan kesalahan jika inputnya genap.

Pemakaian:

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

keluaran

5

karena 5 aneh, dan

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

akan menyebabkan kesalahan karena 6 genap.


pengguna202729
sumber
2

TI-BASIC, 14 byte

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

Ini menimbulkan kesalahan domain (tidak mencetak apa pun ke layar beranda) pada nomor genap.

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
sumber
1

Pyth , 14 11 10 9 byte

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

Suite uji .

Biarawati Bocor
sumber
Itu cara yang cerdas, tetapi bukankah sesuatu seperti I%Qy1Qjuga berfungsi?
Jakube
@ Jakube Saya jelas tidak tahu y1... Namun, %tidak diizinkan, sayangnya.
Leaky Nun
Kenapa tidak? %memiliki nilai ascii 37 dan ganjil.
Jakube
3
@ Jakube karena rupanya saya percaya dalam daftar ini OP yang disediakan (yang salah)
Leaky Nun
1

Japt , 4 byte

u)çU

Japt menggunakan ISO / IEC 8859-1 , jadi ini sesuai dengan (dalam desimal)117 41 231 85 .

Uji secara online!

Penjelasan

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

Saya pertama kali mencoba menggunakan solusi p, yang pada dasarnya çdengan argumen terbalik. Namun, plakukan eksponensial jika argumen kirinya adalah angka, jadi kita perlu mengubahnya secara eksplisit menjadi string. Solusi ini ternyata benar-benar satu byte lebih pendek, selain tidak mengandung byte aneh.

Produksi ETH
sumber
1

dc , 21 byte

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

Desimal: 91 99 93 115 97 63 107 75 75 67 73 45 49 59 49 107 37 49 33 61 97

Sesuai ini standar IO , program ini meninggalkan input pada tumpukan utama jika aneh dan mengosongkan tumpukan sebaliknya. Ini dapat dikonfirmasi dengan menambahkanf perintah debug ke akhir program seperti halnya pada halaman TIO.

Cobalah online!

Penjelasan

[    # 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
sumber
1

TI-Basic, 18 byte

Disimpan 2 byte berkat lirtosiast

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

dalam byte (+2 baris baru = 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

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

Oki
sumber
1
Mengapa tidak menggunakan fPart (?
lirtosiast
@ lirtosiast tampaknya byte yang genap (BA = 186) menurut tibasicdev.wikidot.com/one-byte-tokens
Oki
Oh, saya salah membaca entri mana yang merupakan baris dan yang merupakan kolom.
lirtosiast
1
Saya menemukan Input Q[newline]sinֿ¹(gcd(Q²,int(e[newline]Q(14 byte). Bolehkah saya memposting sebagai jawaban terpisah?
lirtosiast
@ lirtosiast Wow! Jelas cukup berbeda untuk jawaban yang terpisah. Love it
Oki
1

MathGolf , 3 byte

¥{k

Cobalah online!

Bytes yang digunakan adalah 157, 123, 107 .

Penjelasan

¥     Input modulo 2
 {    Loop that many times
  k   Push input
Jo King
sumber
0

Bash , 31 byte

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

Cobalah online!

Penjelasan:

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
sumber
Anda sepertinya melewatkan bahwa ini adalah tantangan sumber terbatas - Anda menggunakan byte terlarang. ( rd $20|hdan baris baru.)
Ørjan Johansen
@ ØrjanJohansen memperbaiki saya kira
ADDB
2
Um no. Tidak ada batasan pada panjang program, tetapi setiap karakter di dalamnya harus memiliki nilai byte ganjil.
Ørjan Johansen