Tugas
Dalam tantangan ini, tugas Anda adalah menulis sebuah program dalam bahasa pemrograman L yang mengambil bilangan bulat positif n , dan menampilkan jumlah pembagi n yang tepat ( urutan A001065 pada OEIS). Ini harus mengembalikan output yang benar untuk 1 ≤ n ≤ 10 000 . Inilah 10 keluaran pertama:
0, 1, 1, 3, 1, 6, 1, 7, 4, 8
Selain itu, program Anda harus berupa polyglot palsu , yang artinya sebagai berikut. Ini adalah program yang valid dalam bahasa pemrograman lain L ' , dan untuk setiap input 1 ≤ n ≤ 10 (kasus uji di atas), ia mengembalikan jumlah pembagi n yang tepat , tetapi ada sekitar 11 ≤ n ≤ 10.000 untuk itu tidak mengembalikan hasil yang benar. Mungkin mengembalikan sesuatu yang salah, berulang selamanya, macet dll. Ini dapat memberikan hasil yang salah untuk semua n ≥ 11 , untuk beberapa dari mereka atau hanya satu.
Aturan dan penilaian
Anda dapat menulis program atau fungsi lengkap, dan Anda dapat memiliki berbagai cara input dan output dalam dua bahasa. Hitungan byte terendah menang. Aturan standar kode-golf berlaku. Dalam tantangan ini, berbagai versi utama atau implementasi bahasa dianggap berbeda.
Perhatikan bahwa jika Anda menggunakan bahasa pemrograman dengan pengkodean non-ASCII (seperti yang banyak dilakukan di situs ini), urutan byte yang sama harus digunakan untuk kedua bahasa. Ini berarti Anda harus mengonversi antara halaman kode yang berpotensi berbeda atau mengalami penalti untuk karakter Unicode multi-byte.
Kasus uji tambahan
20 -> 22
36 -> 55
180 -> 366
997 -> 1
2875 -> 869
10000 -> 14211
Python 2 dan Python 3, 58 byte
TIO untuk Python 2
TIO untuk Python 3
Ia bekerja di python 2, tetapi untuk setiap n> 10 akan menghasilkan 0 dalam python 3.
Semua karena pendekatan yang berbeda dalam membandingkan string dengan byte:
'' == b''
'' != b''
sumber
JavaScript (Node.js) dan PHP ,
7370 byteDalam kedua bahasa, ini adalah fungsi anonim. JavaScript memberikan hasil yang benar, tetapi PHP memberikan 0 untuk semua n> = 11 .
Cobalah JS!
Coba saja PHP!
Bagaimana itu bekerja
Kedua bahasa melakukan hal yang sama pada awalnya: iterasi dari 1 hingga n-1, menjaga jumlah berjalan semua angka i yang n% i = 0 .
Apa yang menyebabkan perbedaan perilaku adalah bagian terakhir:
Dalam JavaScript,
"$n"
hanya string literal. Perbandingan>
dengan10
melemparkannya ke angka secara implisit, tetapi karena tidak terlihat seperti angka, itu menjadi NaN. NaN memberi false jika dibandingkan dengan angka dengan cara apa pun. Akibatnya,$d
selalu dikembalikan.Namun, dalam PHP,
"$n"
adalah string yang berisi nilai$n
. Ketika PHP melemparkan ini ke angka, itu hanya menjadi nilai$n
. Jika lebih besar dari10
, maka0
dikembalikan sebagai ganti$d
.sumber
05AB1E / Jelly ,
98 byteKode byte (heksadesimal):
Menggunakan halaman kode Jelly menghasilkan hasil yang salah untuk angka berlebihan (mis. Input dari 12 pengembalian
12
bukan16
):Cobalah online!
Menggunakan halaman kode 05AB1E menghasilkan hasil yang benar:
Cobalah online!
Bagaimana?
05AB1E mem-parsing hingga dan termasuk
71
(q
) yang memerintahkan untuk berhenti dan kemudian berhenti mem- parsing:Jelly mem-parsing seluruh program di muka sebagai tiga tautan karena efek byte tanpa makna yang ditetapkan,
ƭ
danq
bertindak sebagai pembatas. Titik masuk program adalah tautan terakhirnya:sumber
ÆḌSD
menghemat satu byte.ÆḌSṚ
.Python 3 / Python 2 ,
646058 byteBerkat @officialaimm untuk 2 byte off
Dalam Python 3 ini memberikan hasil yang benar. Dalam Python 2 ouput salah untuk input yang melebihi
10
. Kode mengeksploitasi pembulatan bankir, yang dilakukan oleh Python 3 tetapi tidak oleh Python 2.Cobalah online! Python 3 (benar), Python 2 (salah untuk
n > 10
).sumber
[ ]
.Python 3 / Python 2 , 47 byte
Fungsi yang tidak disebutkan namanya, palsu di Python 2.
Cobalah online untuk Python 3 atau Python 2
Dalam Python 2
/
adalah pembagian integer dengan argumen integer, sedangkan dalam Python 3 adalah divisi.Ketika
n
melebihi 1010/n
mengevaluasi ke 0 di Python 2, tetapi ke angka positif kecil di Python 3 (ini tentu benar hingga maksimum yang diperlukan setidaknya 10.000 ).Karena itu
10/n>0
mengevaluasiTrue
untuk Python 3 danrange(10/n>0,n)
setara denganrange(1,n)
sementara di Python 210/n>0
mengevaluasiFalse
ketikan
melebihi 10 dimanarange(10/n>0,n)
menjadi setara denganrange(0,n)
menyebabkann%d
upaya untuk melakukan modulo nol aritmatika, menaikkan aZeroDivisionError
.sumber
Jelly / 05AB1E , 12 byte
Apa yang Jelly lihat:
Cobalah online!
Penjelasan:
q
tidak didukung dalam Jelly, jadi Jelly hanya "melihat" apa yang terjadi setelahq
.Apa yang dilihat 05AB1E:
Cobalah online!
Penjelasan:
Tentu saja semuanya setelah "berhenti" sebenarnya tidak terjadi.
sumber
ÆḌS
akan valid sendiri ... Jawaban luar biasa!мλS
kerjanya di 05AB1E.