Arka fon
Fractran , John Conway tarafından icat edilen ezoterik bir Turing-complete programlama dilidir. Bir Fractran programı sıralı kesirler listesinden oluşur. Program giriş olarak tek bir tamsayı alınarak başlar. Programın her yinelemesi, ilk kesir için listeyi arar, böylece sayıyı bu kesirle çarpmak başka bir tamsayı üretir. Daha sonra bu işlemi listenin başından başlayarak yeni numarayla tekrarlar. Listede sayı ile çarpılabilecek kesir olmadığında, program sonlanır ve sayıyı çıktı olarak verir.
Fractran'ın Turing-complete olmasının nedeni, bir kayıt makinesini simüle etmesidir. Sayının birincil çarpanlarına ayırma işlemi, kayıtların içeriğini saklarken, bölme ve çarpma, kayıtlara koşullu olarak ekleme ve çıkarma işleminin bir yoludur. Wikipedia makalesini okumanızı tavsiye ederim (yukarı bağlantılı).
Meydan okuma
Göreviniz STDIN'den tek girişi olarak geçerli bir Fractran programını alabilecek ve Fractran programını simüle eden STDOUT için geçerli bir BF programı oluşturabilecek mümkün olan en kısa programı yazmaktır. BF ile bir Fractran programını simüle etmenin iki yolu vardır.
NOT: Cevabınız bir BF programı değildir. Cevabınız, herhangi bir Fractran programından BF programını oluşturan koddur. Amaç, BF programının Fractran programının eşdeğeri olmasını sağlamaktır. (teknik olarak BF'de yarışmayı yapabilirsiniz, ancak zor olurdu)
seçenek 1
Programınız aşağıdakileri yapan bir BF programı çıkarmalıdır:
- Fractran programına giriş olan karşılık gelen ASCII karakteri (BF girişinin çalışma şekli nedeniyle) olarak STDIN'den tam olarak 1 sayı alır.
- Fractran programından çıktı olarak gelen karşılık gelen ASCII karakteri biçiminde STDOUT'a tam olarak 1 sayı yazdırır.
Bu seçenek, bir Fractran sanal makinesinden kesin girdi ve çıktıyı temsil eder.
seçenek 2
Programınızın ürettiği BF kodu aşağıdakileri yapmalıdır:
- Bellekte kodlanmış sayının asal çarpanlarına ayırmasını sağlayarak (programı çalıştırmadan önce) girdi alın. Giriş 28 ise (2 * 2 * 7), ikinci hücrede 2 değeri ve yedinci hücrede 1 değeri olacaktır (işaretçi 0 hücresinde başlar). Diğer tüm hücreler sıfır olacaktır.
- Program sona erdiğinde bellekte kodlanmış çıktının birincil çarpanlarına ayırmasını sağlayarak çıktı verin. Çıktı 10 ise, 2 ve 5 hücrelerinin her birinde 1 değeri olmalıdır. Diğer tüm asal numaralı hücrelerin sıfır değeri olmalıdır. Diğer hücrelerin içeriği önemli değil.
Bu seçenek Fractran dilinin arkasındaki bilgi işlem modelini temsil eder.
Kurallar ve Gereksinimler
- Girdi (programınızın üstünde) STDIN'deki kesirlerin bir listesi olacaktır. Pay ve payda arasında virgül bulunan satır başına bir kesir olacaktır. Boş bir satır girişin sonunu temsil eder. Kesirler her zaman en düşük terimlere indirgenecektir.
- Programınızın çıktısı STDOUT için tek satırlık, geçerli bir BF programı olmalıdır. Bu program, bu Fractran programını iki seçenekten birine göre simüle edebilmelidir. Herhangi bir girdi için, oluşturulan BF programı, Fractran programıyla aynı çıktıyı üretebilmelidir.
- Hangi seçeneği seçtiğinizi belirtmeniz gerekir.
- BF belleği ve kasetindeki sınırları ve bunların sarılıp sarılmadığını seçebilirsiniz
- KOD GOLF. Ayrıca, çıkan BF programlarının boyutu önemli değil, sadece dönüştürme yapan programın boyutu.
- Programlar yalnızca yazdırılabilir ASCII'den oluşmalıdır
Eğer herhangi bir yerde muğlaksam, sormaktan çekinmeyin. Bu tarif edilmesi çok karmaşık bir zorluktur.
Ayrıca, programınızın çalışıp çalışmadığını kontrol etmenin kolay bir yolunu sağlamak için lütfen programınızın oluşturulan BF kodunu aşağıdaki giriş için gönderin:
33,20
5,11
13,10
1,5
2,3
10,7
7,2
Bu program, bir sayının ikili genişlemesinde 1s sayısını hesaplar. Ancak, giriş ve çıkış garip bir şekilde biçimlendirilir (tüm Fractran programlarında olduğu gibi). Girdi 2 ^ A biçimindeyken, çıktı 13 ^ B biçimindedir.