Tantangan Anda, jika Anda memilih untuk menerimanya, adalah membuat fungsi atau program yang menghasilkan "ya" jika angka yang diberikan dapat dibagi dengan 13 dan menghasilkan "tidak" jika tidak.
Aturan:
- Anda tidak diizinkan menggunakan nomor 13 di mana pun.
- Tidak ada sinonim cop-out untuk 13 (seperti menggunakan 15 - 2).
- Poin bonus akan diberikan untuk tidak menggunakan modulus, bonus tambahan untuk tidak menggunakan divisi.
Scoring:
- skor Anda akan menjadi jumlah byte dalam kode Anda (spasi tidak termasuk) dikalikan dengan bonus Anda.
- Jika Anda tidak menggunakan modulus, bonus itu adalah 0,90; jika Anda tidak menggunakan pembagian, bonus itu adalah 0,90.
- Jika Anda tidak menggunakan keduanya, bonus itu adalah 0,80.
- Semakin rendah skor Anda, semakin baik.
Input akan selalu berupa bilangan bulat lebih besar dari 0 dan kurang dari 2 ^ 32.
Output Anda harus berupa "ya" atau "tidak" yang sederhana.
Klarifikasi:
- Menggunakan beberapa metode bundaran untuk menghasilkan angka 13 untuk digunakan dapat diterima. Sinonim aritmatika sederhana seperti (10 + 3) tidak diizinkan.
- Fungsi atau program harus benar - benar menampilkan "ya" atau "tidak" karena jika angka yang diberikan dapat dibagi dengan 13.
- Seperti biasa, solusi cerdas disarankan, tetapi tidak diperlukan.
sumber
function f(n){return "yes"}
. Ini akan mengembalikan 'ya' untuk semua angka yang dapat dibagi 13Using some roundabout method of generating the number 13 for use is acceptable.
Bagaimana Anda menentukan apa yang "cukup bundaran"?Jawaban:
Jawa (skor
60,859.2)Nilai: (76 - 2 spasi putih) karakter * 0.8 = 59.2
sumber
println
->print
?ASM - 16 bit x86 pada shell perintah WinXP
dieksekusi - 55 byte * 0.8 = 44
sumber - 288 karakter * 0.8 = 230.4
Angka 13 bahkan tidak muncul di file com. Com.
Merakit menggunakan A86.
sumber
The input will always be an integer greater than 0 and less than 2^32
. Anda tidak dapat menggunakan 16bitPython 3.x: 54 * 0.8 = 43.2
Mungkin merupakan solusi untuk memiliki string dengan panjang 13, tetapi ini dia:
Ia bekerja dengan membangun string n spasi (pilihan pembatas adalah arbitrer, tapi saya memilih ruang karena alasan yang jelas), dan memisahkan substring 13-ruang sampai Anda tersisa dengan string yang berisi n% 13 spasi.
sumber
print 'yneos'[any((' ' * input()).split(' '))::2]
' '
dengan' '*6+' '
untuk menyimpan 5 karakter - tapi kemudian saya menemukan bahwa ruang tidak masuk hitungan sama sekali ...GolfScript, 32 karakter
Saya ingin mencoba sesuatu yang berbeda dari orang lain, jadi solusi saya menghitung basis 14 akar digital nomor itu, dengan berulang kali mengubah angka menjadi basis 14 dan menjumlahkan digit sampai hasilnya tidak lagi menjadi lebih kecil. Ini pada dasarnya sama dengan menghitung sisa modulo 13, kecuali bahwa hasilnya akan berada dalam kisaran 1 hingga 13 bukannya 0 hingga 12.
Karena memeriksa apakah root digital sama dengan 13 akan sulit tanpa menggunakan angka 13 itu sendiri (atau beberapa solusi lumpuh seperti 12 + 1), apa yang sebenarnya saya lakukan adalah saya menambah nomor input dengan satu sebelum loop dan mengurangi hasilnya setelah itu. Dengan begitu, hasil untuk angka yang dapat habis oleh 13 akan menjadi nol, yang jauh lebih mudah untuk diperiksa.
Berikut versi program yang dikomentari:
Program ini benar-benar akan menangani setiap non-negatif bilangan bulat masukan, karena GolfScript menggunakan aritmatika bignum. Tentu saja, input yang sangat besar dapat menghabiskan waktu dan / atau memori yang berlebihan.
Kode tidak menggunakan modulos atau divisi secara langsung, meskipun menggunakan operator konversi basis GolfScipt, yang hampir pasti melakukan beberapa divisi dan sisanya mengambil internal. Saya akan menyerahkannya kepada GigaWatt untuk memutuskan apakah ini memenuhi syarat saya untuk bonus atau tidak.
sumber
C, 68 * 0,8 = 54,4
Setelah 24 jawaban, belum ada yang menemukan algoritma yang jelas ini:
sumber
JavaScript (27.9)
Versi saat ini (31 karakter * 0,90 bonus = 27,9).
Demo: http://jsfiddle.net/9GQ9m/2/
Sunting 1: Lupa bonus kedua dengan menggunakan modulus untuk menurunkan skor jauh dan menghindari
for
loop. Juga hilangkan~~
dan simpan dua karakter (terima kasih@copy
).Versi lebih lama (48 karakter * 0,80 bonus = 38,4)
sumber
~~
input valid dengan asumsi; jika tidak,prompt()<<1
akan bekerja juga.BrainFuck
Nilai: 200 * 0,8 = 160
Membaca dari stdin. Mungkin bukan solusi yang paling pintar, tetapi mendapatkan apa pun yang bekerja di BF itu bagus. Ini cukup kompak.
sumber
Scala (38 * 0.9 = 34.2)
Mirip dengan
0xD
(hex) atau015
(Oktober).Nilai ASCII
CR
adalah 13.sumber
Haskell, 28 * 0,8 = 22,4
sumber
Python:
Misalnya
memberi
sumber
20
)f=lambda n:pow(8,n,79)-1 and "no" or "yes"
memperbaikinya, 43 * 0.8 = 34.4C, 54,4 == 68 * .8
80 * .8sumber
\r
- Saya pikir ini hanya baik untuk dukungan Windows. Tetapi mengapac>0
kapanc
harus dilakukan?>0
tidak ada yang baik. Tetapi alih-alih memperhatikan bahwa fungsi Anda tidak mendukung mereka, saya pikir==
itu baik.ECMASkrip 6, 25 × 0,9 = 22,5
Ya, itu cara yang membosankan untuk mendapatkan 13.
sumber
APL ((21 - 1) × 0,8 = 16)
⎕IO
harus ditetapkan ke 0 agar ini berfungsi dengan baik di Dyalog APL. Untuk menghasilkan 13, kita mengambil lantai (⌊
) dari logaritma natural (⍟
) dari 9 ke kekuatan 6 (9*6
). Setelah itu, kami menemukan GCD (∨
) dari input kami (⎕
) dan 13, dan kami kemudian menguji apakah itu sama dengan 1. Ini digunakan untuk mengindeks ([...]
) vektor jawaban.Jika ada yang ingin bertele-tele tentang penyebutan byte dalam spesifikasi penilaian, skor untuk versi yang disandikan UTF-8 ini adalah
(29 - 1) × 0.8 = 22.4
. :)sumber
C, 88
Trik Fibonacci.
sumber
Perl - 44 × 0,8 = 35,2
Menghitung shebang sebagai satu byte.
Saya agak terlambat ke permainan, tapi saya pikir saya akan membagikan algoritme, karena tidak ada tulisan lain sampai saat ini yang menggunakannya.
Ini bekerja di bawah pengamatan bahwa jika n habis dibagi 13 , maka ⌊ n / 10 ⌋ + n% 10 * 4 juga habis dibagi 13 . Nilai-nilai 13 , 26 dan 39 siklus ke diri mereka sendiri. Semua kelipatan lain dari 13 pada akhirnya akan mencapai salah satu dari nilai-nilai ini dalam tidak lebih dari iterasi log 10 dan .
Di Pangkalan Lain
Diakui,
chop
sedikit keluar dari masalah. Dengan representasi basis 10, itu setara dengandivmod
. Tetapi algoritma bekerja dengan baik di basis lain, misalnya basis 4, atau 8.Kode pseudo gaya python dari algoritma di atas (basis 10):
Di basis 2:
Di basis 4:
Di base 8:
dll. Setiap pangkalan yang lebih kecil dari 13 berfungsi sama baiknya.
sumber
Javascript: 59 * 0.8 = 47.2 (?)
biola :
Termasuk peningkatan mellamokb (57 * 0.8 = 45.6):
sumber
return n-c?'no':'yes'
dan menghilangkan tanda titik koma kedua.prompt
untuk input danalert
untuk output, yang membuat program interaktif dan menghemat beberapa karakter.Perl: (51-4 spasi) * 0.9 = 42.3
sumber
Perl (19.8)
21 byte * .9
Catatan: Program Perl pertama saya. Ketikan yang lemah bagus untuk golf.
sumber
dalam C (K&R): 47 * 0.8 = 37.6
EDIT1: oke menghapus semua dependensi pada fungsi eksternal, di atas akan berfungsi selama Anda meletakkan baris ini pada baris ke 13 file! :) Jika
__LINE__
boleh digantikan oleh say0xd
maka dapat menyimpan 5 karakter lebih lanjut (skor: 33.6)sumber
J - 22.4 = 28 * 0.8
Berdasarkan metode siklik pintar mxmul .
Contoh:
sumber
JavaScript (108 kurang 0 untuk spasi putih) => 108, x 0,8 (tanpa modulus, tanpa pembagian) = 86,4
b=b=>{a=z,a=a+"";return+a.slice(0,-1)+4*+a.slice(-1)};z=prompt();for(i=99;i--;)z=b();alert(b()-z?"no":"yes")
Metode ini menggunakan algoritma berikut: 1. Ambil digit terakhir, kalikan dengan empat, tambahkan ke sisa angka terpotong. 2. Ulangi langkah 1 untuk 99 iterasi ... 3. Uji sekali lagi menggunakan langkah 1, jika nomor yang dihasilkan itu sendiri, Anda telah menemukan kelipatan 13.
Pembaruan sebelumnya, dihapus
var
, dan logika terbalik pada peringatan untuk menghapus lebih banyak karakter dengan menggunakan pengurangan-salah bersyarat.Secara teknis, hasil akhirnya adalah bahwa Anda pada akhirnya akan mencapai angka dua digit seperti 13, 26, atau 39 yang bila dijalankan melalui langkah 1 lagi akan memberikan 13, 26, atau 39 masing-masing. Jadi pengujian untuk iterasi 100 yang sama akan mengkonfirmasi pembagian itu.
sumber
Cheddar, 20 byte (tidak bersaing)
Skor 20 * 0,9 = 18
Jawaban langsung.
sumber
Gangguan Umum (71 byte * 0.8) = 56.8
Rekursi sederhana, sungguh.
(defun w(x)(if(> x 14)(w(- x 13))(if(> 14 x 12)(print'yes)(print'no))))
Tidak Disatukan:
sumber
Ruby (
5048 * 0.9 = 43.2)Cara cerdas untuk digunakan
eval
sumber
D 56 karakter .80 bonus = 44,8
ini mungkin merupakan cop-out dengan menggunakan 1/13 dan ganda dapat menyimpan angka 32 bit dengan tepat
sunting: ini bekerja dengan mengalikan 1/13 dan memeriksa bagian fraksional jika berbeda dari 0 (memungkinkan untuk kesalahan pembulatan) atau dengan kata lain memeriksa bagian fraksional dari i / 13
sumber
Python 2.7
(20 - 1 spasi putih) * 0.9 (tidak ada pembagian) = 17.1
ya / tidak, bukan benar / salah: 31 * 0,9 (tidak ada pembagian) = 27,9
mengambil keuntungan dari python
int
untuk mengkonversi pangkalan lain dari string menjadi basis 10 integer. Anda dapat melihat di kedua versi mereka menggunakan basis yang berbeda (panjang karakter yang sama)sunting: 1 simpan char di versi ya / tidak
edit2: 2 karakter lagi dicukur!
sunting3: terima kasih lagi untuk komentar! bahkan lebih banyak karakter dicukur dengan menggunakan representasi oktal bawaan python (
015
==13
...) alih-alih terjemahan basis intsumber
print['no','yes'][input()%int('d',14)==0
14-1
atau26/2
. Saya baru saja mengambil kebebasan kreatif untuk mewakili 13Perl, 95 * 0.8 = 76
Jeda baris ditambahkan untuk kejelasan. Saya mungkin bisa membuat jawaban ini jauh lebih pendek, tetapi saya merasa bahwa jawaban ini mewakili cara unik untuk mendekati masalah.
sumber
Python - skor 27,9
(31 karakter * 0,90) - lupa beberapa bonus untuk kode yang lebih pendek.
versi yang lebih lama: (47 karakter * 0,80) - lengkap jawaban Javascript mellamokb, tetapi dengan Python.
versi yang lebih lama: (60 karakter * 0.80)
versi yang lebih lama: (105 karakter * 0.80)
sumber
(1,10,9,12,3,4)
akan menghemat 1 karakter tetapi tidak akan menyelesaikan ke nilai kurang dari 13.Dalam Q:
sumber
Tata Bahasa Linear Kanan - ∞ poin
Kemudian tergantung pada bagaimana Anda memilih untuk 'menjalankannya, itu akan menampilkan' ya 'atau' tidak '.
Bukan entri serius, hanya bersenang-senang;)
EDIT: Mungkin saya harus menjelaskan sedikit.
Sebuah tata bahasa adalah seperangkat aturan (produksi) yang mendefinisikan bahasa . Bahasa dapat dianggap sebagai semua string yang mungkin dibentuk oleh alfabet, yang sesuai dengan aturan tata bahasa itu.
Di sini alfabet adalah himpunan semua digit desimal. Aturan tata bahasanya adalah bahwa semua string harus membentuk bilangan bulat desimal yang dapat dibagi oleh 13.
Kita dapat menggunakan tata bahasa di atas untuk menguji apakah suatu string termasuk dalam bahasa kita.
Aturan tata bahasa mengandung simbol terminal (yang merupakan elemen dalam bahasa) serta simbol non-terminal yang diganti secara rekursif.
Lebih mudah untuk menjelaskan apa yang terjadi dengan sebuah contoh:
Katakanlah misalnya bahwa string yang kami uji adalah 71955.
Selalu ada simbol awal (yang bukan terminal), dalam kasus tata bahasa di atas ini adalah 'S'. Saat ini kami belum membaca karakter apa pun dari string kami:
Sekarang, kita membaca simbol pertama dalam string kita yaitu '7', kemudian kita mencari aturan dalam tata bahasa yang memiliki salah satu non-terminal dalam pola kita saat ini di sisi kiri '->' dan bahwa memiliki simbol kita di sisi kanan '->'. Untungnya ada satu (S-> 7G), jadi kami mengganti simbol non-terminal dalam pola kami saat ini dengan sisi kanan aturan baru:
Sekarang kita memiliki 'G' non-terminal dalam pola kita, dan simbol berikutnya untuk dibaca adalah '1', Jadi kita mencari aturan dalam tata bahasa kita yang dimulai dengan 'G-> 1 ". Kami menemukan ada satu (G-> 1F), jadi kami mengganti non terminal dengan RHS dari aturan baru kami:
Terus ulangi proses ini:
Aturan selanjutnya: F-> 9D
Aturan selanjutnya: D-> 5F
Aturan selanjutnya: F-> 5S
Pada titik ini kita tidak memiliki lagi simbol dalam string kita, tetapi kita memiliki simbol non-terminal lain di sana. Kita melihat dari aturan pertama dalam tata bahasa bahwa kita dapat mengganti 'S' dengan string kosong (ε): S-> ε
Melakukannya memberi kita derai saat ini: 71955ε yang setara dengan 71955.
Kami telah membaca semua simbol dalam string kami, dan polanya tidak mengandung simbol non-terminal. Yang berarti bahwa string milik bahasa dan oleh karena itu 71955 sebenarnya dapat dibagi oleh 13.
Yaitu tujuannya adalah untuk memiliki pola = string. Jika Anda dibiarkan dengan simbol non-terminal, setelah membaca semua simbol di string Anda, string tersebut tidak termasuk dalam bahasa. Demikian juga, jika Anda masih memiliki lebih banyak simbol dalam string untuk dibaca, tetapi tidak ada aturan dalam tata bahasa yang memungkinkan Anda untuk maju, maka string tersebut bukan milik bahasa.
sumber