Compact program Befunge


17

Befunge adalah bahasa pemrograman esoterik 2 dimensi. Ide dasarnya adalah bahwa perintah (satu karakter) ditempatkan pada kisi 2 dimensi. Aliran kontrol berjalan melintasi kisi, menjalankan perintah yang dilewatinya, dan mengubah arah saat menyentuh panah ( >^<v). Perintah berbasis stack; lihat daftar ini . Lihat juga http://esolangs.org/wiki/Befunge .

Spesifikasi untuk Befunge-98 tersedia.

Masalah

Tulis program yang mengubah program Befunge menjadi representasi yang lebih ringkas. Misalnya, program berikut mencetak 0:

>   0   v

>   @   .

^       <

Dalam hal ini, itu bisa dipadatkan tanpa mengubah perilaku program dengan menghapus barisan ruang, untuk diberikan

>0v
>@.
^ <

Transformasi yang lebih canggih dapat memutar atau mencerminkan urutan perintah dan menghilangkan perintah aliran kontrol yang tidak perlu untuk memadatkan program. Misalnya, dengan program ini:

>12345v
      6
v....7<
.
.
.
@

Anda mungkin memasukkan ujung program ke dalam lubang:

>12345v
>...@ 6
^....7<

Sebagai contoh pertama, program yang paling ringkas mungkin adalah

>0.@

Anda dapat menggunakan transformasi apa pun selama program keluaran memberikan hasil yang sama.

Program input

Program input adalah program Befunge-98 yang valid.

Anda dapat mengasumsikan bahwa program input bersifat deterministik. Artinya, tidak menggunakan perintah yang membaca keadaan eksternal: perintah input pengguna &dan ~, pengacak ?, dan perintah kode modifikasi diri pdan g.

Anda dapat menganggap program input berakhir.

Mencetak gol

Ini bukan kode golf, tetapi masalah untuk menulis program yang melakukan kode golf.

Input adalah seperangkat kasus uji (program Befunge yang memenuhi batasan input di atas). Skor total adalah jumlah skor untuk kasus uji.

Skor untuk setiap test case

Skornya adalah area lambung cembung dari sel-sel yang tidak kosong dalam program keluaran, di mana setiap sel diperlakukan sebagai kotak yang empat sudutnya adalah titik-titik kisi dalam bidang Cartesian. Misalnya, sebuah program dari

>   v
 @  <

mendapat skor 9,5.

Jika program Anda tidak berakhir dalam jumlah waktu dan memori yang masuk akal pada input tertentu, skornya adalah dari program input. (Ini karena Anda dapat dengan mudah menambahkan pembungkus pembatas waktu yang membuat output program input tidak berubah jika program Anda tidak berakhir dalam waktu.)

Jika program kasus uji memiliki hasil yang berbeda (atau gagal berakhir) setelah diproses dengan program Anda, skornya adalah skor program input ditambah penalti 100 poin.


8
Apa yang mencegah menjalankan program sampai selesai dan menulis program Befunge yang mencetak output yang sama?
Keith Randall

5
Apakah "mendapatkan" dan "menempatkan" diizinkan? Jika Anda mengizinkan "put" (kode modifikasi sendiri), akan sulit untuk melakukan apa pun.
Keith Randall

2
Di mana eksekusi dimulai? Pojok kiri atas? Jika demikian, dapatkah Anda menjelaskan output dari contoh ke-2? .berarti bilangan bulat keluaran, tetapi jika Anda mulai dari kiri atas, maka tidak ada bilangan bulat di tumpukan ke keluaran.
elssar

1
@elssar ya, .menghasilkan bilangan bulat. Tetapi juga, ketika tidak ada parameter yang cukup pada stack, befunge berpura-pura ada jumlah nol yang cukup di sana sebagai gantinya. Jadi contoh kedua akan ditampilkan 000.
daniero

