Quat. Quine + Cat


22

Bir Quat bir birleşimidir ve popüler esolang kedi programı.

Meydan okuma

Zor olan standart bir kedi programı yazmaktır. Kullanıcı girişi ne olursa olsun, program girişi stdout'a ekleyecektir.
Bununla birlikte, girişin uzunluğu 0'dan ve 4'ün katı ise, program kendi kaynak kodunu vermelidir. Quat 'dört' anlamına gelen Portekizce quatro'dan gelir .

kurallar

  • Standart boşluklar uygulanır
  • Kaynak kodu bir dosyadan okuyamayabilirsiniz
  • Boş bir giriş boş bir çıktı vermelidir

Bonus

Girdi uzunluğunuz 4 katıysa, en kısa length/4zamanları yazdırarak% 25 bonus kazanabilirsiniz . Çıktıyı boşluklarla ayırırsanız başka% 5 bonus (takip eden alana izin verilmez).

Test durumları

Aşağıdaki test durumları program için geçerlidir in%4=0?cat:self(gerçek dil değil).

<empty input> -> <empty output>
input -> input
1234 -> in%4=0?cat:self
12345678 -> in%4=0?cat:self % 0 bonus %
12345678 -> in%4=0?cat:selfin%4=0?cat:self 25 bonus
12345678 -> in%4=0?cat:self in%4=0?cat:self % 30 bonus

puanlama

Bu . Bayt cinsinden en kısa kod kazanır.


Girişin birden fazla satırı olabilir mi?
LegionMammal978

@ LegionMammal978 Tabii ki, \ngirişin 1 baytı için yeni satır karakteri olsun .
Bassdrop Cumberwubwubwub 11:15

Tamam, bu sadece bir satırda okunması gereken, benim dilimdeki girişleri zorlaştırıyor.
LegionMammal978

Quines için yerleşik izin verilir mi? (bakınız: Cidden )
Addison Crump

@FlagAsSpam Umurumda değil, ama bir meta gönderinin burada daha uygun olduğunu düşünüyorum.
Bassdrop Cumberwubwubwub 11:15

Yanıtlar:


8

CJam, 23 * 0.75 = 17.25 bayt

Standart genelleştirilmiş k ...

{`"_~"+q:Q,4md@@*Q\?}_~

veya

{`"_~"+q_,4md@@]:\*?}_~

Burada test et.

açıklama

