Befunge'de golf için ipuçları


12

Befunge'de golf oynamak için hangi genel ipuçlarınız var? Ben genel olarak en azından biraz Befunge (örneğin "yorumları kaldırmak" bir cevap değildir) belirli olan golf sorunları kod uygulanabilir uygulanabilir fikirler arıyorum. Lütfen cevap başına bir ipucu gönderin.


Bunun genel olarak Befunge olarak değiştirilmesi gerekip gerekmediğinden emin değilim, ancak Befunge 93 golf için 98'den çok daha az idealdir.
Justin

6
Befunge 93 ile ilgili yeni bir konumuz vardı, ancak bence bu konuyu genelleştirmek daha iyi olurdu. Bu iyi olur mu? (ve Python ipuçlarının Python 2 / Python 3'e özgü olup olmadıklarını söyledikleri gibi, hangi ipuçlarının hangi sürümler için iyi olduğunu işaretleyin)
Sp3000

Yanıtlar:


9

Çok satırlı bir döngü kullanırken, mümkün olduğunca çoğunu kullanmayı deneyin:

>1234....v
^        <

vs

>1234v
^....<

7

Bir koşuldan sonra bir değer düşürmeniz gerekiyor (örneğin, diğer yol değere bağlı olduğu için, ancak bu değil)? Bunun yerine kullanmanın >$ya $<sen değişkenin gerçeği değerini bilmek ve kullanmak gerçeği advatage almak, _hem değişim yönüne yerine ve yığın pop.

Misal

'* : v           >$ .. @          Prints number in binary followed by the original
                                  decimal number.
     > :2%\2/ :!#^_ \.

dönüşür

'* : v           _  .. @          Since we know that the topmost value on the stack
                                  will be 0, we combine `>$` into `_`.
     > :2%\2/ :!#^_ \.

6

Unutmayın 0, her zaman yığın üzerindedir. Örneğin, boş bir yığını ile bu araçlarının, geşdeğerdir 00gve peşdeğerdir 000p.


5

15'ten büyük bir sayı basmanız gerekiyorsa ', sonraki karakterin ASCII değerini getirmek için kullanın :

'*

yerine 42 itmek:

4a*2+

Veya 67*çok çalışıyor
Kapı Tokmağı

4
@Doorknob Belki daha açık bir noktaya varmak için asal bir sayı seçmeliydim, ama 42 çok büyük bir sayı.
Justin

2
Bu ipucunun yalnızca Befunge-96 ve sonraki sürümler için geçerli olduğunu unutmayın. Befunge-93 'talimatı desteklemedi .
James Holderness

4

Kullanmak yerine, |başka bir satır gerektiren (çoğu zaman fazladan boşluk içeren) kullanmayı deneyin j. Örneğin:

01-`j@more code here

yığının üstündeki sayı negatifse durur ve aksi halde devam eder. Birden karakterleri gerekirse, kullanım n*jnerede ngeçirilen değer yaparken gerek karakter sayısıdır jolduğunu 0. Misal:

01-`4*j01-*more code

negatif bir sayıyı reddeder.


Bu ipucunun yalnızca Befunge-96 ve sonraki sürümler için geçerli olduğunu unutmayın. Befunge-93 jtalimatı desteklemedi .
James Holderness

4

Befunge-93'te, yığının üzerine ittiğiniz ilk şey bir dize ise, genellikle açılış teklifini bırakmaktan kurtulabilirsiniz. Örneğin bu:

"!iH",,,@

bunun için basitleştirilebilir:

!iH",,,@

Çevrimiçi deneyin!

Olan şey, yorumlayıcının ilk olarak tırnaksız dizgideki karakterleri yürütmeye çalışmasıdır. !Gerçekleştirdiği zararsız değildir ve ive H(bazı uygulamalarda üzerine bir uyarı alabilirsiniz rağmen) göz ardı ediyoruz, böylece geçerli talimatlar değildir.

Ne zaman "karşılaşılan o tellerden başlangıç olarak kabul edilir, ancak hiçbir kapanış alıntı olmadığından kadar, tüm yolu Playfield sarar "ikinci kez karşılaşıldığında. Sonunda yığına itilen şey şudur:

,,,@  ···72 spaces···  !iH

Ancak sadece son birkaç karakteri önemsediğimiz için, diğer şeylerin hiçbiri önemli değil. Alıntıdan sonra nihayet üç ,komutu yürütebiliriz , mesajı ve çıkan @komutu yazarız.

Tanınmayan bir talimat, yorumlayıcının görmezden gelmek yerine yansıtmasına neden olacağından, bunun genellikle Befunge-98'de çalışmadığını unutmayın.


Befunge-98'de bunun yerine gerekli dizgiyi satırın sonuna koyabilirsiniz ; ",,,@!iH. Pyfunge'nin fazladan boşluk eklediğini, FBBI'nın eklemediğini unutmayın.
Jo King

@JoKing Bunu önermek istemedim, çünkü belirttiğiniz gibi, davranış bir tercümandan diğerine farklılık gösterir. Ve işe yarıyor gibi görünse bile, tutarsızdır ( bu durumda FBBI'daki fazladan alana dikkat edin ), bu yüzden muhtemelen bir noktada sabitlenebilecek bir hata.
James Holderness

Hmm ... Bence alan aslında şartnamenin bir parçası olabilir. Bir yerde birden fazla alanın atlanıp tek bir alan olarak sayılacağını hatırlıyorum. Örnek PyFunge ve FBBI hem de. PyFunge ekstra boşlukları örtülü olarak eklerken FBBI her satırı en uzun satırın uzunluğuna dolduruyor gibi görünüyor .
Jo King

Haklısın - teknik özellik bir dizgideki birden çok boşluğun tek bir boşluk olarak ele alınması gerektiğini söylüyor. Aslında, kuralın sonsuz bir oyun alanında dizeleri sarma problemiyle başa çıkmak için özellikle önerildi (bu nedenle PyFunge açıkça doğru AFAIC). Ancak, spesifikasyonun sarma algoritması açıklaması bir şekilde yoruma açıktır, bu yüzden bazı uygulamaların neden farklı şeyler yapabileceğini anlayabiliyorum. Ancak sonuçta bu oldukça karmaşık bir konudur ve bence Befunge-97 / 98'e özgü ayrı bir ipucu olarak daha iyi ele alınacaktır.
James Holderness

4

Befunge-93'de, bir döngü tek bir satıra düzleştirilirken, kodun döngü bölümü her iki yönde de yürütülür.

Örneğin, harfi asekiz kez çıkaran aşağıdaki kodu göz önünde bulundurun :

"a"9>1-:#v_@
    ^\,:\<

Bu, döngü sırasını köprü talimatları ( #) ile serpiştirerek tek bir satıra düzleştirilebilir :

"a"9>1#\-#,:#:>#\_@

Çevrimiçi deneyin!

Yalnızca boşluk olmayan karakterlere bakıyorsanız, bunun orijinalden daha uzun olduğu izlenimini edinebilirsiniz. Ancak, satır beslemesini ve iki satır sürümünde gerekli ek dolguyu hesaba kattığınızda, aslında dört bayt tasarruf edersiniz.

Bu özel durumda, kod, bu sekansın :#:basitçe değiştirilebileceğini belirterek daha da sıkıştırılır :.

"a"9>1#\-#,:>#\_@

Çevrimiçi deneyin!

Aslında, bir #komutun her iki tarafında da aynı komutu tekrar ettiğinizde , bunu tek bir komutla basitleştirebilirsiniz, bu nedenle bu, bir döngüyü düzleştirirken her zaman dikkat etmeniz gereken bir şeydir.

Bunun nasıl çalıştığını anlamak için, döngü dizisini iki kez, bir kez #kaldırılan tüm karakterlerle (yani soldan sağa yürütürken ne olur) ve bir kez de #kaldırılandan önceki karakterlerle (yani sağdan sola yürütülürken) yazmak yardımcı olabilir. ).

"a"9>1#\-#,:>#\_@
    >1  -  :>  _      ; executing left to right
    >  \  ,:  \_      ; executing right to left

Şimdi bunun kodun orijinal iki satır sürümüyle nasıl eşleştiğini açıkça görebilirsiniz.


3

Çıkış kodu ile çıktı, burada izin verilen bir çıktı formu. Zorluk sizden bir sayı yazdırmanızı isterse, programı bitirmek qyerine bitirerek bir bayt kaydedebilirsiniz ..@


2
Bu ipucunun yalnızca Befunge-98 ve sonraki sürümler için geçerli olduğunu unutmayın. Befunge'nin önceki sürümlerinde qtalimat farklı bir işleve (kuyruk modu) sahipti veya desteklenmiyordu.
James Holderness

3

Befunge-93'de ~EOF üzerinde döndürdüğü değer olduğundan karakter giriş komutu ( ) genellikle -1 için kısayol olarak kullanılabilir.

Örnek olarak, aşağıdaki kod -1 çıktısı verir:

~.@

Çevrimiçi deneyin!

Bu, üretim kodunda önerilmez, çünkü etkileşimli bir ortamda çalıştırıldığında, program duraklar ve kullanıcı girdisini bekler. Ve eğer kullanıcı bir şey girecek olsaydı, sonuç artık -1 olmayacaktı.

Yani PPCG üzerinde kural olduğunu belirterek, bir program boş bir giriş akışı kabul edebiliriz ve bu genellikle çalıştırılacak girerdim TIO .

Ayrıca, yalnızca programınızın giriş akışından bir şeyler okuması gerektiğinden bu hile kullanmaktan kaçınmanız gerekmediğini unutmayın. Sadece girdilerinizi önceden işlediğinizden emin olmalısınız, bundan sonra gelecekteki tüm kullanımlar ~-1 döndürmelidir.


2

IP ile ilgilenirken _veya |için fazladan bir karakter kullanmak yerine IP yönünü kullanın !.

Gerçek örnek ( bu yayından ):

#v~
,>:!#@_

Olarak değiştirilebilir

#v~
:<,_@#

2

0kBir sonraki talimatı uygulamadığını unutmayın . Bu, yapmak yerine:

;some boolean test;!jv;code if false;
       ;code if true;<

Yaparak bir karakteri kaydedebilirsiniz

;some boolean test;kv;code if false;
      ;code if true;<

Bu ipucunun yalnızca Befunge-98 ve sonraki sürümler için geçerli olduğunu unutmayın. Befunge'nin önceki sürümleri ktalimatı desteklemiyordu .
James Holderness

1

kOperatörü unutma . Yerine "!dlroW olleH",,,,,,,,,,,,@, do "!dlroW olleH"bk,@. Not koperasyonu yapar o altında olduğunu hücrede böylece 9k,değil 9 kez ama 10 basacaktır; 9 kez kve bir kez ,.


1
Bu ipucunun yalnızca Befunge-98 ve sonraki sürümler için geçerli olduğunu unutmayın. Befunge'nin önceki sürümleri ktalimatı desteklemiyordu .
James Holderness

1

Yığının üzerine küçük sayılar iterken, muhtemelen 45*sizi alacak 20ve sizi alacak kadar kolay bir şekilde anlayabilirsiniz . Daha büyük rakamlar söz konusu olduğunda, sizin için en verimli temsili hesaplayabilen bir programa gerçekten ihtiyacınız var.67*42

Bunun için en kolay seçenek Mike Schwörer'in BefunRep'in çevrimiçi arayüzüdür . Sadece bir sayı yazın ve eşdeğer bir Befunge temsili tükürecektir. Her zaman en uygun değildir, ancak yeterince yakındır ve elle elde edebileceğiniz her şeyden daha iyi olduğu neredeyse kesindir.

Çevrimiçi sistem 0 ila 16777215 aralığındaki sayılarla sınırlıdır, bu nedenle bundan daha büyük bir şeye ihtiyacınız varsa, bağımsız BefunRep yardımcı programını indirmek ve hesaplamaları kendiniz çalıştırmak istersiniz .

Befunge-98'de programlıyorsanız, dikkate almanız gereken başka bir seçenek Fungify'dır . Genel olarak BefunRep kadar neredeyse ideal değildir, ancak onaltılık basamakların ve tek tırnak karakterlerinin en etkili olduğu bazı düşük sayılar için bazen daha iyi sonuçlar verebilir.


Befunge 98'de küçük sayıları iterken kullanırsınız '. İçin Örn 42:'*
Justin

@ Justin son paragrafta bahsetmiştim, ama bu ipucunun asıl amacı, sadece sizin için yapmak için bir araç kullanırsanız, sayı üretmek için bu hilelerin çoğunu bilmenize gerek yok.
James Holderness
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.