Bir Befunge programını sıkıştırın


17

Befunge 2 boyutlu ezoterik bir programlama dilidir. Temel fikir, (tek karakterlik) komutların 2 boyutlu bir ızgara üzerine yerleştirilmesidir. Kontrol akışı ızgara boyunca yürür, üzerinden geçtiği komutları uygular ve bir oka ( >^<v) bastığında yön değiştirir . Komutlar yığın tabanlıdır; bu listeye bakın . Ayrıca bkz . Http://esolangs.org/wiki/Befunge .

Befunge-98 için özellikler mevcuttur.

Sorun

Befunge programını daha kompakt bir temsile dönüştüren bir program yazın. Örneğin, aşağıdaki program yazdırılır 0:

>   0   v

>   @   .

^       <

Bu durumda, alanların satırlarını kaldırarak programın davranışını değiştirmeden sıkıştırılabilir,

>0v
>@.
^ <

Daha karmaşık dönüşümler, komut dizilerini döndürebilir veya yansıtabilir ve programı sıkıştırmak için gereksiz kontrol akışı komutlarını ortadan kaldırabilir. Örneğin, bu programla:

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

programın sonunu deliğe sokabilirsiniz:

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

İlk örnek için, mümkün olan en kompakt program

>0.@

Çıktı programı aynı sonucu verdiği sürece herhangi bir dönüşümü kullanabilirsiniz.

Giriş programları

Giriş programları geçerli Befunge-98 programlarıdır.

Girdi programının deterministik olduğunu varsayabilirsiniz. Yani, harici durumu okuyan komutları kullanmaz: kullanıcı giriş komutları &ve ~rasgeleleştirici ?ve kendi kendini değiştiren kod komutları pve g.

Giriş programının sona erdiğini varsayabilirsiniz.

puanlama

Bu bir kod golf değil, kod golf yapan bir program yazmak için bir problemdir.

Giriş, bir dizi test vakasıdır (yukarıdaki giriş kısıtlamalarını karşılayan Befunge programları). Toplam puan, test senaryolarının puanlarının toplamıdır.

Her test vakası için puan

Skor, çıktı programındaki boş olmayan hücrelerin dışbükey gövdesinin alanıdır; burada her hücre, dört köşesi Kartezyen düzlemde kafes noktaları olan bir kare olarak ele alınır. Örneğin,

>   v
 @  <

9,5 puan alır.

Programınız belirli bir girişte makul bir süre ve bellekte sona ermezse, puan giriş programının sonucudur. (Bunun nedeni, programınız zamanında sona ermezse, giriş programını değiştirmeden çıkaran zaman sınırlayıcı bir sarmalayıcı ekleyebilmenizdir.)

Sınama programı, programınızla işlendikten sonra farklı bir sonuca sahipse (veya sonlandırılamazsa), puan, giriş programının puanı artı 100 puanlık bir cezadır.


8
Programı, aynı çıktıyı yazdıran bir Befunge programının tamamlanması ve yazılması için ne engellemelisiniz?
Keith Randall

5
"Get" ve "put" komutlarına izin veriliyor mu? "Put" (kendi kendini değiştiren kod) 'a izin verirseniz, herhangi bir şey yapmak zor olacaktır.
Keith Randall

2
İcra nerede başlar? Sol üst köşe? Eğer öyleyse, 2. örneğin çıktısını açıklayabilir misiniz? .çıkış tamsayı anlamına gelir, ancak sol üst köşeden başlıyorsanız, çıktıda tamsayı bulunmaz.
elssar

1
@elssar yes, .bir tamsayı verir. Ama aynı zamanda, yığın üzerinde yeterli parametre olmadığında, befunge bunun yerine yeterli miktarda sıfır olduğunu iddia eder. Yani ikinci örnek çıktı 000.
daniero

@KeithRandall: Aynı çıktıya sahip yeni bir program yazmak yalnızca kısa çıktıya sahip programlar için geçerlidir. gve pizin verilmiyor (üzgünüm, bunları unuttum; düzenlenmiş).
Mekanik salyangoz

Yanıtlar:


12

Bunu kodlamak için uzun bir uçak yolculuğu geçirdim. Befunge programını çalıştıran, temel blokları ayıklayan ve bunları kompakt bir sunumla düzenleyen bir sözde befunge derleyicisi yazdım.

Programa bağlantı .

Bu 99 şişe programında çalıştırıldığında:

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<
                    ,:
                    ^_ $$ @

Aşağıdaki çıktıyı üretir:

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#     <
    >$$@    

Aslında kaynaktan çok daha kompakt değil, ancak büyük / daha az programlarda muhtemelen daha iyi olacaktır.

Program solda bir yönlendirme alanı ve sağda temel blok içeriği ile düzenlenmiştir. Temel bir blok genellikle çift sayıda sıraya yerleştirilir, böylece giriş ve çıkış yönlendirme alanına bitişiktir. Her bir temel bloğun sonunda, #^_vsağdan sola düzenlenmiş gadget ve varyantlar koşullu dalı ve rota sütunlarına akar. Her temel bloğun başlangıcında, bu sütunlar hedef temel bloğun satırlarına yönlendirilir.

Ayrıca, çıktı kısaysa, çıktıyı açık bir şekilde oluşturur, şöyle:

"output">:#,_@

Temel blokları kendileri optimize etmek için hiçbir şey yapmadım, sadece düzeni. Yapmak.

Testler nerede?


1
kaynak kodu bağlantısı şu anda 500 gibi görünüyor. Sunucu yanlış yapılandırılsın mı?
John Dvorak

1
@ JanDvorak: gerçekten. Sabit.
Keith Randall

1

Sed, 5 karakter

Yani, bu kodgolf olmasa bile, burada oldukça iyi bir kod boyu / puan oranına sahip olacak, ancak mutlaka iyi bir puan olmayacak bir çözüm.

/^$/d

Sadece boş satırları kaldırır.


10
Kodunuz doğru değil! Sadece boş satırları kaldıramazsınız. Yorumda 2d kodu yazamıyorum. Ancak, yönün aşağıya doğru olduğu ve sabit bir dizenin başlatıldığı ( ") bir durumu düşünün . Yoldaki her boş satıra boşluk karakteri olarak davranılmalıdır. Bu dizeyi yazdırırsak, oluşturduğunuz kodun çıktısında bu boşluklar olmaz!
saeedn

3
Kod bak ideone.com/BdcRcf O yazdırmalısınız b a. Ancak kısaltmanızdan sonra yazdırılacaktır ba.
saeedn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.