{`"_~"+  e# Generalised quine framework. Leaves the source code on the stack.
  q:Q    e# Read input and store it in Q.
  ,      e# Get its length.
  4md    e# Divmod 4.
  @      e# Pull up the source code.
  @      e# Pull up the div.
  *      e# Repeat the source code that many times.
  Q\     e# Push the input and swap it below the repeated source.
  ?      e# Pick the right output based on the modulo.
}_~

Diğer versiyon, yığın dönüşü numarası kullanarak bir değişkenin kullanılmasını önler ]:\.


4

Cidden, 8 9 bayt

Q,ó;l4@%I

Çevrimiçi Deneyin

(Boş girişi test etmek için giriş kutusuna bir kez girin.)

İlk bonus 12 byte (16 *, 75) yapılabilir:

Q,ó;l;4@\(*)4@%I

Açıklama:

Q                   Push program source to stack
 ,ó                 Push input string, and terminate if it's empty
   ;l               Push length of input
     4@%            Take the length mod 4.
        I           Pick the next stack element (input) if nonzero,
                    else the next next (program source)

Bazı insanlar Seriously'in quining yerleşik özelliğini kullanmaktan hoşlanmadıkları Qiçin referans olarak kullanılmayan bu 22 byte sürümünü veriyorum :

`è";ƒ"(+,ó;l4@%I`;ƒ

Bu insanlardan biriyseniz, bunu kesin sürüm olarak düşünün (şimdilik) ve daha sonra sıradaki yerleşiklerin kullanımıyla ilgili bir meta iplik başlatın.


6
Bir de quine meydan, ben program kaynağını okuyamaz inanıyoruz.
Conor O'Brien,

3
Talimatlar dosyayı bir dosyadan okuyamayacağınızı söylüyor. Q, boş olduğunda kaynağı yığına iten yerleşik bir komuttur. Sanırım bu, "dilin güçlü yönlerine oynamak" altında
kalıyor

4
Yerleşik bir sorgulama işlevinin kaynak kodu okuduğunu düşünüyorum. Bu, meydan okuma "yerleşik factorials yok" deyince, binom katsayısı zorluğu için bir yerleşik kullanmak gibi.
Martin Ender

4
Q, programın kaynağını teknik olarak bir dosyadan okumaz - tercüman tarafından depolanan RAM’de. Kural özellikle "bir dosyadan" belirttiğinden, bu geçerli olmalıdır.
Mego

3
Bunun neden HQ9 + ve Ismael'in MarioGolf dahil yerleşik operatörlere sahip daha önceki dillerden daha popüler olduğunu anlamıyorum. Ancak her durumda programınız boş girdiler için doğru çalışmıyor gibi görünüyor.
Martin Ender

2

Pyth, 33 * .75 = 24.75

?%lz4z*/lz4jN*2]"?%lz4z*/lz4jN*2]

Test odası

Join kullanarak standart Pyth quine. Bu sadece son bir takip çizgisi eklemeyen, çevrimiçi tercüman üzerindeki gerçek bir üründür.

Son bonusu alabilmek için 39 * .7 = 27.3 puan alınız:

?%lz4zjd*/lz4]jN*2]"?%lz4zjd*/lz4]jN*2]

2

Vitsy , 18 17 bayt

Çok yakın . Yus. Şimdi quiners olmayan yerleşik arasında kazanıyorum! ciddiye

zl4M([&'rd3*8\}]Z
z                 Grab ALL THE INPUT! :D
 l4M([         ]  If the input is a multiple of four, do the stuff in brackets.
      &           Generate a new stack and move to it.
       'rd3*      Standard quine.
            8\}   Push the bottom 8 items of the stack to the top.
                Z Output the current stack.

Bonusların peşinden gitmem için hiçbir sebep yok - çok daha fazla baytı sıktılar.

Hile sürüm sürümü, 12 bayt:

zl4M([&iG`]Z
zl4M([&   ]Z  Same as above.
       i      Push -1.
        G     Get the name of the file with this index of use (-1 is self)
         `    Read the file with the given name and push its contents to the stack.

G` havalı! Basit bir Qkomuttan daha okunaklı görünüyor .
Conor O'Brien,

Dosya g / Ç gerektirdiğini görerek, bana daha az okunaklı görünüyor.
quintopia,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Quintopia haklı - sadece dosya referansını aldığım için daha iyi olduğu anlamına gelmez. : P
Addison Crump,

2

Emacs Lisp (323 * 0.75 = 242.25)

((lambda (s) (let* ((a (read-string "")) (l (string-bytes a))) (if (> (% l 4) 0) (message a) (dotimes (v (/ l 4)) (prin1 (list s (list (quote quote) s))))))) (quote (lambda (s) (let* ((a (read-string "")) (l (string-bytes a))) (if (> (% l 4) 0) (message a) (dotimes (v (/ l 4)) (prin1 (list s (list (quote quote) s)))))))))

Bu, kaynak kodunu kendisine girdi olarak vermek için Lisp'in alıntı teknisyenini kullanır.

Eski hile sürümü

:; exec emacs -Q -script $0
(find-file(nth 2 command-line-args))(set'b(buffer-string))(set's(read-string""))(set'l(string-bytes s))(if(>(% l 4)0)(message s)(dotimes(v(/ l 4))(message"%s"b)))

Ungolfed:

:; exec emacs -Q -script $0
(find-file(nth 2 command-line-args)) ; open self
(set'b(buffer-string))               ; read own code to string
(set's(read-string""))               ; read input
(set'l(string-bytes s))              ; length of input
(if(>(% l 4)0)                       ; l % 4 > 0 ?
    (message s)                      ; output input
  (dotimes(v(/ l 4))                 ; (implicit else) repeat l/4 times
    (message"%s"b)))                 ; output own code

2
Bu "kaynak kodunu bir dosyadan okuyamayabilirsiniz" kuralını ihlal etmiyor mu?
ThisSuitIsBlackNot

@BuSuitIsBlackNot haklı değilsin ... sanırım Elisp'te aldatıcı olmayan bir Quine aramam gerekecek
Lord Yuuma

1

JavaScript, 57 56 72 bayt * 0,75 = 54

Bir bayt tasarruf için @Neil'e teşekkürler!

(f=_=>alert(!(p=prompt())||(l=p.length)%4?p:`(f=${f})()`.repeat(l/4)))()

Bulabildiğim en kısa çözüm oldukça basitti.

Yani, işte birkaç bonus (daha ilginç) çözümler:

JavaScript, 82 81 bayt * 0,75 = 60,75

f=_=>{try{p=prompt();a=`f=${f};f()`.repeat(p.length/4)}catch(e){a=p}alert(a)};f()

Bu repeat, tamsayı olmayan bir kişiyi geçerse istisna atama işlevini kötüye kullanır .

JavaScript, 83 bayt * 0.70 = 58.1

(f=_=>alert((a=(p=prompt()).split(/.{4}/)).pop()?p:a.fill(`(f=${f})()`).join` `))()

Bu sonuncusu kesinlikle en sevdiğim şey, girişi her dört karakterdeki ifadeyi regex kullanarak bölmek /.{4}/. Dizenin sonunda, karakterin pop4 ile bölünemediği herhangi bir karakter varsa , girişi uyar. Aksi takdirde, popdizinin uzunluğu sadece Bu durumda, giriş uzunluğu / 4'e eşit olduğu bu nedenle bu noktada, bir kişi tarafından dizinin uzunluğu, indirgenmiş fillbu Quine'ın ve joinboşluklarla.


Durumu tersine çevirerek bir bayt tasarruf edebileceğinizi düşünüyorum; değişir &&için ||, bir koyun !önce (p=prompt()), kaldırmak <1ve taşımak piç kısmında olmak ?:.
Neil

1

Perl, 68 65 * 0.75 = 48.75 bayt

perl -e'$_=q{print+($l=($~=<>)=~y///c)%4?$~:"\$_=q{$_};eval"x($l/4)};eval'

Buradaki çevrimiçi test paketine bakın .

Bozuldu

perl -e'
    $_=q{                      # store source code in $_
        print+(
            $l=($~=<>)=~ y///c # read STDIN into $~, assign length to $l
        )%4 ?                  # if length is a multiple of 4
             $~ :              # print $~
             "\$_=q{$_};eval"  # otherwise, print source code
             x($l/4)           # length/4 times
    };
    eval'                      # eval $_ to execute its contents

0

Mathematica, 229 bayt

($RecursionLimit = Infinity; WriteString[$Output, If[Mod[StringLength[a = (If[(a = InputString[]) === EndOfFile, "", StringJoin["\n", a, #0[]]] & )[]], 4] == 1, ToString[#0, InputForm][], If[a == "", "", StringDrop[a, 1]]]]) & []

Tüm boşluklar InputFormprogramın gerçek koduyla eşleşmesi içindir.


0

Javascript ES6, 45 bayt

$=(_=prompt())=>_.length%4?_:`$=${$};$()`;$()

21 baytlık Bling Quine'imin uzatılması. Karıştırma promptve işlev çıktısına izin verildiğini umuyorum.


0

JavaScript, 33 bayt

f=(i,l=i.length)=>l%4?i:("f="+f).repeat(l/4)
  • +44 bayt
  • % -25 bonus

Diğer çözümler:

44 36 bayt

f=(i,l=i.length)=>l%4?i:("f="+f).repeat(!!l)

f=(i,l=i.length)=>l%4?i:l?("f="+f):i

38,5 bayt

f=(i,l=i.length)=>l%4?i:Array(l/4).fill("f="+f).join` `
  • +55 bayt
  • % -25 bonus
  • % -5 bonus
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.