Polyglot Parçalarını Yazdır


22

Tipik olarak, poligonlar, her dilin diğer diller için mevcut olan kod bölümlerini görmezden gelecek şekilde, dize değişmezlerine sarılarak, yorum sözdizimini veya benzer püf noktaları kullanarak görmezden gelebilecek şekilde oluşturulur.

Amacınız, her dilin çıktısının o çıktıyı üreten polyglot'taki kod olduğu bir polyglot yazmak. Spesifik olarak, çıktı sadece silme işlemiyle polyglot kodundan yapılmalı ve verilen dilde bir satır olmalıdır.

kurallar

  • Yalnızca uygun sorgulara izin verilir (kaynak kodunu okumak, giriş yapmak, giriş yapmak, STDOUT bir seçenek değilse, çıkış STDOUT'a veya en yakın alternatif olmalıdır ve programlar yalnızca basılı olarak yazılmış sözcüklerden daha fazlasını içermelidir).
  • Farklı diller farklı kodlamalar kullanabildiğinden, ham bayt burada önemli olan şeydir. (Heks) kodu Örneğin, dil bir UTF-8 kullanır ve B dili cp437 kullanıyorsa C3 88 46 47olacaktır ÈFGdil A ve ├êFGdil B.
  • Tüm çıktılar farklı olmalıdır (yine ham baytları karşılaştırarak). Bu, küçük dil sürümlerini kısıtlamaya çalışmakla ilgili komplikasyonlardan kaçınır - iki dil aynı şeyi yapmak için kodun aynı bölümünü kullanıyorsa, ikisini de talep edemezsiniz.
    • Eğer iki dilde A ve B varsa XY, her ikisinde de geçerli bir çıktı, ancak YZB'de de geçerliyse, XYA YZiçin çıktı olarak ve B için çıktı olarak seçebilirsiniz , böylece her ikisini de puanınızdan talep edebilirsiniz ( ancak XYyukarıdaki kural nedeniyle her iki dilde de hak iddia edemezsiniz ).
  • Tüm çıkışlar mümkün olduğu kadar kısa olmalıdır. Örneğin, kodunuz print('foo')#somethingPython 3 için ise (çıktının doğru olmadığı gerçeğini göz ardı ederek), çıkmanız gereken kod olacaktır print('foo')ve print('foo')#buna izin verilmezdi. Doğru çıktı üreten eşit (en az) uzunlukta birden çok dize varsa, bunlardan herhangi birini seçebilirsiniz.
  • Gönderiler en az 2 dilde çokgen olmalıdır.
  • Puanınız tarafından verilecek (number of programming languages with distinct outputs)**3/(total byte size of polyglot). En yüksek puan kazanır. İki gönderimin aynı puana ulaşması durumunda, ilk önce o puana ulaşan gönderim kazanacaktır.

2
En son ikinci kural, sonuçta ortaya çıkan herhangi bir diğer silme dizisi ile daha fazla golf oynamanın mümkün olmadığını kanıtlamamız gerektiği gibi geliyor. Bu kasıtlı mı?
Martin Ender


Komutları 8 bit olmayan bir dilde "silme" yi nasıl tanımlarsınız? Kaynaktan her seferinde bir komut mu, yoksa her defasında bir bayt mı siliyorsunuz?

@MartinEnder İyi niyet kabul edilebilir. Birisi poliglottan oluşabilecek daha kısa bir kın bulamazsa, cevabın geçerli olduğuna güvenilir.
Mego,

@ ais523 Her şey bayt düzeyinde yapılır.
Mego,

Yanıtlar:


11

GolfScript + CJam + Fission 2 + Jelly , 4 dil, 24 bayt, puan 2.667

Onaltılık dökümü ile başlayalım:

00000000:  3322 3024 700a 2721 2b4f 5222 0a3c 3024 700a 6523 7fff cccc

GolfScript, CJam ve Fission 2 için bunu ISO 8859-1 gibi bazı ASCII uyumlu tek bayt kodlamalarda yorumluyoruz (tam kodlama gerçekten önemli değil çünkü diller sadece ASCII karakterleri için operatörleri tanımlamaktadır):

3"0$p
'!+OR"
<0$p
e#<DEL>ÿÌÌ

<DEL>Kontrol karakteri nerede 0x7f.

Jelly’de, bunun Jelly’in kendi kod sayfasında olduğu varsayılır, bunun yerine şöyle görünür:

3"0$p½'!+OR"½<0$p½e#¶”ṘṘ

GolfScript

eSon satırında bilinmeyen bir değişken ve olduğu #, hattın geri kalan dışarı yorumlarınızı bu baskılar öylesine

"0$p"
0$p

ile bir arka satır besleme. Bu standart quine'nin GolfScript / CJam polyglot versiyonu:

".p"
.p

Polyglot'ı dene. | Quine dene.

CJam

İşte, e#son satırı yorumlar, bu yüzden neredeyse aynı, bu yazdırır

"0$p"
0$p

takip eden bir satır beslemesi olmadan .

Polyglot'ı deneyin | Quine dene.

fizyon

Bölünme sadece ikinci çizgiyi görüyor ise , standart Fizyon quine o baskılar öylesine

'!+OR"

Polyglot için çevrimiçi bir bağlantı sağlayamıyorum, çünkü TIO dosyayı Fission'a UTF-8 olarak gönderiyor, ancak Fission kaynak bayt byte'ı okuyor, bu da son satırı çok uzun yapıyor. Bununla birlikte, bunu yerel olarak ISO 8859-1 kodlu bir dosyayla test ettim (son satırın ikincisi ile aynı uzunluktadır).

Quine dene.

Jöle

Pilcrow, Jelly'deki satır beslemeleri için bir takma addır, bu nedenle kaynak şuna eşittir:

3"0$p½'!+OR"½<0$p½e#
”ṘṘ

Bir Jelly programının son satırı dışındakilerin tümü, sözdizimsel olarak geçerli olmaları şartıyla, çağrılmadıkça yok sayılabilecek "yardımcı bağlantılar" dır (işlevler). Bu aslında 3CJam ve GolfScript programlarında ilk gelmenin sebebidir, çünkü aksi takdirde Jelly'de "ayrıştırılamaz.

Aksi halde, işlev çağrılmadığından, program yalnızca standart Jelly keki olan ikinci satırına eşdeğerdir.

Polyglot'ı dene. | Quine dene.


9

> <> + Python, 2 dil, 51 46 bayt, puan ~ = 0,16 0,17

Henüz bir cevap olmadığı için basit bir cevapla başlayacağım

#.09;!?lo}*2+2f"
_='_=%r;print _%%_';print _%_

> <> Ve Python için deneyin

> <> İçin ilk satır bir satırdır (# yansıtır, "bütün satırı yığına koyar, sonra 34'e basarız (charcode") ve her şeyi basarız), yürütme asla ondan hareket etmez, bu nedenle geri kalanını etkin bir şekilde yok sayar. kod.

Python için ilk satır bir yorumdur, ikincisi bir quinedir (python'da standart yaklaşım, her iki argümanla aynı dizeyle dize değiştirme kullanılarak).


1
> <> Cevabına hafif bir adaptasyon bazı baytları kurtarabilir: - # "~ r10gol?!; 60. |!
Pelikan Teal

@Tealpelican Bana kullanımını hatırlattığın için teşekkür ederim .! Ben (bu bayt kaydeder beri) tersten dize tutmak ve kullanmaktan kaçınmak için tercih olsa da, bu yaklaşımı kullanarak Quine adapte g(o "kaynak kodu okumak" olarak yorumlanabilecek beri)
Leo

Bu g kullanmamak için oldukça adil bir nokta. Bir göz atıp biraz düşününce, "like; # .09;!? Lo} -1"
Teal pelikan

7

JavaScript + Python 2 + Japt, 3 dil, 132 bayt, puan ~ = 0,205

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"""
console.log(S,uneval(S))//""";print S%S

Bu yazdırır

S="S=%s;console.log(S,uneval(S))";console.log(S,uneval(S))

JavaScript’te (yalnızca Firefox’ta),

S='S=%r;print S%%S';print S%S

Python 2’de ve

`i96d)p2`i96d)p2

Japt'ta. ( Çevrimiçi test edin! )

JavaScript

JavaScript’in gördüğü bu:

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A
console.log(S,uneval(S))

İlk satır no-op'tur çünkü Ahiçbir şekilde kullanılmaz. İkinci satır S, dizeye ayarlanır S=%s;console.log(S,uneval(S))ve üçüncü ifadesi (yalnızca tırnaklara sarılı) ifadesinin ed gösterimi %sile değiştirildikten sonra yazdırır . Sonuç, JavaScript'teki bir sonuçtur.unevalSS

piton

Bu temelde Python'un gördüğü şey:

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S"
print S%S

İlk satır hemen hemen bir op-op; tek önemli kısım A=1sonunda. Bu, Abir sayıya dönüşür , böylece A//2ikinci satırdaki tamsayı bölümü bir hata atmaz.

İkinci satır, genellikle Sdizeye ayarlanması dışında aynı şekildedir S=%r;print S%%S. Üçüncü satır , ham gösterimi ile Sdeğiştirildikten sonra yazdırılır (sadece tek tırnak içine alınmış). Sonuç Python 2'de bir kuyruktur.%rSS

Japt

Bu, Japt tercümanının gördüğü JavaScript kodudur:

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"","\nconsole.log(S,uneval(S))//","";.p("r".i("n".t(),S%S))

Gördüğünüz gibi, çoğunlukla tek bir ana istisna dışında, JavaScript cevapları ile aynı: Son iki satır birleştirildi. Sonuç olarak, tercümanın gerçekte gördüğü budur:

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A

İlk satır AJapt quine'e, ikincisi SJS quine'nin bir kısmına ayarlar . Ancak Japt’te, yalnızca son ifade çıktıya gönderilir; bu A, yani çıktı `i96d)p2`i96d)p2.


Nedir uneval? Benim için işe yaramıyor
Cyoce


3

Jolf +> <>, puan = 2 ** 3/15 = 0.533 ....

"r0:g>o<
"Q«Q«

Buna başka bir dil eklemeye çalışmak.


2

> <>, Python 2 ve 3, 3 dil, 107 bayt, puan = 27/107 ~ = 0.252

#o<}-1:"
a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

Çevrimiçi deneyin: Python 2 , Python 3 , > <>

Python 3 çıktısı tam olarak ikinci satırdır ve Python 2 çıktısı bu sıradır . > <> Çıkışı ilk satırdır.

açıklama

Bu program klasik Python 2 quine programına dayanmaktadır:

_='_=%r;print _%%_';print _%_

İlk olarak, hem Python 2 hem de Python 3 ile uyumlu hale getirmek için, printifadeyi bir işlev çağrısına değiştirdim ve sonradan işe yarayacak fazladan bir boşluk ekledi:

_='_=%r;print (_%%_)';print (_%_)

Bundan sonra da, Python'dan Python 2 ayırt etmek için bir yol gerekli 3. En basit yöntemlerden biri aslında yararlanmak için /; Böylece Python 3'te aşağıdaki kod değerlendirir Python 2 bölünme tamsayıdır, ancak şamandıra bölümü TruePython 2, ancak FalsePython 3'te:

1/1is 1

Çıktıların iki dil arasında farklı olmasını sağlamak için, çağrıdaki ilk ve son parantezleri seçmeli olarak kaldırmam gerekiyordu print(bu yüzden daha önce boşluğa ihtiyacım vardı - boşluk olmadan printPython 2'de geçerli bir ifade olmazdı ) . Bu yüzden, böyle koşum kayışını şu şekilde değiştirmem gerekiyordu:

a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

Bu ekspresyon a:-a|9sonucunu 0:9Python 2 ve 1:-1Python 3'te Böylece bolan "(_%(_,b))"Python 3'te, ancak Python 2 ilk ve son karakter bırakarak atılır _%(_,b). Ve bu değişiklikle, polyglot bu zorluk için geçerliydi.

Teal pelikan tarafından önerildiği gibi,> <> quine Python'da tek satırlı bir yorum başlatan #o<}-1:"gerçeği sayesinde oldukça kolay bir şekilde eklenebilir #. Basitçe hazırlamak ve yeni bir satır başka bir dil ekler ve puanı yaklaşık on kat artırır.


1

Python 2 + Retina, 2 dil, 55 bayt, puan = 2 ^ 3/55 ≈ 0.145

Kullandığım $nyerine ikisini de geçerli ASCII tutmak.

S='S=%r;print S%%S';print S%S#|
#$n\(*S1`$n\(*S1`
#\`#

Python , Retina

Python:

S='S=%r;print S%%S';print S%S

Retina:


\(*S1`
\(*S1`

0

> <> + Pyke + Python 2, 81 bayt, puan = 3 ** 3/81 ~ 0,333

"""r00gol?!;60.
a=%r;print a%%a"""#);"34.Cp\D\Es"DEp00/
a=__doc__[-15:]
print a%a

Tüm dillerle farklı bir şeyler yapmaya çalıştım.

> <> görür:

"""r00gol?!;60.

Bu, başında üçlü alıntı dizge kullanmak için standart> <> kininin hafif bir modifikasyonudur. Bu, Python için biten üçlü tırnakların farklı bir satırda olmasını sağlar.

Çevrimiçi deneyin!

Pyke görüyor:

"34.Cp\D\Es"DEp00/

Daha önce Pyke'da bir yavru yaratmamıştım ve bir tanesini düşünmek zorunda kaldım. Bir dize oluşturmak için geleneksel kaplama tekniklerini kullandım ve daha sonra bir girdi olarak değerlendirdim. Bunun görsel etki olmadan çalışması için, uyarıların devre dışı bırakılması gerekeceğini unutmayın. Üretim adımında 0'a bölünme ile birlikte hatalar.

Burada dene! Ya da sadece bir kısmı.

Python görüyor:

Hepsi bu. Python, kodunu üretmek için tüm kodu kullanır. Dokuzuncu kısımdaki doksan kısımları gömmeye karar verdim (sonuçta çıkarılması baytları kurtarıyor olsa da havalı olduğunu düşünüyorum). Standart kaplama tekniğinin bir modifikasyonudur.

Çevrimiçi deneyin!

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.