Ide ini bukan milik saya, meskipun saya tidak tahu dari mana asalnya. Saya pernah bertemu di kontes pemrograman sangat lama (1998, jika saya ingat dengan benar). Tugasnya adalah menulis sebuah program dalam bahasa favorit Anda yang 2012
hanya menghasilkan dan2012
. Tangkapannya adalah bahwa program harus tetap menampilkan 2012
setelah salah satu karakternya dimodifikasi. Modifikasi dapat berupa penyisipan, penghapusan atau penggantian. Tentu saja, modifikasi akan sedemikian rupa sehingga program tersebut masih valid secara sintaksis.
Karena saya tidak tahu semua bahasa pemrograman, saya harus meminta hadirin untuk membantu saya dan menguji jawaban yang diajukan.
Ditambahkan: Banyak yang berkomentar bahwa definisi saya tentang modifikasi yang dapat diterima terlalu kabur. Inilah upaya kedua saya: Modifikasi yang diizinkan akan membuat program Anda valid secara sintaksis dan tidak akan menyebabkannya macet. Di sana, saya pikir itu harus mencakup semua kesalahan waktu kompilasi, waktu tautan, dan waktu berjalan. Meskipun saya yakin bahwa akan ada beberapa kasus tepi aneh dalam beberapa bahasa, jadi ketika itu muncul kita akan melihatnya secara individual.
Jawaban:
C, 53 karakter
Sedikit lebih lama dari jawaban bahasa scripting, dan mengikuti prinsip dasar yang sama. Bergantung pada kenyataan bahwa karena kendala sintaks C, satu-satunya huruf yang mungkin dapat diubah tanpa membuat program tidak valid adalah dalam string!
Sunting: Memotong 4 karakter.
Reedit: Robustness meningkat, mencukur satu karakter.
Redit: Lebih lama, tetapi lebih kuat. Coba saja
&
sekarang! (Benar kali ini).Pembaruan: Diperpendek sedikit; mengalahkan sebagian besar pendekatan yang terlihat sejauh ini.
Pembaruan: Diubah ke membatalkan; harus mengalahkan pendekatan terakhir yang mungkin untuk mematahkannya yang bisa saya pikirkan.Pembaruan: Saya menemukan pendekatan lain; mengganti yang terakhira
(semoga busuk) dengan0
; menggunakan nama dua huruf harus mengatasi masalah itu.Pembaruan: Pembaruan terakhir dicabut; dengan asumsi perubahan yang menyebabkan kesalahan runtime tidak diizinkan;
a
akan bekerja dengan baik.Pembaruan: Mundur beberapa lagi; upaya untuk mereduksi
*a
juga akan memisahkan; jadi menggunakanvoid
untuk menggoda kesalahan kompilasi dari itu seharusnya tidak perlu.Pembaruan: Dan pemendekan akhir; yang bergantung pada string
"2012"
yang ditempatkan di tetapi satu alamat (yang umum); dan bahwa string literal hanya-baca (juga umum).Update: Harganya dua karakter, tapi saya mengalahkan semi-colon kecil Anda!
sumber
register void
; Ada diregister
sana untuk mencegah&
; yangvoid
ada untuk mencegah*
.;
antaraputs
dan(
.2012
! (Saya hanya menggunakan karakter ASCII yang dapat dicetak untuk tes penyisipan dan subtitusi, tapi saya ragu memperluas repertoar akan membantu.)==
ke!=
ternary, itu tidak membawa Anda ke mana-mana; bukannya keluarana
sekarang keluaran"2012"
.Haskell, 19
atau, sebagai program lengkap,
29
Untuk sedikit lebih menyenangkan:
Untuk mendapatkan satu yang tidak dapat dimodifikasi sedemikian rupa sehingga hanya menghasilkan kesalahan runtime, kita dapat menyandikan informasi dalam panjang daftar yang tidak dapat dimodifikasi hanya dengan menggunakan satu karakter-perubahan, yaitu
Untuk membuatnya lebih dapat dimodifikasi (aman), kita juga dapat menggunakan nomor itu sendiri sebagai elemen daftar - hanya perlu membuatnya string untuk mencegah pertukaran koma dengan plus ':
Karena string ini hanyalah hasil dari ekspresi, kita juga dapat menggantikannya dengan itu - bukan masalah berkat kemalasan Haskell
6472The
init
bertindak sebagai "minus satu, tetapi non-negatif" di sini.Kami juga dapat memasukkan sistem tipe dalam skema redundansi dan kemudian menulis nomornya dengan cara yang dapat dimodifikasi dengan perubahan satu karakter ...
(
GHCi> twothousandandtwelve
≡>"2012"
)Anda sekarang dapat mengubah siapa saja
u
menjadip
sebaliknya, tetapi itu akan selalu mengacaukan kedalaman susunan daftar di elemen tuple kedua dan dengan demikian memicu kesalahan waktu kompilasi.Gagasan ini dapat diperluas lebih lanjut sedemikian rupa sehingga seluruh teks dapat dikodekan secara kompak, mudah dibaca dan diedit, dan masih aman dari pengubahan karakter tunggal.
Dan satu lagi ...
sumber
a=map(head.show.length)[[a,a],[],[a],[a,a]]
solusinya, masukkan dia
antara[]
. Saya sangat suka posting ini! Solusi yang sangat pintar.[a]
->[]
dalam solusi 64-charJavaScript
Saya percaya ini adalah bukti kesalahan runtime, setiap perubahan harus menghasilkan kesalahan kompilasi atau peringatan tunggal yang mengatakan 2012.
Sunting: Kode akan membuat kesalahan runtime pada sesuatu seperti
if("alert(2012 "==r)
, saya memindahkan bagian coba untuk menghadapinya.Sunting: Bagus satu Vilx-, tapi bisa diperbaiki :-) Sekarang ada ketidakcocokan braket untuk memasukkan titik koma itu.
Sunting: Tapi kemudian koma bisa melakukan hal yang sama dengan titik koma, yaitu sejumlah opsi, saya pikir saya telah memperbaikinya, tetapi ada banyak sekali kode sekarang.
Sunting: Sedikit disederhanakan.
Sunting: Satu lagi dalam serangkaian perbaikan bug yang tak terbatas.
Sunting: Ini agak terasa lebih panjang dan rumit daripada antipeluru, tetapi setidaknya harus mengurus
~eval
dan!eval
.sumber
q-")"
mengembalikanNaN
, yang dikonversi oleh"NaN"
sebelum evaling, yang hanya mengubahnya kembaliNaN
. Hal yang aneh untuk dilakukan, tetapi secara teknis sah, sehingga tidak menarik tangkapan.;
antaraeval
dan(
.~
di depaneval
menyebabkannya bergema2012
dua kali, bukan sekali. Tidak yakin apakah itu melanggar aturan atau tidak: P!
setelaheval(
istirahatPerl, 49 karakter
Berdasarkan jawaban JB , tetapi yang ini benar-benar memenuhi spesifikasi . Pemeriksaan lengkap menunjukkan bahwa setiap penghapusan satu karakter, penyisipan atau penggantian baik meninggalkan output tidak berubah atau menyebabkan program macet saat dijalankan (seperti yang ditunjukkan oleh nilai balik dan output non-nol ke stderr), setidaknya selama penyisipan dan penggantian dibatasi untuk karakter ASCII yang dapat dicetak.
(Tanpa batasan, tugas tidak mungkin di Perl: fitur yang sedikit diketahui dari parser Perl adalah berhenti ketika bertemu dengan karakter Ctrl-D atau Ctrl-Z, jadi menyisipkan salah satu dari mereka di depan setiap perubahan file itu menjadi program Perl yang valid yang tidak melakukan apa-apa.)
Sunting: Memangkas satu char lagi dengan menggantinya
1==print
dengan0-print
.sumber
print
mulai kembali dan'true'
bukan 1 :-Pprint
dalam versi Perl 5 apa pun, bahkan jika itu tidak didokumentasikan secara eksplisit .)Brainfuck
Saya mencoba meyakinkan diri sendiri bahwa ini mungkin, dan saya cukup yakin saya mungkin telah merentangkannya terlalu jauh. Saya telah membuat beberapa asumsi tentang lingkungan saya:
Sayangnya, jika Anda mendapatkan lebih ketat saya khawatir ini tidak mungkin. Ini solusinya:
Pada dasarnya, Anda dapat mengubah kode output, atau kode verifikasi, tetapi tidak keduanya. Salah satunya dijamin bekerja. Jika salah satunya tidak 'crash'.
sumber
Python2
Saya harus mengubah sedikit script tes Ray untuk menguji ini karena pengalihan stdout melanggar itu. Melewati dikte kosong ke exec menghindari mencemari namespace
sumber
Brain-Flak , 44 + 3 = 47 byte [Tidak Bersaing]
Ini menggunakan
-A
flag Brain-Flak dan menampilkan karakter2012
ke STDOUTCobalah online!
Alternatif, 50 byte
Cobalah online!
Penjelasan
Setiap modifikasi karakter tunggal ke salah satu kode di atas akan menyebabkan kesalahan program.
sumber
Sisi , tidak bersaing
Akhirnya saya pikir saya menemukan salah satu bahasa saya yang berfungsi. Itu sangat panjang, dan bahasanya lebih baru dari pertanyaan, tapi rasanya masih seperti prestasi.
Tentang Sisi
Sisi adalah bahasa mainan yang terinspirasi oleh perakitan dan QBasic. Baik untuk tantangan ini karena sintaksnya sangat terbatas.
set
,print
,jump
, danjumpif
.set
pernyataan. Mereka hanya dapat berisi (paling banyak) satu operasi, yang harus bersifat biner. Secara khusus: mengubahprint xx
keprint -xx
adalah kesalahan sintaksis.Program
Inti dari program ini adalah bagian ini:
Kami menyimpan
2012
dixx
, kemudian menguji apakah itu berhasil dan menyimpan hasil tes dalamy
. Jikay
benar, lompat ke baris 55. (Melompat ke nomor baris yang tidak ada, cukup maju cepat ke baris berikutnya.)Pengerasan radiasi
y
itu falsey, lompatan tidak terjadi, dan baris 4 ditetapkanxx
ke 2012.xx
akan ditetapkan ke 2012, apakah kami melakukan lompatan atau tidak.print
on 955 cepat atau lambat. Tidak mungkin dengan satu modifikasi untuk melompat mundur (membuat loop) atau melewati akhir program.0
, jadi modifikasi sepertiprint ax
bukan kesalahan. Solusi jelek tapi efektif adalah baris 828-954, yang menetapkan 2012 untuk setiap variabel yang mungkin dengan jarak sunting 1 darixx
. Ini memastikan bahwa setiap modifikasi ke finalprint xx
masih akan mencetak 2012.xx
lagi.sumber
Python
Sedikit verbose (sekarang dengan perbaikan untuk titik koma sial antara
print
dan(
!):sumber
pop()
ing set kosong bukanlah kesalahan dalam dan dari dirinya sendiri, tetapi itu menimbulkan 'Kesalahan'.pop
keluaran<built-in method pop of set object at 0xb6fe93ac> ()
T-SQL 2012, 55
sumber
Saya telah membuat skrip python untuk menilai semua solusi python. Script memecah solusi python pertama dan ketiga, dengan banyak metode berbeda.
Dan solusi kedua menggunakan lambda untuk menjaga dirinya sendiri, tidak bisa dipecahkan.Solusi python kedua adalah dalam python 3. Saya memodifikasinya menjadi format python 2 dan kemudian menilai program memecahnya.Ini skrip hakimnya.
sumber
p2
selalu melempar pengecualian untuk Python2. Outputnya tidak pernah 2012. Program juri Anda tidak akan berjalan di bawah Python3 karena menggunakan pernyataan cetak.p2
adalah dalam python 3.Mathematica, 23 karakter
Catatan: "/." berarti "ganti"
sumber
/.
menjadi//
(bentuk postfix).Javascript -
68, 77, 84, 80 karakterInilah solusi yang seharusnya berhasil tahun ini :)
Ini tes biola .
Pembaruan 1: Memperbaiki masalah ketika eval (+ a) memecahkannya (terima kasih eBusiness).
Pembaruan 2: Diperbaiki untuk '|' case (terima kasih lagi eBusiness).
Pembaruan 3: Diperbaiki untuk kasus '>' (terima kasih lagi eBusiness). Dan bangkrut untuk kasus '1' :(
sumber
eval(+a)
dan banyak modifikasi lainnya berjalan dengan baik tetapi tidak melakukan banyak hal.eval(+a)
kasusnya, yang sekarang harus diperbaiki. Juga, saya tidak dapat menemukan salah satu kasus modifikasi di mana ia berfungsi dengan baik tetapi tidak menghasilkan 2012, jadi tolong beri saya contoh?eval(0)
daneval(-a)
misalnya melakukan hal yang sama.||
dengan|
.alert
kealer=
.Ruby 1,9 - 43 karakter
Tidak diuji, jadi lepaskan diri.
sumber
Excel, 14 karakter (sedikit curang):
Setiap perubahan yang valid ke array akan memengaruhi konten kedua sel, dan mencoba mengubah hanya satu sel memicu pesan kesalahan.
Tentu saja, ini rusak jika Anda melihat bahwa itu benar-benar hanya satu rumus, berbeda dengan 2 rumus yang dibatasi menjadi identik.
sumber
Java 7
Penjelasan:
a
nilai2012
).a
dimodifikasi dengan cara apa pun, maka akan mengambil jalur berikut: 1 → 3 → 5 (dan itu akan mengembalikanb
nilai tidak berubah dari2012
).b
diubah dengan cara apa pun, maka akan mengambil jalur berikut: 1 → 3 → 4 (dan itu akan mengembalikana
nilai tidak berubah dari2012
).a.equals(b)
pada @ 1 dimodifikasi menjadia.equals(a)
,,b.equals(b)
atau!a.equals(b)
masih akan mengambil jalur berikut yang sama: 1 → 2 (dan itu akan mengembalikana
nilai tidak berubah dari2012
).a
pada @ 2 diubah keb
itu masih akan mengambil jalur berikut: 1 → 2 (dan itu akan mengembalikanb
nilai tidak berubah dari2012
).a
ataub
diubah ke kebalikan pada baris 3, 4 atau 5 masih akan mengambil jalur berikut: 1 → 2 (dan itu akan mengembalikana
nilai tidak berubah dari2012
)a
nilai tidak berubah dari2012
)M
diclass M
ataua
dimain(String[]a)
karakter lain yang valid dapat dilakukan tanpa perubahan apapun pada fungsi kode.Coba semua modifikasi ini di sini, untuk memverifikasi semuanya masih mencetak 2012.
Jika Anda dapat menemukan cara untuk melanggarnya dengan mengikuti aturan OP yang ingin saya ketahui, maka saya dapat memikirkan sesuatu untuk memperbaikinya.
Tidak seperti kebanyakan pertanyaan serupa di mana satu karakter diubah, pertanyaan ini memungkinkan struktur dasar dari bahasa pemrograman yang bersangkutan menjadi utuh, sehingga Java akhirnya dapat
bersaing dalam satuentri (mari kita hadapi itu, Java tidak akan pernah memenangkan apapun pada SE xD ini).sumber
a
? Apakah program masih menampilkan 2012, atau akankah output -2012?-
sebeluma
ataub
. Ini adalah screenshot kesalahan Kompilasi.Ruby 1.9
Saya membangun program singkat tapi sederhana ini yang Anda diundang untuk melanggar sesuai dengan aturan di atas. Saya bahkan tidak bisa menemukan posisi di mana output diubah (tanpa melanggar kode) jika a
#
dimasukkan untuk berkomentar di luar baris.sumber
irb
, menambahkan minus sebelumrx
hasil dalam program yang valid yang menghasilkan-2012
...puts
untukputc
penyebab ini untuk output?
di Ruby 1.9.Scala, 95
(atau 54 jika melewati bagian yang tidak berarti)
sumber
(...),("2012")
sepertinya mematahkannya.C #
Tentunya ini tidak sesederhana ini, kan? ...
Ok apa yang saya rindukan?
sumber
if (result += "2012")
membuatnya output20122012
?if
pernyataan, bukan string.;
setelahelse
membuatnya menghasilkan dua kali.PHP, 30
sumber
<?=$i=2012;$i==2012?-$i:2012;?>
<?#$i=2012;$i==2012?$i:2012;?>
Solusi melawan itu: masukkan baris baru setelah$i=2012
.Taksi , 396 byte
Diformat untuk manusia, yaitu:
Dari membaca jawaban lain, solusinya adalah memilih bahasa yang rapuh, mengatur nilainya, memeriksa nilainya, mencetak nilainya.
sumber
SmileBASIC
Pertama, kami mengaktifkan mode ketat. Ini memaksa Anda untuk mendeklarasikan semua variabel sebelum menggunakannya, dan mencegah hal-hal seperti mengubah? A $ menjadi? B $.
Selanjutnya, variabel string yang disebut "A $" dibuat, dan nilainya diatur ke "@ 2012". Untuk memastikan nilai A $ belum dikacaukan, program akan mencoba untuk beralih ke label, dan satu-satunya label dalam program ini adalah @ 2012.
Sekarang, A $ sudah pasti "@ 2012", tetapi sebelum mencetaknya, @ harus dihapus. SHIFT () menghapus item pertama dalam string atau array (seperti pop (), tetapi dari ujung lainnya). Untuk membuang nilai yang dikembalikan oleh SHIFT, itu diteruskan ke blok IF / THEN, yang tidak melakukan apa-apa. Untuk berjaga-jaga jika seseorang mencoba mengomentari baris itu, kami mendeklarasikan variabel "B", yang digunakan kemudian. Jika VAR dikomentari, baris terakhir akan menampilkan kesalahan variabel Tidak terdefinisi.
Sekarang, $ A dicetak, dan ada VAR lain untuk mencegah komentar. Baris terakhir hanya memastikan variabel B dan C keduanya telah dideklarasikan.
sumber
?-A$VAR C
- dapatkah output ini-2012
??B$VAR C
:? :)Haskell, 65
Perl, 84
Pendekatan gagal:
sumber
$&
dengan sesuatu seperti$0
.nub$filter(\x->x==2012||x==2012)(2012:[2012])
mungkin aman untuk solusi Haskell.use English
perl, itu akan memperbaikinya. Saya pikir beberapa perbaikan berfungsi untuk Haskell, termasuk beralih ke string.print
dengan*rint
,prin:
,p:int
atau#rint
, mengawali=
ke baris pertama, atau bahkan menggantis/.*/
dengans/./
atauy/.*/
(yang akan diperbaiki dengan menginisialisasi$ARG
untuk2012
untuk memulai dengan). Selain itu,$SUBSEP
trik Anda masih tidak melindungi dari memasukkan*
titik koma akhir, tetapi solusi yang jauh lebih mudah adalah dengan menghapus titik koma yang tidak perlu.PHP,
4348sumber
-
antara?
dan$a
hasil dalam-2012
cetakan.date()
, tetapi program ini harus bekerja di luar 2012 juga. ;)-
antara saya ? dan perutnya. ;-)Ruby (
5736)Sunting dan satu lagi dalam 36 karakter.
Saya kira menggunakan string cukup gagal karena hal minus tidak berfungsi lagi.
Sunting percobaan berikutnya (36 karakter) [tidak apa-apa, menambahkan hasil
-
setelahp
dalam-2012
]p [2012,2012] .find (2012) .first || 2012Yang ini hanya akan bekerja tahun ini, tetapi juga untuk kontes serupa di masa depan :) (15.chars)
Perhatikan bahwa subtitusi ini juga berfungsi:
57 karakter. Namun, jika Anda menghitung baris baru, berarti 76 karakter.
sumber
#
pada awal baris. Solusi terakhir - masukkan baris baru sebelumnyap
. (Catatan - Saya sendiri tidak mengenal Ruby, jadi mungkin saya salah).$><<
atauputs
sebagai gantinya. Apa pun, saya tidak akan mencoba ini lagi, saya menyerah :)T, 23
.
dll
sumber
-
)? -{$[-2012~m:2012;m;2012]}
-{$[2012~m:-2012;m;2012]}
-{$[2012~m:2012;m;-2012]}
q){$[-2012~m:2012;m;2012]}` 2012
-q){$[2012~m:-2012;m;2012]}` 2012
-q){$[2012~m:2012;m;-2012]}` 2012
;m;
untuk sesuatu seperti;1;
atau;x;
.Hmm .. coba saya coba:
128 karakter tanpa spasi.
sumber
System.out.println(-i)
(untuk println pertama). Juga rusak dengan misalnya mengganti yang pertamaprintln(i)
dengan misalnyaprintln(1)
. Juga berpotensi rusak dengan mengubahi == j
kei += j
(atau - =, dll.).PHP
Saya harap ini tidak bisa dipecahkan :)
sumber
echo(printf("%s",$a)==4)?die(3
dan saya dapatkan20123
.."2012"
ke."FAIL"
. :)Groovy: 26
sumber
x=2012;print x^2012?2012:-x
-
?-
adalah untuk mencoba dan memodifikasi kode Anda dengan satu karakter sehingga tidak lagi berfungsi.x=2012;print x^=2012?2012:x
(mengubah^
ke^=
) mengubah output ke 0.Lua
sumber
-
tanda - tanda itu?2012
menjadi sesuatu yang lain, pernyataan tersebut akan menimbulkan kesalahan. Hmm ... well, saya kira Anda pantas poin kreativitas untuk menyalahgunakan aturan. Tapi serius, bukan itu maksudnya.