Metaquine yazın


19

Metaquine, bir quine olmayan, ancak çıktısı aynı dilde bir program olarak çalıştırıldığında bir quine olan bir programdır.

Bu zorluğun amacı bir metakin yazmaktır. Bu , bu yüzden en kısa kod kazanır, en erken cevap tiebreaker olarak kullanılır. Bir kinin tanımı nedeniyle sadece tam programların kabul edilebilir olduğunu unutmayın.

Quines Kuralları

Sadece gerçek ayinler kabul edilir. Olduğuna göre,, STDOUT kelimesi kelimesine tüm kaynak kodunu yazdırmak gerekiyor olmadan :

  • doğrudan veya dolaylı olarak kaynak kodunuzu okuma.
  • beslediğiniz her ifadeyi yalnızca değerlendiren ve basan bir REPL ortamına güvenmek.
  • sadece belirli durumlarda kaynağı yazdıran dil özelliklerine güvenmek.
  • tüm veya bir kısmını yazmak için hata mesajları veya STDERR kullanarak. (STDOUT geçerli bir quine olduğu ve hata mesajları bunun bir parçası olmadığı sürece STDERR'a bir şeyler yazabilir veya uyarı / ölümcül olmayan hatalar üretebilirsiniz.)
  • kaynak kodu yalnızca değişmez değerlerden (dize değişmez değerleri, sayısal değişmez değerler vb.) ve / veya NOP'lardan oluşur.

Bastırmanın geçerliliği uğruna, bastırılamayan çıktılar (telif hakkı bildirimleri, başlatma / kapatma mesajları veya izleyen satır beslemesi gibi) çıktıda yok sayılabilir.

Misal

Salt okunur programları ve yerleşik sorgulamayı yasaklayan kuralı görmezden gelmek, bu Ciddi bir şekilde bir metakin olacaktır:

"Q"

Program "Q", örtük olarak çıktıda yazdırılan tek dize değişmezinden oluşur . Output ( Q) çalıştırıldığında, bir quine ( Qyerleşik quine fonksiyonudur).


2
Değişmez değerler / yorumlar / NOP'lar kuralı metakotun çıktısı (yani gerçek quine) için de geçerli mi? Aksi takdirde, ör. T1 baytlık kolay bir Pyth cevabıdır.
Kapı tokmağı

@Doorknob Evet, açıklığa kavuşacağım.
Mego

8
Bu zorluğun zor noktasının nerede olduğunu gerçekten görmüyorum. Strateji "bilinen en kısa kınayı içeren dizgeyi yazdır" ın her dil için kazanacağı garanti edilmez mi?
Şubat'ta

1
@Fatalize Sanırım ilginç soru, bu kinin kendisiyle aynı miktarda veya daha az baytta yapılabilir mi?
Martin Ender

3
@Fatalize Uzun ama geçerli bir quine basan kısa bir metaquine yazmanız da mümkün değil mi?
Rhyzomatic

Yanıtlar:


15

CJam, 6 bayt

"_p"_p

Baskılar

"_p"
_p

hangi CJam en kısa uygun kine olduğunu.

Burada test edin.

açıklama

Her iki program da aynı şekilde çalışır, çünkü uygun kinin içindeki satır besleme bir işlem yapılmaz ve yalnızca çıktıdan çıkarılması daha pahalı olduğu için dahil edilir. Programlar nasıl çalışır:

"_p"  e# Push this string.
_     e# Duplicate it.
p     e# Print a string representation of the top of the stack (i.e. the string with
      e# quotes) followed by a linefeed.
      e# The other copy is then printed automatically at the end of the program, without
      e# stringifying it.

Kenar notu

GolfScript'te olduğu gibi

".p".p

hangi baskılar

".p"
.p

takip eden bir satır besleme ile, ki bu da bilinen en kısa tırnaklardan biridir.


10

Pyth, 12 11 10 9 bayt

@ Pietu1998 sayesinde bir bayt daha devirdi.

jN B".[9N

Bu yazdırır

.[9N".[9N

Bu Pyth bir ayin olduğunu. Burada deneyebilirsiniz .


Çıktı en kısa Pyth quine için yeni bir rekor mu? Daha önce hiç görmediğime inanmıyorum.
ETHproductions

Başka bir yerde bulamadım. Bir metaquine almaya çalışırken geldim.
Rhyzomatic

1
Belki de orijinal
quine

2
Sen kullanarak 9'a bu hakkı elde edebilir jN B".[9Nya .[9N"jN B. ( jN B"jN B9'da bir başka gerçek kine: bifürkate kimlik fonksiyonu ve katılmak ".)
PurkkaKoodari

@ Pietu1998 Teşekkürler! 9'a ulaşmanın bir yolu olması gerektiğini biliyordum. Pyth'te 9 bayttan daha kısa ayinler var mı?
Rhyzomatic



4

Python 2, 29 bayt

_="_=%r;print _%%_";print _%_

İyi bilinen kısa python quine kolayca metaquine dönüştürülür :)

Ve, sondaki yeni satırın eşleşmesi konusunda endişelenmemiz gerekmediğinden, metakin aslında daha kısadır!


beni yine dövdü :( Bir sarıcı düşündüm, ama seninki daha iyi
Outgolfer Erik

3

Japt, 15 13 bayt

Q+"+Q ³s7J" ²

Çevrimiçi test edin!

Bu program çıktılar

"+Q ³s7J"+Q ³s7J

hangi Japt bilinen en kısa kın olduğunu.

Nasıl çalışır

Q+"..." // Take a quotation mark plus this string.  "+Q ³s7J
²       // Repeat it twice.                         "+Q ³s7J"+Q ³s7J
        // Implicit output

Rakip olmayan sürüm, 11 bayt

Q+"+Q ²é" ²

Az önce ekledimé , bir "döndür" komutu. Yani

"+Q ²é"+Q ²é

artık geçerli bir soru.


1

Yakut, 25 23

puts"puts <<2*2,2
"*2,2

Klasik Ruby HEREdoc sorgusunu üretir

puts <<2*2,2
puts <<2*2,2
2

Eski çözüm

_='_=%p;$><<_%%_';$><<_%_

Çift tırnak işareti ile değiştirilen tek tırnak işaretleri dışında kendini üretir.



1

Balık (> <>), 17 bayt

Bu klasik balık quine kullanarak çalışır, "r00g!;oooooooo|ancak {orijinal program bir quine değil, ancak çalıştırıldığında çıktı, tüm yığını sola kaydırır ekler .

"{r00g!;oooooooo|

Çıktılar:

"r00g!;oooooooo|

hangi balık quine olduğunu!


1

Jöle , 3 bayt (rakip olmayan)

Ne yazık ki, gerekli atomlar mücadeleden yaklaşık 2 hafta daha gençtir.

Metaquine

”Ṙv

Çevrimiçi deneyin!

Nasıl çalışır

”Ṙv  Main link. No arguments.

”Ṙ   Set the left argument and the return value to the character 'Ṙ'.
  v  Dyadic eval; evaluate the return value with the left argument as argument.
     Executing the atom Ṙ on the argument 'Ṙ' prints a string representation of
     the character, i.e., the string "”Ṙ".
     Finally, v returns its unaltered argument, which is printed implicitly.

Quine

”ṘṘ

Çevrimiçi deneyin!

Nasıl çalışır

”ṘṘ  Main link. No arguments.

”Ṙ   Set the left argument and the return value to the character 'Ṙ'.
  Ṙ  Print a string representation of the character, i.e., the string "”Ṙ".
     (implicit) Print the unaltered return value.

İkincisi ilk iki karakteri ( ”Ṙ) yazdırdığından, tanımımıza göre uygun bir alıntıdır.


1

Octopen-Baru, 22 bayt

** Rakip olmayan cevap

愛[35211].pack歩U')

Ruby çıktı

puts [35211].pack(' U')

Hangi çıktılar . Hangi Octopen-Baru bir ayin olduğunu!


1

7 , 2 bayt, dil postdates meydan okuma

Program iki bayt uzunluğundadır ve çeşitli şekillerde yorumlanabilir; altıgen dökümü olarak:

00000000: 4ff4                                     O.

kod sayfası 437 olarak:

O⌠

veya en okunabilir şekilde sekizlik (7 doğal olarak kullanır) olarak:

237723

Çevrimiçi deneyin!

Bunun çalışmaları çok basittir: farklı kılmak için iki yarım arasına op-olmayan yığın elemanı yerleştirilmiş standart 7 kuin (bu bağlamda 7yığın elemanlarını ayırır). (Ben de başlangıçta 723723ekleyebilirdim. Sonunda yorumlayamazdım çünkü sondaki 7'ler boşluk gibi gibidir ve paketlenmiş kodlamada yok sayılır, bu nedenle çıktı programından farklı olmazdı. )

Bu arada, bu program onaltılık bir , ancak çoğunlukla sadece tesadüf.


1

Düşük yük, 11 bayt

(:aSS)::aSS

Gayet basit. (:aSS):aSSStandart Underload quine olan çıktıyı yazdırır .


1

Brachylog , 12 bayt

"~k;?w₁"gjw₃

Çevrimiçi deneyin!

132 aynı uzunlukta metaquine varyasyonlarının bir I tercüme Quine'ın gelen Fatalize en Brachylog v1 (non-hile) Quine'ın. Aslında hepsini yazdırmak için (golf olmayan ve genel aptal) bir program yazdım:

{[[";?","gj","jḍ"],"₁₃₅₇"]j∋ᵐ{ḍ≠&};"\"~~k~ww~w\"~ww~w~n"}ᶠ{lw" metaquines generated:
"ẉ&}w₁ᵐ

Çevrimiçi deneyin!

: Tutarsızdır değiştirilmesi mümkündür orijinal Quine'ın iki bölümü vardır ;?can değiştirilebilir gjveya jḍve değiştirilebilir , ya da . Bunları dize değişmezinin dışında bir şekilde ve dize değişmezinin içinde farklı bir şekilde tutarsak veya değiştirirsek, çıkış kaynakla eşleşmez, çünkü dize değişmezinde hangi varyantlar hem içeride hem de dışarıda yazdırılır , ilk program çalıştırma olmayan bir quine ile sonuçlanır.

;?,, gjve jḍdeğiştirilebilir çünkü üçü de dize değişmezini kendisiyle eşleştirir: programın düzeni nedeniyle, giriş değişkeni ?dize ile birleştirilir, bu nedenle ;?dizeyi kendisiyle eşleştirir; mizanpajdan bağımsız olarak, gjdizeyi daha sonra kendine birleştirilen bir listeye sarar; aynı şekilde jḍdizeyi kendisine birleştirir ve sonra ikiye böler.

Tek numaralı waboneler birbirinin yerine kullanılabilir, çünkü başlangıçta wyalnızca 0 veya 1 alabiliyor olsa da, 0 girişe wbaskı ve 1 ikinciyle biçimlendirilmiş ilk öğeyi yazdırmakla birlikte, için envanter envanteri wharici olarak bir bit alanı olarak çalışan bir şeye dönüşmüştür: alt betiğin düşük biti doğrudan veya biçimlendirilmiş olup olmadığını kodlar, orta bit isewsınırlandırılmaz veya girişe ayarlanır ve yüksek bit, baskının hemen yapılıp yapılmayacağını veya programın sonuna kadar gecikmeli olup olmadığını kodlar, böylece geri izlemeye tabi tutulabilir. (Bu abonelikler Brachylog'a yaptığım ilk ve en büyük katkımdı.) Quine ve metaquine çıktı değişkenini kullanmadığından ve backtrack kullanmadığından, dört tek aboneliğin hepsi eşdeğerdir.


0

Befunge-93, 22 bayt

"+1_@#`+39:,g0:">:#,_@

Sadece standart quine aldım, tırnak içine aldım, ters çevirdim (böylece yığına doğru şekilde yüklendi) ve sonunda bir yığın baskısı ekledim.

Normal karaktere 8 karakter eklenmiştir, bu yüzden daha iyi bir çözüm olması mümkündür.


Sadece standart alıntıyı alıp yeni satır ekleyemez misiniz? Yeni satır ayrıştırma aşamasında kaybolacak ve sizi yalnızca standart satır (kendi kendine yazdıracak) bırakacaktır.

0

Turtlèd , 52 bayt ( rakipsiz )

Orijinal alıntıdan 1 daha az

@##'@r,r,r-{ +.r_}r{ +.r_}"#'@r,r,r-{ +.r_}r{ +.r_}"

Aynı şekilde çalışır, ancak sonunda bir karakter içermemesi dışında, çalıştırıldığında, sonunda bir karakter içermez, çıktıyı etkilemez, çünkü # üzerine # yazıyor. Çıktı Ben quine meydan okuma için yaptık Quine'ın biraz farklı olmakla birlikte, aynı şekilde çalışır Not: "# yazıyor, yaptığım Quine'ın gibi kendi son karakteri olan. Açıklamayı orada göz atın .


0

Lua, 45 bayt

Quine kodu benim değil.

s="s=%qprint(s:format(s))"print(s:format(s));

sonuçlanacak

s="s=%qprint(s:format(s))"print(s:format(s))

ki bu bir kine. Sevindim ;olan isteğe bağlı Lua.


0

Pushy , 7 bayt

Dil meydan okudukça rekabet etmediği için.

Bu standart kine, ancak yeni satırlar kaldırıldı. Yeni satırlar Pushy'de hiçbir şey ifade etmez, ancak baskı operatörünün standart ayırıcısıdır ve bu nedenle gerçek bir quine için gereklidir.

95 34_"

Çevrimiçi deneyin! Bu çıktılar:

95 34
_"

Hangisi en kısa Pushy quine - nasıl çalıştığına dair bir açıklama burada bulunabilir .

Alternatif olarak, H5-34_"aynı bayt sayısı için çalışır.


0

Köpük , 14 bayt

[. .'|: ~|]: ~

Bu, burada bulunabilen ikinci Köpük ayracı yazdırır . Bu aslında daha kısadır, çünkü .her eleman arasında her zaman bir boşluk bırakacaktır, ancak üçüncü jetondaki çubuk, kendisinden önceki alanı atlamama izin verir.


Yeni diller site politikasına göre otomatik olarak rekabet etmediği için rakip olmayan biti kaldırdım.
Mego

0

Kabuk , 6 bayt

D"S+s¨

Çevrimiçi deneyin!

Standart Kabuk kopyasını yazdırır S+s"S+s".

 "S+s¨    The string S+s"
D         concatenated with itself.

Ayın açıklaması:

   "S+s"    The string S+s
 +          concatenated with
S           itself passed through
  s         the function which returns its string representation.
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.