Tantangan Anda adalah mengecilkan kode Brainfuck , sesuai dengan aturan ini:
- Hapus apa pun yang bukan salah satunya
+-><[].,
. - Untuk grup berurutan
+
atau-
karakter apa pun, jika jumlah+
s dan-
s sama, hapuslah. - Lakukan hal yang sama seperti di atas, tetapi dengan
>
dan<
. - Hapus urutan
+-><
karakter jika mereka tidak melakukan apa-apa. Misalnya, Anda harus menghapus+>-<->+<
. (Ini mungkin yang paling sulit dan paling sulit untuk diterapkan.) Pastikan Anda tidak mendapatkan positif palsu, seperti+>-<+>-<
, yang tidak boleh dihapus.
Kasus uji:
Memasukkan
++++++[->++++++<]>. prints a $
[-]< resets tape
>,[>,]<[.<] reverses NUL terminated input string
++-->><< does nothing
Keluaran
++++++[->++++++<]>.[-],[>,]<[.<]
Memasukkan
Should disappear: ++>>+<+++<->-->-<<->-<
Should disappear: +++>-<--->+<
Should stay: +++>-<+>---<
Keluaran
+++>-<+>---<
Anda dapat menerima input dan output namun Anda ingin - stdin / stdout, suatu fungsi, dll., Tetapi input mungkin tidak dikodekan dengan keras.
Ini adalah kode-golf , jadi kode terpendek dalam jumlah karakter akan menang.
++>>++<<--
harus keluar>>++<<
, dan itu tidak tercakup. Silakan tambahkan lebih banyak test case.+++>-<+>---<
,? Ini dapat dipersingkat untuk menghindari gerakan pointer yang tidak perlu, tetapi output yang diharapkan tidak berubah. Pemahaman saya berdasarkan melihat baik pada pertanyaan maupun jawabannya adalah bahwa Doorknob keren dengan spek yang diambil secara longgar; kita harus menghilangkan+-><
sekuens berdekatan yang no-op seperti yang dinyatakan secara eksplisit, dan di luar itu diperbolehkan untuk melakukan minifying tambahan seperti pada contoh Anda++>>++<<--
, dan kami juga dapat membuat pengaturan ulang selama mereka tidak mengubah fungsionalitas kode, misalnya>+<+
menjadi+>+<
.+>-<->+<
. (Ini mungkin yang paling sulit dan paling sulit untuk diterapkan.) Pastikan Anda tidak mendapatkan kesalahan positif, seperti+>-<+>-<
, yang seharusnya tidak dihapus. " - ini agak kaburJawaban:
REBEL - 104
Pemakaian:
Input: Membaca satu baris dari stdin.
Output: Mencetak satu baris ke stdout.
Anomali *:
_
menyebabkan baris lain dibaca dan digunakan, alih-alih tidak menghasilkan apa-apa.++++>----<
bukannya+++>-<+>---<
. Tapi tidak apa-apa, kan? ;)>-<+
dll diganti dengan+>-<
dll.Spoiler:
* Ini bukan bug, ini fitur!
sumber
Brainfuck, 579 byte
Dengan pemformatan dan beberapa komentar:
Ini menggunakan pendekatan yang sama dengan solusi Keith Randall, meminimalkan semua urutan yang berdekatan
+-<>
secara optimal dengan simulasi. Misalnya,+++>-<+>---<
menjadi++++>----<
dan>+<+<<+>+<->>>>
menjadi+<+>>+>
.Cobalah online. (Jika nilai absolut sel yang disimulasikan mendekati 256, akan ada masalah melimpah.)
Struktur keseluruhannya adalah
Rekaman ini dibagi menjadi 7-sel node; di awal loop dalam, tata letak memori
0 s 0 c 0 a b
di mana
s
adalah bendera boolean untuk sel awal,c
adalah karakter saat ini,a
adalah bagian negatif dari nilai sel yang disimulasikan (ditambah satu), danb
merupakan bagian positif dari nilai sel yang disimulasikan.Ketika urutan yang diperkecil sedang dicetak, tata letak memori
d n e 0 0 a b
di mana
d
bendera boolean untuk arah,a
danb
seperti sebelumnya (tetapi menjadi satu / nol saat dicetak), dann
dane
bukan nol untuk simpul akhir;n
terkait dengan berapa kali node telah terlihat, dane
nilai dari char yang menghentikan loop dalam (plus satu).Awalnya saya mempertimbangkan untuk melacak lebih banyak informasi per node: node paling kiri dan paling kanan sebagai flag boolean, dan posisi node dalam kaitannya dengan node start dan end. Tetapi kita dapat menghindarinya dengan melihat sel tetangga saat dibutuhkan, dan dengan melakukan pemindaian kiri dan kanan untuk menemukan titik awal.
Saat mencetak urutan yang diperkecil dan memutuskan cara memindahkan pointer yang disimulasikan, kita dapat mengambil pendekatan umum: mulai dengan menjauh dari titik akhir (dalam arah yang berubah-ubah jika titik awal dan titik akhir sama), putar ke kiri dan ke kanan node, dan berhenti berdasarkan berapa kali node akhir telah terlihat: 3 kali jika node awal dan akhir sama, jika tidak 2.
sumber
Python, 404 karakter
Kode ini melakukan optimalisasi sempurna dari semua tahapan dari
+-<>
. Sedikit lebih banyak dari yang Anda minta, tapi itu dia.Ini bekerja dengan mensimulasikan
+-<>
operasi pada rekaman itut
.s
adalah posisi awal pada kaset danp
posisi saat ini. Setelah simulasi, ia mencari tahu sejauh mana[a,b]
yang perlu dioperasikan dan melakukan semua +/- dalam satu lintasan optimal.sumber
CoffeeScript -
403397Demo (maafkan penggunaan bit.ly di sini, seluruh URL akan memecah markdown)
Versi tidak terkompresi (kode debug):
sumber
>+.-<
, menghasilkan string kosong bukannya membiarkannya tidak berubah.