Terinspirasi oleh pertanyaan ini pada SO , tugas Anda adalah menghasilkan program yang valid dalam (setidaknya) dua versi utama bahasa pilihan Anda yang menghasilkan keluaran berbeda.
Aturan
- Bahasa apa pun yang memiliki lebih dari satu versi utama dapat digunakan.
- Untuk keperluan tantangan ini, saya akan menyarankan "versi utama" adalah di mana angka pertama dalam perubahan nomor versi.
- PHP 4 dan PHP 5 berbeda, PHP 5.3 dan PHP 5.4 tidak.
- Namun, karena saya tidak tahu skema versi untuk semua bahasa, jika Anda dapat berdebat dengan cukup baik, saya yakin komunitas akan menentukan apakah Anda adil dalam menentukan "versi utama" sendiri.
- Untuk keperluan tantangan ini, saya akan menyarankan "versi utama" adalah di mana angka pertama dalam perubahan nomor versi.
- Kode harus dikompilasi dan dijalankan dengan flag dan input yang sama setiap kali
- Kecuali untuk mengubah versi bahasa jika ini terkait
- Kesalahan tidak dihitung sebagai keluaran dan jawaban yang menghasilkan kesalahan didiskualifikasi (alih-alih keluaran kesalahan diabaikan)
- Program tidak boleh mengambil input selain yang diperlukan untuk membuatnya berjalan.
- Untuk setiap versi yang diberikan, output harus selalu sama
- Maksudnya adalah bahwa perubahan tersebut harus menjadi konsekuensi dari perubahan dalam spesifikasi bahasa daripada spesifikasi VM atau metadata lingkungan
Mencetak gol
- kode- jenis golf mencetak panjang, jadi
+1
untuk setiap karakter / byte -1
untuk setiap perbedaan karakter dalam panjang output.- misalnya output Versi 1
abcde
(5 karakter), output Versi 2123abc
(6 karakter) =-1
- misalnya output Versi 1
Peraturan Lainnya
- Pengecualian standar berlaku - tidak ada program eksternal, permintaan web dll.
- Program Anda harus berakhir (dalam 2 detik)
- Skor terendah menang.
Skor "Lebih Baik"
Simpan jawaban asli Anda, demi keadilan, saya akan menandai pemenang berdasarkan aturan asli.
Karena skor awal saya rusak secara fundamental, mengapa tidak mencetak ulang / coba lagi dengan sistem penilaian berikut:
- kode- jenis golf mencetak panjang, jadi
+1
untuk setiap karakter / byte +1
untuk setiap perbedaan karakter dalam panjang outputabcde
dan123456
->+1
-1
untuk setiap perbedaan karakter unik dalam output (dibatasi hingga panjang keluaran terpendek)abcde
dan123456
->-5
12345
dan123456
->-1
12345
dan123455
->0
- Skor paling dekat dengan zero win
- Dalam hal tie break kedua, skor kode-golf sederhana menang.
code-challenge
James Webster
sumber
sumber
zzzz
danaaaa
, apakah itu memberi saya-4
? Seperti itulah rasanya bagi saya.Jawaban:
Jawaban revisi untuk sistem penilaian "lebih baik"
C89 / C99, Nilai: 0
Program saya panjangnya 52 karakter dan menggunakan mekanisme yang sama seperti pada jawaban asli saya untuk mencapai hasil yang berbeda. Ini berfungsi karena C89 tidak memperlakukan
//
sebagai komentar:Hasil:
Jawaban lama:
C89 / C99, Nilai: -Infinity?
Saya tidak sepenuhnya yakin apakah program ini tidak melanggar aturan, tetapi tidak apa-apa. Program ini mengeksploitasi fakta bahwa di C89
//
bukan komentar yang valid tetapi/* ... */
.Menggunakan trik komentar, fungsi lain dijalankan. Dalam C89 fungsi hanya mencetak
"trolololol..."
sampai tumpukan meluap (jadi mungkin selesai dalam 2 detik).C99
C89
sumber
Scores closest to zero win
jadi ini sebenarnya sangat jauh dari nol.Python - 10 poin lebih sedikit dari jawaban terbaik berikutnya
Dalam Python 2, ini akan mencetak seluruh daftar bilangan bulat dari 0 hingga 99.
Dalam Python 3,
range
adalah generator dan hanya akan mencetak "range (0,100)".Melihat saya tidak pernah mengalami batasan ukuran angka di Python, saya bisa mengganti angka 100 dengan angka yang jauh lebih besar (2 ** 1000, misalnya) dan berakhir dengan perbedaan yang hampir tak terbatas dalam output.
Diedit untuk mencerminkan fakta bahwa, walaupun saya bisa mendapatkan skor yang sangat rendah untuk tujuan praktis apa pun, saya tidak dapat mencapai tak terbatas yang sebenarnya dengan program yang berakhir di bawah 2 detik
Untuk sistem penilaian tie-breaker yang diperbarui, saya akan mengirimkan:
Keluaran:
Python 2:
[0, 1, 2, 3]
Python 3:
range(0, 4)
Cetakan pertama memiliki 5 karakter unik (
[123]
), cetakan kedua memiliki 8 karakter unik (range(4)
), perbedaan panjang output adalah 1, kode memiliki 15 karakter, output terpendek adalah 11 karakter ... aturan ini cukup membingungkan tetapi Saya pikir ini membawa saya ke skor akhir 15 + 1-min (11,5 + 8) = 5.sumber
Python - 0 poin
Tidak tahu bagaimana ini bekerja: P Baru saja menemukannya ketika mencoba kode acak.
Pada Python 3, ini
<class 'int'>
dan pada Python 2, itu<type 'int'>
(menggunakan konsol interatif)"Lebih baik" Nilai: 3 (panjang) + 1 (char diff.) - 4 (karakter unik)
Python 1 - 7 poin lebih tua
Terima kasih banyak kepada @grc untuk versi ini dan membantu saya mengurangi empat poin!
Dalam Python 2, pernyataan ini diartikan sebagai
print ()
yang mencetak tuple kosong()
.Dalam Python 3,
print
ini adalah fungsi dan menghasilkan tidak ada yang dicetak.Skor "Lebih baik": 7 (panjang) + 2 (beda karakter) - 2 (karakter unik)
Python 2 - 13 poin lebih tua:
Skor "Lebih baik": 12 (panjang) + 2 (beda karakter o / p) - 1 (karakter unik o / p)
Saya tahu ini tidak akan menang tetapi masih memberikan jawaban, karena ini adalah percobaan Python pertama saya :)
sumber
print()
.dict.itertools()
: PC #
Saya juga mengubah algoritma inferensi tipe metode generik antara C # 2, 3 dan 4. Misalnya:
Dalam metode C # 2, inferensi tipe mengatakan bahwa T tidak dapat keduanya
int
danint?
, dan juga menghasilkan2
. Dalam metode C # 3 jenis inferensi mengatakan "kompromi terbaik antaraint
danint?
adalahint?
" dan memilihM<int?>
dan menghasilkan 1.sumber
Ruby, 4 karakter + 0 perbedaan panjang char - 3 perbedaan char unik = skor 1
Pada Ruby 1.9, itu akan dicetak
"d"
. Pada 1,8, itu dicetak100
.Penjelasan:
?d
ada"d"
di 1.9 dan100
(kode ASCII untuk d) di 1.8.p x
setara denganputs x.inspect
.*
adalah pengulangan string dan multiplikasi.Versi "Dioptimalkan" untuk penilaian lama:
Ruby, 8 karakter - 999999989 perbedaan karakter = skor -999999981
Cetakan
33000000000.0
untuk 1,8 dan"!!!!!!
...!!!"
untuk 1,9. (?!
ada33
di 1.8 dan"!"
di 1.9, dan*
keduanya merupakan pengulangan string dan multiplikasi.)Sungguh, Anda bisa pergi sejauh yang Anda inginkan dengan perkalian, itu hanya tergantung pada seberapa cepat komputer Anda.
sumber
Bash - -∞ (hingga batas praktis)
Secara efektif, betapapun banyak memori yang Anda miliki. Misalnya dengan sekitar 10GB:
Bash 2: tidak mendukung rentang dalam ekspansi brace, jadi cetaklah
{0..999999999}
.Bash 3:
Bahasa apa pun - -∞ (hingga batas praktis)
Anda akan memiliki ini dalam hampir semua bahasa, bahkan jika itu sedikit lebih rumit. Segera setelah Anda dapat membuat dua nilai yang berbeda, Anda dapat menulis kode yang menghasilkan keluaran yang berbeda secara sewenang-wenang. Metode penilaian yang lebih baik akan mengabaikan perbedaan dalam output.
sumber
…
dalam versi "bahasa apa pun" singkatan dari trik apa pun yang Anda gunakan untuk membuat program Anda bergantung pada pencapaian dalam spesifikasi bahasa. Ini adalah pendeteksian versi, apakah Anda melakukannyaif $version >= 3
atau tidakif isinstance(range(0),list)
.C #
Kode berikut akan menghasilkan output yang berbeda untuk C # 5.0 dan versi sebelumnya dari C #
Output: C # 5.0
Output: C # 4.0
Alasannya dijelaskan dalam posting blog oleh Eric Lippert
Menutup variabel loop dianggap berbahaya
sumber
Python, -14 Poin (3 - 17 perbedaan panjang char = -14)
Output Python 2:
0
Output Python 3:
0.6666666666666666
Versi skor yang lebih baik, 5 poin (3 + 2 perbedaan panjang karakter = 5)
Output Python 2:
1
Output Python 3:
1.5
sumber
C #
Saya menambahkan kovarians dan contravariance ke C # 4, jadi programnya berupa:
Akan menghasilkan
false
dalam C # 2 dan 3 dantrue
dalam C # 4.Namun, orang mungkin berpendapat bahwa ini tidak masuk hitungan karena perpustakaan yang memuat definisi
IEnumerable<T>
juga harus diubah.sumber
C ++ 98/11 - "Better" Scoring (115 karakter - 115 perbedaan karakter yang unik dalam output = skor 0)
Versi yang sedikit diedit untuk mematuhi aturan pemberian skor yang baru
Golf:
Versi tidak disatukan:
Solusi baru tidak berbeda jauh dengan yang lama. Dalam solusi baru output di C ++ 11 dan C ++ 98 adalah dengan 116 karakter yang sama-sama panjang, tetapi satu-satunya karakter yang mereka miliki adalah karakter baris baru yang ditambahkan oleh fungsi put.
Untuk C ++ 98
u8
inu8"\x7E"[0]
masih akan diganti, tetapi sekarang dengan"\x0B"
. Jadi nilai yang dihasilkan setelah preprocessing akan"\x0B""\x7E"[0]
. Dua string akan digabungkan ke"\x0B\x7E"
dan operator subskrip akan mengakses elemen pertama, dalam hal ini karakter dengan nilai 11 dalam pengkodean karakter. Selain itu nilaii
akan ditambahkan, yang awalnya adalah 114. Jadi karakter dengan nilai 125 akan ditulis ke array yang dihasilkan. Ketikai
nol, semua nilai dari 125 ke 11 akan ditulis ke array danputs
akan mencetak semua karakter dengan nilai dari 11 hingga 125, ditambah garis yang baru.Dalam C ++ 11
u8"\x7E"[0]
akan ditafsirkan sebagai string UTF-8 yang terdiri dari karakter tunggal dengan nilai heksadesimal 7E. Operator subskrip sekarang akan mengakses karakter ini dan nilaii
ditambahkan ke dalamnya, menghasilkan nilai desimal 241 selama iterasi pertama. Sementarai
pergi ke nol, semua nilai ke 126 akan ditulis ke array danputs
akan mencetak karakter dengan nilai dari 126 hingga 241, ditambah baris baru yang tertinggal.Bergantung pada set karakter yang digunakan, ini akan menghasilkan hasil yang berbeda, karena sebagian besar set karakter hanya memiliki 128 karakter pertama yang sama.
Untuk ISO-8859-2 outputnya adalah sebagai berikut:
C ++ 98:
C ++ 11:
C ++ (106 karakter - 107 perbedaan dalam output = skor -1) (ATURAN TUA)
Golf:
Versi tidak disatukan:
Disusun dengan
g++ -std=c++98 main.cpp
dang++ -std=c++11 main.cpp
.Sebenarnya Anda bisa menggantinya
108
dengan angka positif dalam rentang integer untuk mencapai skor negatif. Asalkan lebih besar dari 108;)Dalam C ++ 98
#define u8 "f"
akan menyebabkan preprocessor untuk menggantikanu8""[0]
dengan"f"""[0]
. Ini akan menghasilkan"f"[0]
, yang akhirnya menjadi karakter tunggal'f'
, yang ditulis ke array.puts(c)
akan mencetak array yang dihasilkan, terdiri dari i-1'f'
.Dalam C ++ 11
u8""[0]
akan menyebabkan string kosong ditafsirkan sebagai string UTF-8, sehingga tidak ada penggabungan string. Karena ini adalah C-string, operator subskrip akan mengakses terminasi null-byte dan menulisnya ke array.Pada akhirnya
puts(c)
akan mencetak array yang dihasilkan, yang hanya terdiri dari null-byte. Tetapi ketikaputs
berhenti membaca input segera setelah menemukan null-byte, itu hanya akan mencetak baris baru dan tidak lebih.sumber
?
(setidaknya pada sistem (Mac) saya)CSS2 vs CSS3 48 poin
Dijadikan sebagai
ABCDEFGHIJKLMNOPQRSTUVWXYZ
(huruf kecil) pada browser CSS3Dijadikan sebagai
abcdefghijklmnopqrstuvwxyz
pada browser non-CSS374 karakter - 26 perbedaan karakter unik = 48
sumber
Perl, 24 karakter - (9 * (10 ^ 9)) - 1 perbedaan char = skor - ((9 * (10 ^ 9)) - 1) +24
Mencetak 9e9 kali
a
untuk semua versi di bawah 5, cetakana
untuk semua versi di atas 5. Anda bisa membuat skor menjadi sangat rendah dengan hanya menambahkan lebih banyaka
s ke output kedua.sumber
Befunge, 36 - 378 = -342; 164 - 2576 = -2412
Di Befunge 93, ini akan menghasilkan 3 spasi, diikuti oleh
<v
, diikuti oleh 76 spasi, diikuti oleh<v
, kemudian 76 spasi, kemudian<v
, kemudian 76 spasi, kemudian<v
diikuti oleh 77 spasi, laluv
diikuti oleh 78 spasi. Panjang:3 + 2 + 76 + 2 + 76 + 2 + 76 + 2 + 77 + 1 + 78 = 395
Ini dapat diperpanjang secara sepele dengan menambahkan garis ekstra mirip dengan 5 baris pertama.Di Befunge 98, ini akan menampilkan
<v <v <v <v v
.Perbedaan panjang:
395 - 17 = 378
. Jadi skornya adalah (berdasarkan aturan lama):-342
Catatan: Saya bisa mendapatkan perbedaan yang lebih besar jika saya menggunakannya
.
sebagai ganti,
; perbedaannya pasti-684
Perubahan aturan:
Ini sedikit lebih rumit.
Output Befunge 93:
Output Befunge 98:
Panjang:
2576
. Tidak ada karakter di antara string yang sama, jadi jika saya memahami tantangan dengan benar, skor saya adalah164 - 2576 = -2412
(ya saya seharusnya membidik0
, tapi ini lebih menyenangkan). Jika saya perlu membuatnya sehingga setiap karakter dalam setiap string unik dan berbeda satu sama lain, saya dapat melakukannya, tolong beri tahu saya.sumber
Powershell, penilaian "Lebih baik", -163 (15 - 178 char diff = -163)
Powershell V2
Powershell V3
sumber
PHP, Nilai: 0 (kasus terbaik)
Wow, ini akan menyenangkan untuk dijelaskan.
Menurut situs web ini ,
srand()
fungsi ini tampaknya rusak dari PHP 5.1.5 ke PHP 5.3.14 . Oleh karena itu, kita akan tetap mempertimbangkan PHP 4.4.9 dan satu versi acak dari PHP 5 yang termasuk dalam interval versi yang ditentukan di atas.Output PHP 4.4.9:
1505335290
Saya tidak berpikir ini melanggar aturan; Karena ini tampaknya bug, hasilnya harus sama, tetapi sebenarnya tidak. Versi PHP kami yang lain hanya akan melewatkan
srand()
fungsi dan menghasilkan angka acak.sumber
Jawa (sekitar -2.000.000.000)
Versi Java kadang-kadang disebut 1.x, tapi saya pikir masih dalam aturan.
Cara mudah adalah memeriksa apakah ada kelas yang diperkenalkan dalam versi tertentu.
(Tergantung sedikit pada terminal Anda apakah mungkin untuk menghasilkan 2 miliar karakter dalam dua detik / Untuk penilaian baru, ganti
Integer.MAX_VALUE
dengan jumlah byte program untuk mencapai skor nol sempurna.)Kode ini tergantung pada versi VM / JDK yang digunakan (apakah itu diperhitungkan?)
Mencetak
z
s untuk Java 6 dan JDK sebelumnya dana
s untuk versi terbaru.sumber
JavaScript (ES3 vs ES5) - 9 poin
panjang
10
+ perbedaan panjang0
- perbedaan keluaran1
Output
1
untuk browser modern yang mendukung Array.prototype.map. Output0
pada browser lama. Saya menguji ini dengan IE8.Dengan aturan lama: 0 poin
panjang
26
- perbedaan panjang26
Output
00000000000000000000000000
pada browser modern. Dan string kosong pada yang lama.sumber
Python - 0
Python 2 mencetak quine, sedangkan Python 3 tidak mencetak apa pun.
EDIT: Diperbarui, diperbaiki.
sumber
APL (5 - (1988894 - 1) = -1988888)
Dalam APL gaya lama (seperti Dyalog jika
⎕ML=0
*),↑
berarti campuran , yang, pada vektor 1-dimensi tidak menghasilkan apa-apa. Dalam APL2-style APLs, seperti GNU APL, (atau Dyalog if⎕ML=3
),↑
berarti pertama , yang mengambil item pertama dari suatu vektor.Dengan demikian,
5
byte berikut (rangkaian APL tidak cocok dalam satu byte),akan menampilkan
1988894
byte (daftar angka yang dipisahkan spasi dari 1 hingga 3e5) dalam dialek APL gaya lama,dan
1
byte (hanya nomor pertama dalam daftar tersebut, yang1
panjangnya1
), dalam dialek APL-style APL2.Catatan:
⎕ML
berarti tingkat migrasi . Di Dyalog APL, semakin tinggi Anda atur⎕ML
, semakin banyak fitur gaya APL2 diaktifkan. Standarnya adalah0
. (Dan itu adalah variabel global! Menyenangkan!)3e5
adalah nilai tertinggi 3-karakter yang akan diterima oleh Dyalog APL⍳
.4e5
memberi sayaLIMIT ERROR
. Pembatasan ini mungkin tergantung pada juru bahasa. (GNU APL tidak mengalami masalah dengan nilai yang lebih tinggi.)sumber
Bash 7 (panjang program 14 byte + 0 perbedaan panjang output - 7 perbedaan karakter unik dalam output)
Terkait dengan jawaban @Gilles, tetapi fitur ekspansi yang berbeda dan versi yang berbeda. Mencetak menurut pertanyaan yang diedit:
Output untuk bash 3.x:
Output untuk bash 4.x:
sumber
PHP: −134217684 (43 - 134217727)
Pemakaian:
Di PHP5 + ini tidak akan mencetak apa pun karena ip2long dengan argumen yang tidak valid berubah menjadi false yang menghasilkan nol. Dalam PHP4 itu
ip2long("")
mengembalikan -1 dan kami mengisi string kosong dengan 128MB oga
.Topeng dipasang sehingga kembali jauh sebelum 2 detik di mesin saya. Jika Anda tidak dapat membuatnya dalam 2s, beli perangkat keras yang lebih baik!
Dengan aturan baru: 0 (40 - 40. Anda tidak bisa mendekati nol.)
Output:
sumber
C89 / C99 mengeksploitasi komentar, 45 karakter, 0 skor
keluaran c89
QRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
- 45 char.keluaran c99
MLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!
- 45 char.sumber
printf
keputchar
; paling memberatkan adalah bahwa untuk r5 saya salah membaca aturan dan secara tidak sengaja menggabungkan skor baru dan lama. Output untuk [r5, r6] adalah kesalahan. r3 di jawaban C lainnya mengandung kesalahan yang sama persis. Jika Anda melihat cap waktu, Anda akan melihat bahwa r5 yang diposting di sini ketika jawaban lain diperbarui. Bukan masalah, karena ini golf kode , dan entri ini memuaskan tantangan dalam karakter yang lebih sedikit, titik.C ++ 98 / C ++ 11
Untuk kompiler C ++ 98 yang memenuhi standar, ini menghasilkan 199711 kali huruf 'x', sedangkan untuk kompiler C ++ 11 yang memenuhi standar, ini menghasilkan 201103 kali dari huruf 'x'. Perbedaan panjang dari output adalah 1392 karakter. Ini berarti bahwa benar-benar bermain golf kode sumber tidak bermanfaat, karena efek yang jauh lebih besar dapat dicapai hanya
"x"
dengan mengganti dengan string yang lebih panjang, atau dengan mengalikannya__cplusplus
dengan beberapa nomor.sumber
SmileBASIC 3 / SmileBASIC 2, Nilai: -5 (skor asli)
Dalam versi SB modern, ini mencetak
1000000000
seperti yang diharapkan, tetapi dalam versi 2 dan sebelumnya dicetak10
karena bug.sumber
TI-Basic 83 Plus vs 84 Plus, skor 5-1 = 4
Keluaran
2
pada TI-83 Plus, di mana program yang sama diuraikan sebagai sesuatu yang terlihatlength("?►DMS
karenasetTime(
perintah belum diperkenalkan. Jadi string berisi dua token 1-byte, panjangnya 2.Output
1
pada TI-84 Plus, karena string yang berisi token 2-byte tunggal memiliki panjang 1.sumber
Go 1.9-> 1.10. Nilai = 1 - 1 = 0
Dari 1,10 catatan :
1.8:
256
1.9:
1024
1.10:
10340
sumber