# 4"16" 3//v\(@#/;\D"14"<;n4
#/*`3 afaaZ">;[77*,68*,@;'1,'1,q)(22)S# ␉␉␉␉ (
#yy␉;36!@
#`<` ␉
#=␉x
#<]+<[.>-]>[
#␉<
###xR+++++[D>+++++++L+++<-][<<<]>+.---.>][
#px%>~~~+␉+~*ttt*.x
#D>xU/-<+++L)
#R+.----.R␉>]|
#[#yy#yy0l0mx01k1k0l0ix0jx0h0h1d111P0eU0bx0b0o1d0b0e0e00x1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10mx0m0l11111100(^_)
#|␉
print((eval("1\x2f2")and(9)or(13 ) )-(0and 4)^1<<(65)>>(62))or'(\{(\{})(\{}[()])}\{}\{}\{})'#46(8+9+9+9+9+=!)#1111|=/=1/24=x=9[<$+@+-@@@@=>+<@@@=>+<?#>+.--.]/
__DATA__=1#//
#.\."12"␉*
###; console.log 39
""""#//
=begin␉//
#*/
#define␉z sizeof 'c'-1?"38":"37"
#include<stdio.h>
int main() /*/
#()`#`\'*/{puts(z);}/*'``
$'main'␉//
#-3o4o#$$$
<>"3"O.<␉>//
#
=end #//
"""#"#//
#0]#echo 21#/(\[FAC,1<-#2FAC,1SUB#1<-#52FAC,1SUB#2<-#32FACLEGEREEX,1PLEASEGIVEUPPLEASE) a>>>
#>27.say# /7Jn~15o|
#8␛dggi2␛`␉|1|6$//''25 =#print(17) ###^_^_LEintnd"3"z!]/}23!@/*///Z222999"26
␉
bir hazır bilgi sekmesidir, ␛
bir hazır bilgi ESC karakteridir; Yığın Değişimi, programı tersine çevirir. Üzerinde çalışmak istiyorsanız, programı aşağıdaki TIO bağlantısının "giriş" kutusundan kopyalamanızı öneririm.
Çevrimiçi deneyin!
VIP Puanı (Çok Yönlü Tamsayılı Yazıcı): 0.01329
Bitkin
Bu program, baskılar 41 Brainf içinde *** 40 az-2D, içinde 39 CoffeeScript içinde, 38 ° C de, 37 ° C ++, içinde 36 Labirent'teki, 35 INTERCAL içinde, 34 Rail, 33 olayda, 32 dönüyordu, 31 içinde Modüler SNUSP, 30 Boşluk, içinde 29 Tetikleyicide, 28 Beyin Flak, içinde 27 Perl 6'da, 26 05AB1E içinde, 25 Pip içinde, 24 Thutu içinde, 23 Hexagony içinde, 22 düşük yük olarak,21 fizyonda, 11 Befunge-98, 10 Befunge- bölgesindeki 93, 9 Perl 5, içinde 8 Retinal, 7 Japt içinde, 6 SMBF içinde, 5 Python 2'ye 4 > <> 'de, 3 Minkolang içinde, 2 V / Vim ve 1 Python 3. Nim bölgesi 20 Prelude, 19 Reng içinde, 18 Cardinal , 17 , Julia içinde 16 Pyth içinde, 15 samanlýkta, 14 Turtlèd içinde, 13 Ruby, 12
Doğrulama
Dillerin çoğu yukarıda gösterilen test sürücüsü tarafından test edilir. Burada Reng'i ve Modüler SNUSP'yi burada test edebilirsiniz ; gerektiği şekilde sırasıyla 19 ve 31 çıktılar.
Sonunda Test Sürücüsü Tokenizer içerecek şekilde güncellendi. Tüm C kodu Bash Script'in perspektifinden bir argüman olarak saklanır. Dikey olarak çıktı yapmak yerine her belirteçten sonra izleyen bir boşlukla yatay olarak sarılacak çıktıyı da değiştirdim. Bu sadece benim tercihimdi, Whitespace çıktısıyla eşleşmesini sağladı. Ancak, kafa karıştırıcı gibi hissediyorlarsa, başkası bunu değiştirebilir.
Ayrıca Turtlèd’in UFT8 karakterindeki sütun aralığını sıradaki sırayla işlemek için bir Test Sürücüsü ayarı yaptım. Bu yanlış hizalama beni deli ediyor! “Düzeltme” oldukça kesiktir, çünkü sadece bir è arar ve bu durumda sütun genişliğini değiştirir, ancak işi halleder.
açıklama
İlk olarak, @ SnoringFrog'un Çok Yönlü Tamsayılı Yazıcı Puanının müthiş bir kod yazısının son yazıdan ne kadar harika olduğunu söylemek istiyorum . Bir süredir göndermeden önce cevapları hesaplıyorum ve bu bana küçük tutmam için ilham verdi. Sanırım sonunda @ sp3000'in cevabını yenebiliriz.
Bu yüzden elimden geleni yapmaya çalışarak bu cevap üzerinde çalışmaya başladım ve oldukça başarılı oldum. # 40'tan küçük toplam bayt sayısı ile farklı bir dilde bir cevabım bile vardı. Ama Minimal-2D'yi oynamaya çalışırken BF'yi öğrenmek zorunda kaldım, böylece türevleriyle daha iyi çalışabilecektim ve bu süreçte @ Primo'nun rekorunu kıran Merhaba, Dünya! . Ben zarafete aşık oldum.
Minimal-2D, @Primo tarafından kullanılan kaset başlatma tekniğini kullanmak için yeterince verimli değildi, ama şimdi muhtemelen zaten çok fazla byte ağır olacağı kanısındayım. Sonuçta sadece bir tamsayı yazdırmaya çalışıyoruz. Fakat @Primo, Minimal-2D'nin koduna getirdiğim BF'de nasıl çarpılacağını öğrenmenin yolunu yolladı.
Tüm bunlardan sonra, @ SnoringFrog'un BF'yi nasıl dahil edeceği hakkındaki yorumunu tekrar okudum ve sadece bunu yapabileceğimi değil, BF cevabında yazdığım Minimal-2D kodunun çoğunu da kullanabileceğimi fark ettim. Ben de BF'ye cevap vermek için uğraştım ve işte buradayız.
Ayrıntılara girmeden önce bir şey daha. Golf dışı nedenlerle yaptığım birkaç değişiklik vardı. İlk önce, @SnoringFrog kodunun büyük kısmını en üstteki birkaç satırdaki 2B dillerin hemen altına ekledim. Bana göre, mümkün olduğunda gelecekteki böcekleri önlemek için 2D-uçlarının poliglotun ortasından geçmesini önlemek uzun vadeli bir stratejik hamledir. Bu hamle için bayt vuruşu düşüktü, ben de bunun için gittim.
İkincisi, çeşitli yeniden faktörler sırasında, Begunges ve Minkolang'ın sayısal çıktılardan sonra bir boşluk bıraktığını ve bunun, bu diller için Test Sürücüsünde gördüğümüz boş baytların nedeni olduğunu öğrendim. Bunları, yığının değerini doğrudan değer yerine bir ascii kodu (izleyen boşluk özelliğini içermeyen) olarak çıkararak düzelttim. Bu değişiklik için de küçük bir bayt çarpması oldu, ancak şimdi Test Sürücüsünün çıktısı çok düzgün. Nasıl yapamazdım?
SM / BF
Hızlıca temelleri gözden geçirelim. Bunlar SMBF ve BF için geçerli olan tek komutlardır:
> Move the pointer to the right
< Move the pointer to the left
+ Increment the memory cell under the pointer
- Decrement the memory cell under the pointer
. Output the character signified by the cell at the pointer
, Input a character and store it in the cell at the pointer
[ Jump past the matching ] if the cell under the pointer is 0
] Jump back to the matching [ if the cell under the pointer is nonzero
Her iki dilde de değerlerin saklandığı ve değiştirildiği bir hafıza bandı vardır. SMBF'nin tek farkı, yürütülmekte olan kodun, başlangıç noktasının solundaki hafıza bandında da saklanmasıdır. @SnoringFrog'un işaret ettiği gibi, SMBF ve BF'yi almak farklı sonuçlar üretmek için bellek işaretçisini orijinin soluna getirme menteşelerini oluşturur. Tio'nun BF yorumlayıcısında, bellek işaretçisi orijinden sola hareket edebilir ve Polyglot'un SMBF'nin gördüğü ascii kodları yerine 0'ları bulur. İşte farkı örneklemek için hem SMBF'de hem de BF'de çalıştırılabilecek bir örnek.
Poliglotun başlangıcında, Befunges >
ikinci sırada tamamlama için koşmaya ve Perl6'nın her >
birinin bir tarafından önce gelmesini gerektirir <
. Böylece SM / BF <>
, bellek işaretçisini başlangıç noktasında bırakmak için başlar , ardından [
her iki dil için bazı rahatsız edici karakterleri ]
6. sırada atlar .
Sonra, her iki dil için orijin hafıza hücresini arttırır ve hafıza işaretçisini sola doğru hareket ettiririz +<
. (Konuşma sözleşmesi için, kaynak bellek hücresini 0 hücresi, kaynak 1, 2, ... sağındaki hücreler ve sola giden hücreler -1, -2,… olarak adlandırırız). Hücre -1, SMBF'deki poliglottaki son karakterin ASC kodunu ve BF'deki 0'ın kodunu içerir.[
ile karşılaşıldığında, ]
SMBF koda geçerken sadece BF bir sonrakine atlar .
SMBF [.>-]
ilerledikçe polyglot'un sonunda bulunan 6'yı yazdırır ve ardından hafıza işaretçisini 0 hücresine geri götürerek değerini sıfırlamak için geri döndürür.]
. İncelemek için, bu bira bardağındaki bantlar şunlardır: SMBF'nin negatif hücreleri poliglotu tutar ve 0 ve pozitif hücreler de sıfır tutar. BF'nin negatif ve pozitif hücreleri, orijin hücresi 1'i tutarken sıfırı tutar.
Daha sonra >
SMBF'yi hücre 1'e ve BF'yi hücre 0'a geri hareket ettirir ve BF'nin özel kod bloğuna girmesini sağlar: [<+++++[>++++++++++<-][<<<]>+.---.>]
(BF olmayan karakterleri bundan kaldırdım). Burada hücre -1'e geri dönüyoruz ve döngü kontrol değişkenimizi (hücre -1) 5 değerine sıfırlıyoruz. Sonra döngü 0'dan 10 ekleyeceğimiz döngüye gireriz ve döngüden çıkmadan önce hücre -1'i 5 kez azaltır 0 değerine sahip -1 hücresini işaret edeceğiz.
Sonra [<<<]
sıfıra işaret ederken karşılaşacağız , BF bundan geçemez. Burada amaç bir dizi dengelemek için ise >
'önceki ile s <
Perl6 dışarı hata değildir bu yüzden s'.
Bu noktada, hücre 0, 51 değerindedir. 4'ün ascii değeri 52'dir, bu yüzden işaretçiyi hücre 0 ekle 1'e hareket ettiririz, sonra değeri yazdırırız. Ve son olarak, hücre 0'ı tekrar ascii karakter 1'e geri indiririz ve bellek göstergesini hücre 1'e (0 değeri) geçmeden önce tekrar yazdırırız ]
.
SMBF ve BF, ikisi [
de 0 değerinde dururken, sonraki satırda 8 numaralı sonuncuya ulaşırlar . Böylece ikisi de kalan Minimal-2D kodunu geçerek ]
11. satırda karşılaşılana kadar atlar. Fakat bu kısa ömürlüdür, çünkü 12. satır başka bir karakterle başlar[
, her iki dili de başka talimatların alınmadığı polyglot'un neredeyse sonuna götürür.
Refactors
Minimal-2D
Minimal-2D'lerin yeniden yazılması, çoğunlukla byteları BF'nin çarpma numarasına benzer bir şekilde kurtarmaktı. Minimal-2D ise döngü kontrolü için [
ve ]
karakterlerine sahip değildir . Bunun yerine şu komutları vardır:
/ Skips next instruction if the data pointer is set to 0.
U Tells the program to switch to the up direction of processing instructions.
D Tells the program to switch to the down direction of processing instructions.
L Tells the program to switch to the left direction of processing instructions.
R Tells the program to switch to the right direction of processing instructions.
Bunlar, 2B malikanede de olsa BF'ninkiyle aynı mantık yapısını üretmek için kullanılabilir. Örneğin, BF en ++++++[>++++++<-]>.
eşdeğerdir bu Minimal-2D.
İşte kaldırıldı tüm yabancı kod ve değiştirilir bütün yer tutan karakterlerle polyglot Minimal-2D kodunun basitleştirilmiş versiyonudur #
.
###################D
###R+++++[D>+++++++L
###>
D>#U/-<+++L)
R+.----.R
D
Hat 1 'de talimat işaretçi indiren L
sola işaretçiyi gönderir dili içine hat 8'de. Burada döngü kontrol değişkenini (hücre 0) 7 olarak ayarlıyoruz, hafıza göstergesini hücre 1'e getirip bir döngü girin. Döngüde, hücre 1'e 3 ekleriz, hücre 0'ı azaltır, sonra hücre 0'ın değerinin sıfır olup olmadığını kontrol ederiz. Olmazsa, hücre 1'e bir 8 daha ekleriz, sonra azalır ve tekrar kontrol ederiz. Bu döngünün sonucu hücre 1'in değeri döngünün sonunda (6 * 8 + 3) 51'e ayarlanır.
Dönüşten çıkıp, U
hafıza göstergesini hücre 1'e hareket ettirip aşağı inip polyglot'un 11. Ve son olarak, 4 için ascii değerine yükseliyoruz, ardından programı sonlandırma hakkına gitmeden önce ascii değerine 0 düşüyoruz.
Retina
Retina'nın tüm BF türevleri için çalışması zor olan birçok gereksinimi vardı. Ardışık +
'lar veya uyuşmayan ()
veya []
. Ancak bunlar gerçekten sadece diğer her satır için bir gerekliliktir, bu nedenle BF, SMBF ve Minimal-2D için yapılan çalışmaların çoğu, kodun büyük kısmını numaralı satırlara koymak için döndüler.
Sadece |
Retina'ya adanan bir bayt , satır 11'in sonundadır. @ Ais523 alıntı yapmak “| herşeyle eşleşecek ”. Bu olmadan, Retina 0 döndürür. Neden bu onu düzeltir, bilmiyorum. Uzun zamandır uzak durduğum için Retina'ya fazla kazmam gerekmedi. Ancak Prelude gibi, onu nasıl hata ayıklayacağımı bilmem gerektiği kadar anlamamama gerek olmadığını, bu durumda çoğunlukla çizgiyi bulana kadar (2'nin katlarında) satırları silmekten ibaretti. Bu kırılmasına neden oluyor. @ Ais523 adlı kullanıcının yorumuna dayanarak bu düzeltmeyi tahmin ettim ve ödüllendirildi. Sanırım okul için fazla havalıyım.
kardinal
@ SnoringFrog'un Kardinal koduna göre Minimal-2D yerleşimini beğendim. Kardinal'in Retina'yı üzmediğini ve Minimal-2D ile iç içe geçmesine izin veriyor gibi göründüğü için iyi bir konum. Bu yüzden Minimal-2D'yi 2B ülkeye kadar nakletmeye başladığımda, yolculuk için Kardinal'i getirdim. Yine de, Kardinal’de birkaç kozmetik değişiklik yapıldı. Birincisi, Minimal-2D için döngüsünün içindeki bellek işaretleyicilerini değiştirmek için >
verdiği ifadenin başlangıcına yaklaştım #p x%>~~~+ +~*ttt*.x
/ İkincisi, Minimal-2D odasını döngüden zarif bir şekilde çıkarmak için her şeyi bir karakter sağa kaydırdım. p
Bu operasyonda bu karakter dolgu içindir.
Befunge / 98
Befung'lar aslında polglottan aşağı golf oynamaya başladığım yerdi, çünkü C ++ refactor bunun dışında tüm diğer 2B kod kodunu değiştirdi. WTF'nin bu kodda olduğunu öğrenmeye çalışırken bunu Begunge belgelerinde buldum:
.
Komut istifi ve bir ondalık sayı olarak çıkış kapalı bir değer, açılır ve ardından bir boşluk biraz Forth gibi. ,
bir değer atar, bir karakterin ASCII değeri olarak yorumlar ve bu karakteri ( boşluk bırakmaz ) çıkarır.
Kutsal moley! Çıktıdaki boş baytları temizleyebiliriz. Bundan sonra, sadece daha büyük asci değerlerinin nasıl girileceğini bulmak ve kodu ayırmak meselesiydi. Befunge-98'in içeri atlamasını ;
söyleyen bir atlama kodu vardı [77*,68*,@
.;[77*,68*,@;'1,'1,q
bize ayırım verdi.
Befunge-98 ayrıca bir '
sonraki karakterin ascii kodunu almak için bir komut ( ) kullandı. Böylece, '1,
karakter için asci kodunu alır, 1
istifin üzerine koyar ve sonra ascii karakterini istifin üzerindeki en yüksek değer için yazdırır ,
. Bunu 11 kez yazdırmak için iki kez yapıp q
, incelikle çıkmak için bir bırakmalısın.
Befunge uygun biraz daha az uygun, ama sadece sadece. Burada istenen kodu yığına koymak için bir hesaplama yapmak zorundayız. Neyse ki, kodlarımız aynı çıkış komutundan önce 7 * 7 ve 6 * 8 ile kolayca çarpıldı ,
. Sonra @
, abisinin kodu çıktıyı kirletmeden önce Befunge'den ayrıldık .
Minkolang
Befunge'nin sondaki boşlukları için bir düzeltme bulduktan sonra, bir Minkolang düzeltmesi bulma fikrine çok üzüldüm ve Minkolang'ın belgeleri bu noktaya kadar kullanılan çıktı komutunun Befunge Tercümanı ile aynı şekilde çalıştığını söyledi. O
başka bir çıkış komutu olarak belgelendi, bu Begunge'nin paylaşılması olarak tanımlanmadı, bu yüzden karanlıkta bir çekim yaptım ve dizgeyi çıkarmayı denedim "3"
. Kusursuz zafer.
> <>
Minimal-2D kodunu taşırken ilk baktığım şeylerden biri de onun yanında> <> hareket edebileceğimi doğrulamaktı. Eğer 2B poliglot enlemeciliği ile uğraşacak olsaydım, bütün geçişlerle ilgilenecektim. Temel olarak şans ;n4
, satır 1'in sonuna koyup çözüme yolumu kapattım ve satır 1'e \D
daha da geri döndüm. BTW, cevaplar 40'tan önce çok iyi bir şekilde içerildiğinden beri,>>> aşağı doğru yönlendirilebileceğini bilmiyordum. . Bunun daha sonra benzer bir dilden> <> ayrılmak için kullanılabileceğini düşünmek isterim.
Perl6
<>
Bu cevabın başka yerlerinde Perl6'nın bazı dengeleme sorunlarından bahsettim , bu yüzden bir daha asla geçmeyeceğim. Fakat #>27.say#
ikinci hatta son satıra geçtiğimi belirtmek istiyorum . Bu cevapta bunun işlevsel bir amacı yoktur. Aslında bu hareketi, bu turu kullanmamaya başladığım farklı bir cevabı karşılamak için yaptım. Bir sonraki fırsatımda bu cevabı göndermeyi planladığımdan beri bırakmaya karar verdim ve geri almaktan ve tekrar yapmaktan rahatsız olmak istemedim.
Hata düzeltmeleri
05as1e
05as1e kesinlikle yeni sürümdeki Begunge kodunu beğenmedi. Sanırım ,
tek devrimci karakter bu olduğundan beri s. Her durumda, "
saldırgan komutları gizlemek için ikinci hatta geri "
gitmek zorunda kaldım "
ve her iki dilde de evet-op olduğundan beri Befunge kod yolundan önce gitmesi gerektiğini biliyordum . (Evet-op hakkı gibi terimler yapabilir miyim?) Satır 2'nin 2- <
boyutluluk oldukça katı, ancak Begunge'nin kod yolundan önceki ile yerini değiştirebildim "
. <
Ancak Perl6 bir gereğidir oldu. (Daha <
önce hepsine sahip olmalı >
.) <
Satır içini içgüdüler tarafından bölünmüş bir yere düşürdüm ve 05ab1e ve Perl6'nın anlaşmazlığının çözülmesini öngördü.
koşuşturma
2. satırdaki Befunge değişiklikleri 1
, Incident / Whirl satırından önce polyglot'a fazladan eklendi . Bu ekstra 1
, Whirl'in tekerlek üzerindeki yanlış talimatları göstermeye başlamasına neden oldu. İlk 1
C / C ++ 'ın yönergesidir kodu sadece bir satır sayısının referans, ve bu gibi kolayca başka bir satır sayısı olabilir, bu yüzden keyfi bu değişiklik 4
Whirl karşılamak için.
olay
Poliglot'un sonundaki detokenize edici dize bu noktada iyi bilinmektedir, bu yüzden ona girmeyeceğim. Yapabileceğim şeyi dizgiden çıkardım ve gereken yeni belirteçleri ekledim. İşaret etmem gereken bu dizgede olmayan 2 detokenize edici karakter var. Birincisi, ikinci R
yılında #R+.----.R >]|
bir Füzyon başlangıç noktası olduğu için burada ihtiyacı vardı ve zaten aynı yönde bir Füzyon başlangıç noktası başlığı olmadığı için bu hat üzerinde daha güvenli oldu. İkinci olarak, x
içinde #= x
bir yer bir belirteç kaldırmaktır ␉␊#
daha yaygın hale gelmiştir desen.
Diğerleri
Hexagony, Whitespace ve Prelude hepsinde olağan küçük ayarlamalar vardı, fakat konuşmaya değecek özel bir şey yoktu.
Son düşünceler
Bu cevap için elimde sadece bu var. Bir sonraki cevapta başlangıç noktası arayanlar için kötülüğü öneriyorum. İşe yarayacak gibi görünmeme rağmen uygulanabilir görünüyor, ancak entegrasyonu zor olmayacağından şüpheliyim. Poliglotun büyük bir kısmını atlayarak atlaması gereken bir atlama komutu olduğunu biliyorum. İyi şanslar.