Deskripsi
Nomor Chicken McNugget adalah angka yang dapat dinyatakan sebagai jumlah 6, 9 atau 20 - ukuran awal kotak Chicken McNuggets yang terkenal yang dijual oleh McDonald's. Dalam jumlah itu, suatu angka dapat muncul lebih dari satu kali, demikian 6 + 6 = 12
juga angka yang demikian, dan angka tersebut harus "mengandung" setidaknya satu dari ukuran yang disebutkan. Nomor Chicken McNugget pertama adalah:
6
9
6 + 6 = 12
6 + 9 = 15
9 + 9 = 6 + 6 + 6 = 18
20
6 + 6 + 9 = 21
...
Tantangan
Tugas Anda adalah menulis sebuah program atau fungsi, yang, diberi bilangan bulat positif, menentukan apakah angka ini dapat dinyatakan dengan cara yang dijelaskan, karena itu adalah nomor Chicken McNugget. Maka harus menghasilkan nilai yang benar atau salah berdasarkan keputusannya.
Uji kasus
6 -> true
7 -> false
12 -> true
15 -> true
21 -> true
40 -> true
42 -> true
Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang dan celah standar berlaku!
sumber
Jawaban:
Python, 27 byte
Cobalah online!
sumber
~
karena Anda dapat menukar output.8953174650303
memiliki panjang yang sama persis dengan0x82492cb6dbf
(meskipun kurang dapat dibaca).Python 3 , 24 byte
Cobalah online!
Penjelasan
Dengan
6
dan9
sendiri, seseorang dapat membuat semua bilangan bulat dapat dibagi dengan3
yang lebih besar dari3
, seperti yang dinyatakan dalam komentar Ovs untuk tantangan . Diasumsikan bahwa seseorang juga dapat membuat0
. Kesimpulannya, seseorang bisa membuatnya0,6,9,12,15,...
.Dengan satu contoh
20
, satu dapat membuat:20,26,29,32,35,...
.Dengan dua contoh
20
, seseorang dapat membuat:40,46,49,52,55,...
.Tiga contoh tidak perlu, untuk
3 x 20 = 10 x 6
.Perhatikan bahwa kasus-kasus di mana tidak
20
diperlukan juga dapat dibagi dengan 3; kasus-kasus di mana seseorang20
dibutuhkan meninggalkan sisa2
; kasus di mana dua20
diperlukan meninggalkan sisa1
.Jumlah yang
20
dibutuhkan karenanya dapat dihitung dengan(-n)%3
. Kemudian, kita lakukann-(((-n)%3)*20)
untuk menghapus jumlah yang20
dibutuhkan dari nomor tersebut. Kami kemudian memeriksa bahwa nomor ini adalah non-negatif, tetapi tidak3
.sumber
f=lambda n:n%3<1<n-2or n>20and f(n-20)
Apakah itu bekerja?f=
sekarang karena tidak rekursif.Python 2 , 28 byte
Cobalah online!
sumber
(n%3,n/20)
dari daftar Anda yang dikecualikan adalah{(2, 0), (1, 0), (1, 1)}
. Menggunakan-n%3
sebaliknya memberi ketimpangann/20>=(-n)%3
. Dari sana, saya bermain-main sebentar untuk membalik{3,23,43}
yang 3 mod 20 tanpa mempengaruhi 63,83, ... Saya menemukan menggeser titik akhir ketidaksetaraan untuk ini bekerja paling baik.Jelly , 11 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Haskell , 36 byte
Cobalah online!
Penjelasan
Solusi ini sangat mudah. Baris pertama menyatakan bahwa untuk nomor apa pun yang kurang dari 1 itu adalah nomor McNugget jika
n==0
. Dengan kata lain itu0
adalah nomor McNugget dan semua angka negatif tidak.Baris kedua menyatakan bahwa untuk semua nomor lainnya,
n
adalah nomor McNugget jika minus salah satu ukuran Nugget adalah nomor McNugget.Ini adalah pencarian rekursif yang cukup sederhana.
sumber
Python 3 ,
484642 byteCobalah online!
Switch
True
danFalse
.sumber
True
danFalse
secara defaultJelly , 11 byte
Cobalah online!
Port jawaban Python saya , tetapi sedikit diubah: kurangi
20
sampai habis dibagi3
, lalu periksa apakah itu milik0,6,9,...
pemetaan0
dengan input (dengan menggunakanor
), lalu periksa apakah itu lebih besar dari3
.Hanya tiga angka yang menghasilkan
0
setelah menyelesaikan langkah pertama adalah0
,20
, atau40
, dengan yang pertama berada di luar domain, dan sisanya menjadi lebih besar dari3
.sumber
Mathematica, 53 byte
sumber
FrobeniusSolve
fungsinya.Mathematica, 30 byte
Cobalah di Wolfram Sandbox.
sumber
Mathematica, 20 byte
Fungsi anonim. Mengambil angka sebagai input dan mengembalikan
True
atauFalse
sebagai output. Logika disalin dari jawaban Leaky Nun , dengan beberapa tambahan penyalahgunaanInequality
.sumber
x86-64 Kode Mesin, 22 byte
Byte di atas menentukan fungsi dalam kode mesin x86 64-bit yang menentukan apakah nilai input adalah nomor McNugget Chicken. Parameter integer positif tunggal dilewatkan dalam
ECX
register, mengikuti konvensi panggilan Microsoft 64-bit yang digunakan pada Windows. Hasilnya adalah nilai Boolean yang dikembalikan dalamEAX
register.Mnemonik perakitan tidak dikumpulkan:
Jelas, ini memainkan banyak solusi Anders Kaseorg dengan Python , dalam hal ini didasarkan pada bidang-bit yang mewakili nilai-nilai yang merupakan angka Chicken McNugget. Secara khusus, setiap bit dalam bidang ini yang sesuai dengan nomor McNugget Chicken yang valid diatur ke 1; semua bit lainnya ditetapkan ke 0. (Ini menganggap 0 sebagai nomor Chicken McNugget yang valid, tetapi jika Anda tidak menyukainya, preferensi Anda adalah modifikasi satu-bit.)
Kami memulai dengan hanya memuat nilai ini ke dalam register. Ini adalah nilai 64-bit, yang sudah membutuhkan 8 byte untuk mengkodekan, ditambah kita membutuhkan awalan REX.W satu-byte, jadi kita benar-benar cukup boros dalam hal byte, tapi ini adalah inti dari solusi, jadi Saya kira itu sepadan.
Kami kemudian menggeser bidang ke kanan dengan nilai input. * Akhirnya, kami menutup semua kecuali bit urutan terendah, dan itu menjadi hasil Boolean kami.
Namun, karena Anda tidak dapat menggeser lebih dari jumlah bit sebenarnya dalam nilai, ini hanya berfungsi untuk input dari 0-63. Untuk mendukung nilai input yang lebih tinggi, kami menyisipkan tes di bagian atas fungsi yang bercabang ke bagian bawah nilai input adalah> = 64. Satu-satunya hal yang menarik tentang ini adalah kami memuat ulang konstanta bit-field di
RAX
, dan kemudian bercabang ke instruksi yang menutupi bit orde terendah, sehingga memastikan bahwa kami selalu mengembalikan 1.Cobalah online!
(Fungsi C panggilan ada dijelaskan dengan atribut yang menyebabkan GCC menyebutnya dengan menggunakan konvensi panggilan Microsoft yang menggunakan kode perakitan saya. Jika TIO telah menyediakan MSVC, ini tidak akan diperlukan.)
__
* Sebagai alternatif dari shift, kita bisa menggunakan
BT
instruksi x86 , tapi itu 1 byte lebih lama untuk dikodekan, jadi tidak ada keuntungan. Kecuali kami dipaksa untuk menggunakan konvensi panggilan yang berbeda yang tidak dengan mudah menyampaikan nilai input dalamECX
register. Ini akan menjadi masalah karenaSHR
mengharuskan operand sumbernyaCL
untuk perhitungan shift dinamis. Oleh karena itu, konvensi panggilan yang berbeda akan mengharuskan kamiMOV
mengedit nilai input dari register apa pun yang diteruskanECX
, yang akan memakan biaya 2 byte. TheBT
instruksi dapat menggunakan setiap mendaftar sebagai operan sumber, dengan biaya hanya 1 byte. Jadi, dalam situasi itu, akan lebih baik.BT
menempatkan nilai bit yang sesuai ke dalam flag carry (CF), jadi Anda akan menggunakanSETC
instruksi untuk mendapatkan nilai itu dalam register integer sepertiAL
sehingga bisa dikembalikan ke pemanggil.Implementasi alternatif, 23 byte
Berikut ini adalah implementasi alternatif yang menggunakan operasi modulo dan multiplikasi untuk menentukan apakah nilai input adalah nomor McNugget Ayam.
Ia menggunakan konvensi pemanggilan Sistem V AMD64 , yang meneruskan nilai input dalam
EDI
register. Hasilnya masih Boolean, kembali diEAX
.Namun, perlu diketahui bahwa tidak seperti kode di atas, ini adalah Boolean terbalik (untuk kenyamanan implementasi). Ini mengembalikan
false
jika nilai input adalah nomor McNugget Chicken, atautrue
jika nilai input bukan nomor McNugget Chicken.Apa yang jelek tentang ini adalah kebutuhan untuk secara eksplisit menangani nilai input> = 43 oleh cabang perbandingan-dan-di atas. Jelas ada cara lain untuk melakukan ini yang tidak memerlukan percabangan, seperti algoritma caird coinheringaahing , tetapi ini akan membutuhkan lebih banyak byte untuk dikodekan, jadi bukan solusi yang masuk akal. Saya pikir saya mungkin kehilangan beberapa trik bit-twiddling yang akan membuat ini bekerja lebih elegan dan lebih sedikit byte daripada solusi berbasis bitfield di atas (karena pengkodean bitfield itu sendiri membutuhkan begitu banyak byte), tetapi saya telah mempelajari ini untuk beberapa saat dan masih tidak bisa melihatnya.
Oh well, coba online saja!
sumber
05AB1E,
1716 byteCobalah online!
Penjelasan
sumber
…
string (ada buitins untuk string 1, 2, dan 3-char, menjadi'
,„
dan…
masing-masing). Saya punya perasaan lebih bisa bermain golf, mungkin dengan menggunakan pendekatan yang berbeda, tetapi terlepas dari ini adalah jawaban pertama yang bagus. +1 dari saya.Ŝ
:… ÇIÅœåPOĀ
. Ini pendekatan yang sama sekali berbeda, jadi jika Anda ingin saya mempostingnya sebagai jawaban terpisah dan bukan golf Anda, beri tahu saya. PS: Saya tidak 100% yakin apakah unsintables diizinkan dalam codepage 05AB1E . Mungkin harus dalam pengkodean yang berbeda dalam kasus itu, yang akan membuat beberapa karakter masing-masing dihitung sebagai 2 byte .. Dalam kasus ituŽBo21в
bisa menjadi alternatif untuk +1 byte.ŽGç₂в
bukannya string sambil secara bersamaan menyimpan byte dalam proses.JavaScript (ES6),
6964 byteTampilkan cuplikan kode
Output
false
untuk nomor Chicken McNugget,true
jika tidak.sumber
n=>~'ABCDEFHIKLNOQRTWXZ]`cfl'.search(String.fromCharCode(n+65))
untuk 63 byteJava,
215724 byteCobalah online!
Golf:
Tidak Terkumpul:
sumber
26 = 20 + 6
.Python 2 , 51 byte
-1 byte terima kasih kepada @LeakyNun
Cobalah online! Footer mencetak semua nomor bukan McNugget
sumber
n%3
hanya bisa 0 atau 1 atau 2, jadin%3==2
sama dengann%3>1
.Pyth , 15 byte
Cobalah online!
String berisi karakter yang sesuai dengan codepoint 6, 9, dan 20.
sumber
Haskell,
6456 byteSaya tidak melakukan sedikit pun tipu daya, tetapi melihat jawaban lain mungkin sebenarnya lebih pendek untuk mengimpor
Bits
modul dan menggunakan metode itu. Pendekatan ini memeriksa jauh lebih langsung.sumber
66
tidak64
. Tetapi Anda dapat menyimpan banyak tanda kurung danx/=0
menjaga untuk menyimpan beberapa byte, lihat di sini .Javascript,
927872 byte* Disimpan 14 byte berkat @Jonasw
Menggunakan fakta bahwa "Semua bilangan bulat adalah angka McNugget kecuali 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 23, 25, 25, 28, 31, 34 , 37, dan 43. " dari komentar @ LeakyNun
sumber
APL (Dyalog) , 19 byte
dengan
⎕IO←0
Algoritma yang sama dengan jawaban Dennis
Cobalah online!
sumber
Retina , 26 byte
Cobalah online!
sumber
Tambahkan ++ , 35 byte
Cobalah online!
Lihatlah ma, tidak ada loop sementara. Atau string. Atau daftar. Atau benar-benar apa pun yang membantu menghemat byte. Tetapi terutama karena Add ++ tidak tahu apa itu.
3 bulan kemudian, saya menyadari bahwa ini tidak valid, dan memperbaikinya. Entah bagaimana, itu golf dengan 13 byte. Ini adalah fungsi yang mengambil satu argumen dan menguji apakah argumen itu adalah nomor Chicken McNugget atau tidak.
Bagaimana itu bekerja
sumber
Excel, 87 byte
Atau, 92 byte:
sumber
PHP, 69 +1 byte
keluar dengan
1
untuk Nomor McNugget Ayam, selain itu0
.Jalankan sebagai pipa dengan
-n
atau coba online .sumber
Python 2 , 61 byte
Cobalah online!
sumber
chr
.Mathematica, 59 byte
sumber
Javascript 37 byte
Mengambil bilangan bulat positif
n
dan keluarantrue
untuk nomor McNugget Ayam danfalse
untuk yang lain.Penjelasan
Rekursi pada fungsi ini sangat kejam, dan untuk setiap yang cukup besar
n
, Anda akan melampaui batas tumpukan panggilan. Berikut adalah versi yang menghindari batas-batas tersebut dengan memeriksa apakahn
lebih besar dari nomor McNugget non-Ayam terbesar (43 byte [poin bonus karena menjadi nomor McNugget non-Ayam terbesar?]):Tampilkan cuplikan kode
sumber
JavaScript ES5, 46 byte
Jawaban boolean eksplisit, 50 byte:
Canggung, tapi itu menyelesaikan pekerjaan. Pengembalian
false
atau0
untuk setiap nilai yang bukan 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31, 34 , 37, atau 43, dantrue
,-1
, atau1
untuk segala sesuatu yang lain.Solusi eksplisit kembali
true
ataufalse
hanya.sumber
Clojure 33 byte
Upaya cepat ok:
#(-> %(rem 20)(rem 9)(rem 6)(= 0))
sumber
Pari / GP , 48 byte
0
palsu. segala sesuatu yang lain adalah benar.Cobalah online!
sumber
0.25
ujian.