@KeithRandall: Menulis program baru dengan output yang sama hanya berfungsi untuk program dengan output pendek. gdan ptidak diizinkan (maaf, lupa tentang itu; diedit).
Mekanik siput

Jawaban:


12

Saya menghabiskan waktu lama naik pesawat untuk mengkodekan yang satu ini. Saya telah menulis kompiler befunge pseudo yang menjalankan program befunge, mengekstrak blok dasar, dan menjabarkannya dalam representasi yang ringkas.

Tautan ke program .

Ketika dijalankan pada program 99 botol ini:

92+9*                           :. v  <
>v"bottles of beer on the wall"+910<
,:
^_ $                             :.v
            >v"bottles of beer"+910<
            ,:
            ^_ $                     v
>v"Take one down, pass it around"+910<
,:
^_ $                           1-v
                                 :
        >v"bottles of beer"+910.:_          v
        ,:
        ^_ $                          ^
                    >v" no more beer..."+910<
                    ,:
                    ^_ $$ @

Ini menghasilkan output berikut:

92+9*:.019+"llaw eht no "v
v  _v# :"bottles of beer"<
>    ,:    v
^  _v#     <
    >$:.019+"reeb f"v
 v _  v#:"bottles o"<
 >     ,:  v
 ^ _  v#   <
      >$019+"dnuo"v
     v"pass it ar"<
     >" ,nwod eno"v
 v _    v#:"Take "<
 >       ,:v
 ^ _    v# <
        >$1-:v
 v _      v# <
 >         :.019+"reeb "v
  v_  v#   :"bottles of"<
  >        ,v
  ^_  v#   :<
      >    $019+"llaw"v
           v" on the "<
           >"reeb fo "v
^  _^#      :"bottles"<
          >019+"...r"v
v  _v#:" no more bee"<
>    ,:    v
^  _v#     <
    >$$@    

Ini sebenarnya tidak jauh lebih kompak dari sumbernya, tetapi mungkin akan lebih baik pada program yang lebih besar / sparser.

Program ini ditata dengan area perutean di sebelah kiri dan isi blok dasar di sebelah kanan. Blok dasar biasanya diletakkan dalam jumlah baris yang genap sehingga pintu masuk dan keluar berdampingan dengan area routing. Di akhir setiap blok dasar, gadget#^_v dan varian, yang ditata dari kanan ke kiri, melakukan cabang bersyarat dan rute mengalir ke kolom. Di awal setiap blok dasar, kolom ini dirutekan ke dalam baris untuk blok dasar tujuan.

Selain itu, jika output pendek, itu hanya menghasilkan output secara eksplisit, seperti ini:

"output">:#,_@

Saya belum melakukan apa pun untuk mengoptimalkan blok dasar sendiri, hanya tata letak. Melakukan.

Jadi, di mana tesnya?


1
tautan kode sumber sepertinya 500 sekarang. Kesalahan konfigurasi server?
John Dvorak

1
@ JanDvorak: memang. Tetap.
Keith Randall

1

Sed, 5 karakter

Jadi, bahkan jika ini bukan codegolf, inilah solusi yang akan memiliki rasio codelength to score yang agak bagus, tetapi tidak harus skor yang baik.

/^$/d

Ini hanya menghapus garis kosong.


10
Kode Anda salah! Anda tidak bisa hanya menghapus garis kosong. Saya tidak dapat menulis kode 2d dalam komentar. Tetapi pertimbangkan sebuah kasus bahwa arahnya mengarah ke bawah, dan sebuah string konstan dimulai ( "). Setiap baris kosong di jalan harus diperlakukan sebagai karakter spasi. Jika kami mencetak string itu, kode yang Anda hasilkan tidak memiliki spasi dalam output!
saeedn

3
Lihatlah kode di ideone.com/BdcRcf Seharusnya dicetak b a. Tetapi setelah pemendekan Anda, itu akan dicetak ba.
saeedn
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.