Bu Haftalık Görev # 2. Tema: Çeviri
Prelude'taki bir program için kaynak kodunu alan ve Befunge-93'te eşdeğer bir program için kod çıkaran bir program veya işlev yazın . Programın eşdeğer olması için, herhangi bir giriş için Prelude programıyla aynı çıktıyı üretmeli ve yalnızca Prelude programı durursa durmalıdır.
Giriş dili: Prelude
Python yorumlayıcısı:
Bir Prelude programı, talimatları aynı anda yürüten bir dizi "ses" den oluşur. Her ses için talimatlar ayrı bir satırdadır. Her sesin, sonsuz miktarda sıfırla başlatılan ayrı bir yığını vardır. Yürütme en soldaki sütundan başlar ve etkilenen durumlar )
veya (
talimatlar dışında her bir işaretin sağına bir sütun ilerletir . Program, son sütuna ulaşıldığında sona erer.
Bu meydan okuma için başlangıç spesifikasyonu:
Digits 0-9 Push onto the stack a number from 0 to 9. Only single-digit
numeric literals can be used.
^ Push onto the stack the top value of the stack of the above
voice.
v Push onto the stack the top value of the stack of the below
voice.
# Remove the top value from the stack.
+ Pop the top two integers from the stack and push their sum.
- Pop the top two integers from the stack, subtract the topmost
from the second, and push the result.
( If the top of the stack is 0, jump to the column after the
matching `)` after the current column executes.
) If the top of the stack is not 0, jump to the column after
the matching `(` after the current column executes.
? Read an integer from STDIN.
! Pop one value from the stack and print it to STDOUT as an
integer.
<space> No-op
notlar
v
ve^
döngüsel olarak hareket eder, böylecev
alt ses üst sesin yığın öğesini kopyalar^
ve üst ses alt sesden kopyalanır. Corollary: Hemv
ve^
tek sesli programında yığının tepesine çoğaltmak.- A
(
ve eşleşmesi)
farklı hatlarda bulunabilir. Bununla birlikte , a)
her zaman karşılık gelen sesin yığınına bakacaktır(
,)
kendi yerleştirildiği yığına değil . ^
Vev
talimatları tarafından üretilen değerler, aynı sütundaki diğer işlemlerin tamamlanmasından önce mevcut değerler üzerinde çalışır.?
ve!
esolangs.org adresinde bulunan spesifikasyondan farklı şekilde çalıştığından, bu yayında sağlanan biraz değiştirilmiş yorumlayıcıyla test ettiğinizden emin olun.
Girdi şunlara sahiptir:
- Eşleşen parantezler
- Bir sütunda birden fazla parantez yok
- Her satırda aynı sayıda karakter
- En az bir satır
- Birden fazla G / Ç (
!
veya?
) talimatı olan sütun yok - Her ses için talimatlardan sonra bir satır besleme karakteri
- Yukarıda belirtilenlerden başka karakter yok
Çıkış dili: Befunge-93
Befunge, program sayacı (PC; geçerli talimatın bir işaretçisi) iki boyutlu bir ızgarada serbestçe hareket eden yığın tabanlı bir dildir. Sol üst köşeden başlayarak sağa doğru hareket eder. Oyun alanı toroidaldir, yani PC hareketi her iki kenarı da sarar. Befunge ayrıca sonsuz sayıda sıfır değerine başlatılan bir yığını da içerir. Befunge aşağıdaki işlemlere sahiptir:
Befunge-93 derleyicisinin / yorumlayıcısının aşağıdaki özelliklerini varsayabilirsiniz:
- Tamsayılar sınırsız hassasiyettedir.
- Her boyutta ızgaraya izin verir.
- Izgara koordinatları (
g
ve içinp
) 0 tabanlıdır.
puanlama
Befunge'de bir Prelude yorumlayıcısı üreten ve Prelude kaynağını buna kodlayan gönderimleri önlemek için amaç, ortaya çıkan Befunge kaynak kodunun boyutunu en aza indirmektir.
Aşağıda bir dizi Prelude programı verilmiştir. Çevirmeniniz bunların hepsinde çalışacaktır. Puanınız, hepsi geçerli olması koşuluyla, Befunge programlarının boyutlarının toplamıdır.
Tercümanınız özellikle bu test senaryolarına göre optimize edilmemelidir (örneğin, bunlar için elle yazılmış Befunge programlarını kodlayarak). Bunun herhangi bir cevabından şüphelenirsem, girdileri değiştirme veya ilave giriş yapma hakkımı saklı tutarım.
Örnek Girişler
n-1
Aşağıya yazdırın 0
:
?(1-^!)
Mantıksal VE:
? (0)
?(0 )
1 !
Mantıksal VEYA:
? (0)
? (0)
1 1 !
Negatif olmayan sayının giriş paritesini (yani modulo 2) kontrol edin:
?(1-)
^ v
v1-^^-!
Girdinin karesini alın:
^
^+ !
?(1-)
Baskı n Fibonacci sayısı, inci burada n = 0
0 karşılık gelir ve n = 1
1 karşılık gelir:
0 v+v!
1 ^
?(1-)
İşaret:
1) v # - !
vv (##^v^+)
?(# ^ ##
Negatif olmayan girişler için bölüm:
1 (# 1) v # - 1+)
vv (##^v^+)
? v-(0 # ^ #
?
1+ 1-!
Elbette, örnek programın negatif sayılar için davranışı belirtilmemiş olsa bile, programınızın tüm durumlar için aynı davranışı göstermesi gerekir.
Son olarak, çevirmeniniz mantıksızca uzun olmamalıdır:
- Bir Stack Exchange gönderisinin içinde bulunmalıdır
- Tipik bir masaüstü bilgisayarda örnek girişlerini 10 dakikadan daha kısa sürede işlemelidir.
Prelude veya Befunge için sayısal bir girişin isteğe bağlı eksi işareti ve ardından bir veya daha fazla ondalık basamak ve ardından bir satırsonu olarak verildiğini unutmayın. Diğer girdi tanımsız davranıştır.
Çevirmeninizi herhangi bir dilde yazabilirsiniz. En kısa tercüme edilen Befunge kodu kazanır.
Liderler Sıralaması
- Sp3000 : 16430 bayt
1
Bir döngünün içindedir, bu yüzden itilmeyebilir . 0, yığınlarda başlayan sonsuz miktarda 0'dan gelebilir.