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
>
code-golf
restricted-source
M.Herzkamp
sumber
sumber
does nothing otherwise
artinya? Di Haskell, fungsi dengan tipeInt -> 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?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,"
=>\"
;)Jawaban:
Japt
-f
, 1 byteu
memiliki nilai kode-char117
.Cobalah
sumber
Lenguage ,
645529908926937253684695788965635909332404360034079939415799150094049227072719076304944873511742697489376175615338418980647354995512293382937520069758100171520285996319 byteItu kira-kira sama dengan 2 duodecillion byte.
File diterjemahkan ke program brainfuck berikut:
Mengambil input sebagai kode ASCII, dengan nilai maksimum 256. Menggunakan pembungkus.
sumber
,[<<+>+>-]<[>>+<<-]+>>[-[->]<]<[<[<]>.<]
?,[[>]++[-<]<+>>]>[<<<.<]
hanya 3452857532394791089951 byte?,-[-->++<]>+.
berfungsi jugaKode Mesin x86-64, 8 byte
Terinspirasi oleh solusi Bruce Forte , tetapi sedikit di bawah par. :-)
Parameter integer tunggal diambil dalam
EDI
register, mengikuti konvensi pemanggilan Sistem V AMD64.Salinan nilai ini awalnya dibuat, dan dimasukkan ke
EAX
dalamnya sehingga dapat dikembalikan jika sesuai. (LEA
digunakan alih-alih yang normalMOV
karena kita memerlukan instruksi dengan byte aneh.)Kemudian, nilai dalam
EDI
digeser 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
JNC
instruksi, 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 (dalamEAX
) dikembalikan.Ada sedikit trik dengan
JNC
instruksinya, tetapi itu memilikiREP
awalan! Biasanya,REP
awalan hanya digunakan dengan instruksi string, tetapi karena manual Intel dan AMD sama-sama setuju bahwaREP
awalan 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,REP
itu sendiri merupakan awalan byte aneh.)Syukurlah
RET
dikodekan 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
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
OUT
instruksi 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 sebagaiOUT
instruksi 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
DX
register (melaluiCX
register) di bagian atas loop, meskipun ini hanya diperlukan jika nilainya ganjil, untuk memastikan bahwaJNC
instruksi akan memiliki offset ganjil. Namun, karena apa yang kita lewati adalahOUT
instruksi, 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 dalamEAX
— pertanyaannya adalah apakah itu nilai yang signifikan atau nilai sampah . Itu ditentukan oleh dokumentasi fungsi (pada dasarnya, apakah mengembalikan nilai atau mengembalikanvoid
), 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.
sumber
MOV
instruksi, 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 adalahmov eax, edi
, tetapi itu89 F8
dalam byte. Lihat cara lebih dari yang Anda pernah ingin tahu tentang pengkodean di sini, di bawah bagian "kode" . @ M.HerzkampJelly , 2 byte
Karakter-karakter ini sesuai dengan byte 0xF7 dan 0xBF di halaman kode Jelly .
Cobalah online!
sumber
05AB1E , 3 byte
Kode sesuai dengan nilai byte
C9,69,3D
atau201,105,61
yang semuanya aneh.Cobalah online!
Penjelasan
sumber
= # print without newline
itu sebenarnya dicetak dengan baris baru tanpa munculÉ×
sepertinya tidak berfungsi):D
di depan, tetapi itu bahkan dan tidak lebih pendek. Alasan tidak berhasil adalah bahwa input implisit yang diulang diambil sebagai argumen ke-2.MATL , 3 byte
MATL menggunakan karakter ASCII, sehingga
o?G
bersesuaian dengan byte (dalam desimal)111
,63
,71
.Cobalah online!
Penjelasan
sumber
Haskell ,
3633 byteCobalah online!
Penggunaan:
o 7
yiedl7
,o 8
memasuki loop tak terbatas.Algoritma yang sebenarnya adalah
Masalah pertama yang saya hadapi adalah kurangnya ruang dan
(
, karena fungsio
yang mengambil argumenm
biasanya didefinisikan sebagaio m=...
atauo(m)=...
. Namun saya menemukan bahwa komentar inline{- some comment -}
berfungsi sebagai token delimiter juga, jadi definisio{--}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)
.-2
hanya-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 pembantuc
yang bekerja pada daftar dan panggilanc
dario
yang memiliki format yang benar .sumber
\t
bukan{--}
.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).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
, tidakeval
, tidakprint
, 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.sumber
None
akan menjadi pertandingan yang lebih baik daripada''
. Ngomong-ngomong, itu masih 10.000 kali lebih baik dari apa pun yang bisa saya pikirkan.False
. Idk bagaimana Anda bisa mendapatkannyaNone
.CJam, 6 byte
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
sumber
qi_Y%]W%{}/M?
dan kemudian saya melihat ini.Cubix ,
231917 byteCobalah!
@
, 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:
Algoritma:
I
(73)
: baca input sebagai nomor1
(49)
: push 1)
(41)
: peningkatan%
(37)
: ambil mod/
(47)
: belok kiri!
(33)
: lewati instruksi berikutnya jika ganjil1;;/;
;
adalah(59)
: menyiapkan tumpukan untuk keluaranO
(79)
: Output sebagai angka.I
membaca0
untuk akhir input, jadi kami dijamin untuk memasuki cabang genapu
(117)
: belok kanan;;;!I
: loop, secara efektif tidak melakukan apa pun.sumber
?
Arang , 9 byte
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:¿
: kodeBF
.﹪
: kodeA5
.I
: kodeC9
.θ
: kodeF1
.÷
: kodeAF
.χ
: kodeE3
.⁵
: kodeB5
.→
: kode13
.Sebenarnya
→
mendekati akhir adalah mubazir tetapi kemudian saya melihat bahwa jawabannya harus memiliki panjang yang aneh ...Penjelasan:
sumber
→θ
.kode mesin x86_64 (Linux),
1211 byteSayangnya
0x80
bahkan, tetapi masih berhasil (dengan asumsi "tidak melakukan apa-apa" berarti tidak kembali):-1 byte, terima kasih @CodyGray!
Cobalah online!
sumber
lea (%edi),%eax
memerlukan awalan ukuran alamat override (0x67
) ketika sumbernya adalah register 32-bit. Anda dapat menghilangkannya dengan melakukanlea (%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.)F6
) untukJNE
instruksi 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 menggunakanOUT
untuk 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.BT
keluarga 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.Mathematica, 20 byte
Tampaknya menjadi solusi pertama dalam bahasa non-golf.
Dalam
MacintoshChineseTraditional
pengkodean karakter.\[Divides]
aku s{161, 253}
(2 byte)Versi alternatif (23 byte)
atau (ditunjukkan dalam Unicode)
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.sumber
;
di akhir) jika jumlah byte harus genap; dan\[Divides]
juga memiliki codepoint Unicode yang aneh.I[1+1]
, Anda bisa menggunakannya{1+1}
. Juga, sudahkah Anda memeriksa apakah byte dari bracket lantai valid? Jika demikian, Anda dapat memperoleh2
dari\[LeftFloor]E\[RightFloor]
.Symbol
membuat lantai valid, tetapi tidak memilikiE
atau tidak\[ExponentialE]
.D
;v
; jugad
, karena mereka memiliki nilai byte yang bahkan .. :(\[Divides]
adalah satu karakter tunggal di Mathematica, yang diwakili oleh 2 byte{161, 253}
.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!
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$_
denganA_=Y[;A_=A_%O?A_W''
, laluy/#A-_/#-A/
ganti karakter berdasarkan daftar berikut (karakter di atas menjadi karakter di bawah):pembaruan mana yang
$_
mengandung$_=<>;$_=$_%2?$_:''
. Selanjutnyas/[#-}]+/uc/ee
menggantikan semua karakter[#-}]+
denganuc
. Tanpa/ee
ini hanya akan menjadi stringuc
, tetapi/ee
mengevaluasi isi dari string dua kali. Evaluasi pertama mengembalikan hasiluc
, yang merupakan versi huruf besar dari$_
tetapi karena$_
tidak mengandung karakter alfabet, ini hanya mengembalikan seluruh string, kemudian yang kedua/e
mengevaluasi 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 panggilsay
(yang mana yang mengharuskan,-E
bukan-e
) yang mencetak$_
diikuti oleh baris baru.Alternatif Perl, 93 byte
92 byte kode +1 untuk
-p
, yang saya rasa akan membuatnya tidak bersaing.Berisi tab dan tab vertikal di
y///
, ditunjukkan sebagai\x09
dan\x0b
.Cobalah online!
sumber
LOGO ,
390465250 byteItu adalah daftar templat yang mengembalikan input jika inputnya ganjil, dan menyebabkan kesalahan jika inputnya genap.
Pemakaian:
keluaran
karena 5 aneh, dan
akan menyebabkan kesalahan karena 6 genap.
sumber
TI-BASIC, 14 byte
Ini menimbulkan kesalahan domain (tidak mencetak apa pun ke layar beranda) pada nomor genap.
sumber
Pyth ,
1411109 byteSuite uji .
sumber
I%Qy1Q
juga berfungsi?y1
... Namun,%
tidak diizinkan, sayangnya.%
memiliki nilai ascii 37 dan ganjil.Japt , 4 byte
Japt menggunakan ISO / IEC 8859-1 , jadi ini sesuai dengan (dalam desimal)
117 41 231 85
.Uji secara online!
Penjelasan
Saya pertama kali mencoba menggunakan solusi
p
, yang pada dasarnyaç
dengan argumen terbalik. Namun,p
lakukan 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.sumber
dc , 21 byte
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 menambahkan
f
perintah debug ke akhir program seperti halnya pada halaman TIO.Cobalah online!
Penjelasan
sumber
TI-Basic, 18 byte
Disimpan 2 byte berkat lirtosiast
dalam byte (+2 baris baru = 3F)
Lihat http://tibasicdev.wikidot.com/one-byte-tokens
sumber
Input Q[newline]sinֿ¹(gcd(Q²,int(e[newline]Q
(14 byte). Bolehkah saya memposting sebagai jawaban terpisah?MathGolf , 3 byte
Cobalah online!
Bytes yang digunakan adalah
157, 123, 107
.Penjelasan
sumber
Bash , 31 byte
Cobalah online!
Penjelasan:
sumber
rd $20|h
dan baris baru.)