Namun masalah penguraian Brainfuck lain, tapi kali ini ... berbeda.
Anda bekerja di Infinite Monkeys Incorporated, perusahaan yang membuat program Brainfuck, untuk menyelesaikan berbagai masalah menarik (secara tidak sengaja, tidak kurang - setelah semua, perusahaan membuat program acak). Namun, tampaknya mesin Turing cepat Anda yang hanya menjalankan Brainfuck memiliki masalah kecil dan mahal dengan kesalahan sintaksis - membuat satu, dan komputer meledak. Ini mungkin cacat desain, tetapi tidak ada yang repot-repot menemukan mengapa itu terjadi.
Karena mesin Turing (terutama yang cepat) harganya mahal (bagaimanapun, mereka memiliki RAM tak terbatas yang biayanya), akan lebih baik untuk memastikan bahwa program tidak memiliki kesalahan sintaksis sebelum menjalankan kode. Perusahaan Anda akan menjalankan banyak kode, jadi verifikasi manual tidak akan berfungsi. Tulis program yang membaca STDIN untuk kode Brainfuck, dan keluar dengan status keluar yang diatur ke selain dari 0 (kesalahan) jika program memiliki kesalahan sintaksis (misalnya,
]
adalah kesalahan sintaks, karena tidak ada yang cocok[
). Keluar dengan status keluar diatur ke 0 jika program benar-benar baik-baik saja.Pastikan program Anda memperhatikan kesalahan yang terjadi
[]
. Anda tidak ingin komputer lain meledak, bukan? Oh, dan pastikan itu sesingkat mungkin - bos Anda membayar untuk program pendek (karena dia pikir itu cepat, atau sesuatu). Oh, dan Anda tidak perlu kode di Brainfuck (pada kenyataannya, Anda tidak bisa, karena Brainfuck tidak mendukung kode keluar) - kode Anda akan dijalankan pada komputer normal.
Jadi, seperti yang Anda lihat, tugas Anda adalah memeriksa apakah program Brainfuck "valid" (memiliki []
simbol pasangan ). Harap dicatat bahwa program Brainfuck dapat memiliki karakter selain []
, jadi jangan menolak program hanya karena memiliki perintah lain. Kode terkecil menang, tetapi mungkin Anda akan lebih peduli dengan upvote.
sumber
GCD(a,b)
bukan0 != a || b
.Jawaban:
GolfScript, 18 karakter
Kode ini berjalan dengan sukses dengan kode keluar 0 (dan mencetak beberapa sampah ke stdout) jika tanda kurung di input seimbang. Jika tidak, gagal dengan kode keluar yang tidak nol dan mencetak pesan kesalahan ke stderr, misalnya:
atau
Karena tantangan tidak mengatakan apa pun tentang output ke stdout / stderr, saya pikir ini memenuhi syarat. Dalam kasus apa pun, Anda selalu dapat mengarahkan ulang ke
/dev/null
.Penjelasan:
Kode
{[]`?)},
menghapus semuanya kecuali tanda kurung kotak dari input, dan~
mengevaluasi hasilnya sebagai kode GolfScript. Bagian yang sulit adalah tanda kurung yang tidak seimbang benar-benar legal di GolfScript (dan, memang, kode saya termasuk satu!), Jadi kita perlu cara lain untuk membuat kode mogok.Trik yang saya gunakan adalah meninggalkan salinan input di bagian bawah tumpukan, mengumpulkan seluruh tumpukan ke dalam array (menggunakan yang tidak seimbang
]
) dan menggeser elemen pertama. Pada titik ini, tiga hal dapat terjadi:[
, mencoba menggeser elemen dari array kosong akan membuat crash interpreter (yang, dalam hal ini, persis seperti yang kita inginkan!)]
atau tidak[
ditutup) akan berupa array.Entri 14-char asli saya kemudian membandingkan nilai yang dialihkan dengan string, yang akan macet jika array bersarang. Sayangnya, ternyata membandingkan array flat (atau, khususnya, kosong) dengan string juga legal di GolfScript, jadi saya harus mengganti taktik.
Kiriman saya saat ini, sebagai gantinya, menggunakan metode yang sangat kasar untuk memberi tahu array dari string: un-eval mereka dan mencoba untuk menemukan kemunculan pertama
[
(kode ASCII 91), yang akan menjadi nol jika dan hanya jika un-evaled variabel adalah array. Jika demikian, membagi nol dengan dirinya sendiri memicu kehancuran yang diinginkan.Ps. Dua solusi 18-char lainnya adalah:
dan
Sayangnya, saya belum menemukan cara yang lebih pendek untuk menyelesaikan "masalah array kosong".
sumber
][
(yaitu, apakah itu gagal dalam program Anda?)[[]
; Saya sudah memperbaikinya sekarang, dengan biaya 4 chars, dan itu melewati semua tes saya sekarang.1+
akan mengubah array kosong menjadi array yang tidak kosong, array yang tidak kosong menjadi array yang tidak kosong, dan string menjadi string..{[]`?)},~](n<
. Aku mencoba Anda1+
, tetapi tampaknya bahwa kebutuhan array yang mengandung sesuatu yang lain selain nomor (mungkin sehingga penafsir akan crash ketika mencoba untuk secara rekursif membandingkan karakter dengan array / string). Menggunakann+
tidak berfungsi, karena ia memaksa array ke string;[n]+
tidak bekerja, tetapi masih menempatkan saya pada 18 karakter.Brainfuck 76 byte
Ini keluar dari ikatan itu jika tanda kurung siku tidak seimbang mengubah bf interpreter / compiler menjadi runtime gagal dan beberapa dari mereka memiliki kode keluar untuk mencerminkan itu.
membutuhkan eof = 0, nilai pembungkus dan jumlah sel yang terbatas
Di Ubuntu Anda dapat menggunakan penerjemah
bf
(sudo apt-get install bf
)sumber
Brainfuck
adalah Turing selesai tanpa I / O karena Anda dapat menjalankan program yang menghitung perhitungan apa pun dan melihat hasilnya dengan memeriksa ingatannya setelah berjalan. BF tanpa I / O akan membuat orang kurang tertarik karena akan sulit untuk membuat utilitas. misalnya saya tidak akan pernah bisa membuat juru bahasa saya .Befunge 98 -
26312019 karakterSingkirkan beberapa persyaratan besar. Sekarang programnya bekerja sebagai berikut:
q
keluar dari program dan muncul nilai teratas sebagai nilai kesalahan. Nilai kesalahan adalah-11 jika terlalu banyak]
, 0 jika seimbang, danpositifnegatif jika terlalu banyak[
. Jika angka itupositifnegatif, makabanyaknilai absolut dari angka]
itu diperlukan untuk menyeimbangkan program.Sunting: Peningkatan dan penurunan yang diaktifkan.
[
digunakan untuk menambah penghitung dan]
digunakan untuk menurunkannya. Dengan beralih, saya menghemat 1 char, karena untuk kondisi keluar, saya hanya perlu memeriksa apakah penghitungnya positif, bukan negatif.Versi lama
Kode ini berfungsi sebagai berikut:
Sunting: menyadari bahwa ini menerima input seperti
][
, sekarang berakhir setiap kali penghitungan menjadi negatif, menggunakansumber
[
dan]
untuk melakukan perbandingan dengan keduanya.J (
3835)Penjelasan:
1!:1[3
: baca stdin'[]'=/
: buat sebuah matriks di mana baris pertama adalah bitmask dari[
s di input, dan baris kedua adalah]
s.1 _1*
: kalikan baris pertama dengan 1 dan baris kedua dengan -1.+/
: jumlah kolom matriks bersama-sama, memberikan lekukan-indentasi per karakter+/\
: buat total running ini, memberikan level lekukan pada setiap karakter({:+.<./)
: kembalikan GCD dari elemen terakhir ({:
) dan elemen terkecil (<./
). Jika semua kawat gigi cocok, keduanya harus0
jadi ini akan kembali0
. Jika kawat gigi tidak cocok, itu akan mengembalikan nilai bukan nol.exit
: atur nilai keluar untuk itu dan keluar.sumber
ruby (64)
sebelumnya (68) itu adalah:
Solusi setara lainnya menggunakan
tidak dapat digunakan
size
sendiri karena akan memberikan false negative (!!!) ketika jumlah total kurung tidak seimbang adalah kelipatan 256sumber
=
operator.0
bisa pergi.Perl, 30 karakter
Regex rekursif dasar Perl Anda untuk menyelamatkan:
Bagi mereka yang tidak terbiasa dengan argumen baris perintah yang digunakan di sini:
-0
memungkinkan seseorang untuk mengatur karakter akhir baris untuk keperluan input file; menggunakan-0
tanpa argumen menetapkan karakter akhir baris ke EOF.-n
secara otomatis membaca input (dalam hal ini, seluruh file) menjadi$_
sebelumnya.Jika regex cocok, ia mengembalikan nilai sebenarnya, yang dinegasikan ke 0 untuk kode keluar. Jika tidak, nilai pengembalian salah menghasilkan kode keluar 1.
sumber
bash (tr + sed) - 42
Jika Anda tidak keberatan dengan pesan kesalahan maka Anda dapat menghapus ruang terakhir di antara
`
dan]
untuk mendapatkan panjang 41.sumber
cat
dan$()
(juga"[]"
dapat ditulis sebagai[]
). Saya menerima jawaban ini, tetapi sampai saya akan melihat peningkatan panjangnya, saya tidak akan membatalkan ini, karena sementara pendek, itu bisa menjadi cara yang lebih pendek untuk bash.$()
dengan backticks dan melakukan"[]"
-> yang[]
Anda sarankan.Perl (56 karakter)
Solusi Perl yang jelas: regex rekursif. Sayangnya itu adalah konstruksi yang agak bertele-tele.
sumber
Haskell (143)
to jgon: Menggunakan 2 penjaga tampaknya lebih padat daripada jika-maka-lain. Selain itu, menurut saya milik Anda tidak memeriksa bahwa tanda kurung berada dalam urutan yang benar ("] [" berlalu)
sumber
C,
7364 karakterBerkat saran dari kotak roti (walaupun ini mungkin membutuhkan little-endian untuk bekerja):
Bagaimana itu bekerja:
i
akan diinisialisasi ke 0c
menjadi int implisit yang didapatargc
(diinisialisasi ke 1 tetapi kami tidak peduli, asalkan bit yang lebih tinggi tidak disetel)read(0,&c,1)
membaca satu karakter ke byte rendah dari c (pada arsitektur little-endian) dan mengembalikan 0 pada EOF;i+1 != 0
kecuali kutipan braket seimbang ke -1; mengalikannya bekerja sebagai boolean (aman) DAN yang membutuhkan satu karakter lebih sedikit daripada&&
c==91
mengevaluasi ke 1 untuk'['
, danc==93
mengevaluasi ke 1 untuk']'
. (Mungkin ada beberapa trik fiddly fiddly bit yang akan lebih kecil tapi aku tidak bisa memikirkan apa pun.)return i
keluar dengan kode status 0 jika seimbang, tidak nol jika tidak. Mengembalikan -1 secara teknis melanggar POSIX tetapi tidak ada yang benar-benar peduli tentang itu.Versi sebelumnya:
sumber
getchar()
bukannya membaca akan mempersingkat kode dan memungkinkan Anda untuk menggunakan (implisit)int
alih-alihchar
untuk variabel Anda. Juga ingat bahwa global secara otomatis diinisialisasi ke nol.c;
mendefinisikan int global.][
? Saya yakin itu tidak seimbang. Tidakkah Anda harus melacak apakah hasilnya negatif setidaknya sekali?Lua, 56
sumber
"^%b[]$"
apa ini? Bisakah Anda jelaskan? Tentunya, ini bukan regex?^
), set seimbang[
dan]
dengan apa pun di antara (%b[]
), dan akhir string ($
).GTB , 55
Rindu
[]
Gunakan
0
untuk berhenti.sumber
MATHEMATICA, 88 karakter
sumber
s name like
RegularExpression` danStringLength
saya tidak pernah bisa memenangkan konteks golf kode teks dengan Mathematica! :)ToCharacterCode
jauh lebih lama daripadaord
... PS: Bagaimana dengan mengatur kode keluar?Length[StringCases[s,"["|"]"]//.{x___,"[","]",y___}:>{x,y}]
Rubi,
5958Memindai untuk membuka dan menutup braket, menghitung
[
sebagai 1 dan]
-1, dan keluar jika jumlah turun di bawah 0.sumber
exit 1
Anda bertanya).Hassium , 104 Bytes
Berkembang penuh (catatan tidak berfungsi dalam juru bahasa online karena input () dinonaktifkan) di sini
sumber
Kode Mesin Turing,
286276 byteSekali lagi, saya menggunakan sintaks tabel aturan yang didefinisikan di sini.
Berakhir dalam status
halt
untuk menerima input danhalt-err
menolaknya.sumber
halt-err
bisa lebih pendek, misalnyahalt*
misalnya.Pyth, 25 byte
Cobalah online!
Terjemahan Python 3:sumber
Haskell (
167, 159)Apakah ini sebagian besar untuk bersenang-senang, jika ada yang punya saran untuk membuatnya lebih pendek, saya akan senang mendengarnya :)
Sunting: Memperbaiki masalah yang ditunjukkan kepada saya di komentar (ditambahkan 11 byte).
Sunting 2: Fungsi tambahan yang dibuat untuk menguji predikat menggunakan pelindung yang terinspirasi oleh user13350, menghapus 8 byte.
sumber
][
( ditunjukkan oleh user13350 )Stax ,
1411 karakterJalankan dan debug itu
Kredit ke @recursive untuk -3 byte.
Setara ASCII:
Hapus semua karakter kecuali
[]
, lalu hapus[]
sampai string tidak lagi berubah. Kembali1
jika string terakhir kosong.sumber
.[]|&
untuk memfilter karakter, dan kemudian menggunakan kembali literal untuk 11