Quat. Quine + Cat

22

Quat adalah kombinasi dari program dan program kucing esolang yang populer .

Tantangan

Tantangannya adalah menulis program kucing standar. Apa pun input pengguna, program akan menggemakan input ke stdout.
Namun, ketika panjang input lebih besar dari 0 dan kelipatan 4, program harus menampilkan kode sumbernya sendiri. Quat berasal dari quatro Portugis , yang diterjemahkan menjadi 'empat'.

Aturan

  • Celah standar berlaku
  • Anda mungkin tidak membaca kode sumber dari file
  • Input kosong harus menghasilkan output kosong

Bonus

Jika panjang input Anda adalah kelipatan 4, Anda bisa mendapatkan bonus 25% dengan mencetak waktu quine length/4. Bonus 5% lainnya jika Anda memisahkan output dengan spasi (tidak ada spasi tambahan).

Uji kasus

Kasing uji berikut berlaku untuk program in%4=0?cat:self(bukan bahasa asli).

<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

Mencetak gol

Ini adalah . Kode terpendek dalam byte menang.

Bassdrop Cumberwubwubwub
sumber
Bisakah input memiliki beberapa baris?
LegionMammal978
@ LegionMammal978 Ofcourse, biarkan \nmenjadi karakter baris baru, untuk 1 byte input
Bassdrop Cumberwubwubwub
Oke, itu hanya mempersulit input dalam bahasa saya, yang harus dibaca satu baris pada satu waktu.
LegionMammal978
Apakah built-in untuk quine diperbolehkan? (lihat: Serius )
Addison Crump
@ FlagAsSpam Saya tidak keberatan, tapi saya pikir meta-post lebih tepat di sini.
Bassdrop Cumberwubwubwub

Jawaban:

8

CJam, 23 * 0,75 = 17,25 byte

Standar generalisasi ...

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

atau

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

Uji di sini.

Penjelasan

{`"_~"+  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.
}_~

Versi lain menghindari penggunaan variabel dengan menggunakan trik tumpukan-rotasi ]:\.

Martin Ender
sumber
4

Serius, 8 9 byte

Q,ó;l4@%I

Cobalah secara Online

(Tekan enter sekali dalam kotak input untuk menguji input kosong.)

Bonus pertama dapat dilakukan dalam 12 byte (16 * .75):

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

Penjelasan:

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)

Karena beberapa orang tidak menyukai penggunaan quining built-in Seriously, saya menyediakan versi 22 byte ini yang tidak digunakan Quntuk referensi:

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

Jika Anda salah satu dari orang-orang itu, pertimbangkan ini versi definitif (untuk saat ini) dan kemudian mulai utas meta tentang penggunaan built-in di quines.

kuintopia
sumber
6
Dalam tantangan quine , saya yakin Anda tidak bisa membaca sumber program.
Conor O'Brien
3
Instruksi mengatakan Anda tidak dapat membacanya dari file. Q adalah perintah bawaan yang mendorong sumber ke tumpukan saat kosong. Saya pikir ini berada di bawah "bermain dengan kekuatan bahasa"
quintopia
4
Saya pikir fungsi quining built-in membaca kode sumber. Itu seperti menggunakan built-in untuk tantangan koefisien binomial, ketika tantangan mengatakan "no built-in factorials".
Martin Ender
4
Q tidak membaca sumber program dari file, secara teknis - itu dalam RAM, disimpan oleh penerjemah. Karena aturan secara khusus menyatakan "dari file", ini harus valid.
Mego
3
Saya tidak begitu mengerti mengapa ini lebih populer daripada bahasa-bahasa sebelumnya dengan operator quine bawaan, termasuk HQ9 + dan MarioGolf dari Ismael. Tetapi bagaimanapun juga program Anda sepertinya tidak berfungsi dengan benar untuk input kosong.
Martin Ender
2

Pyth, 33 * .75 = 24.75

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

Test Suite

Standar Pyth quine menggunakan join. Ini hanya quine yang sebenarnya pada juru bahasa online, yang tidak menambahkan baris akhir baru.

Mendapatkan bonus akhir menghasilkan skor 39 * .7 = 27.3:

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

Vitsy , 18 17 byte

Sangat dekat . Yus. Saya sekarang menang di antara quiner non-built-in!menatap serius

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.

Tidak ada alasan bagi saya untuk mengejar bonus - mereka akan membuang lebih banyak byte.

Versi quine kecurangan, 12 byte:

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.
Addison Crump
sumber
G` keren! Tampaknya lebih sah daripada Qperintah sederhana .
Conor O'Brien
Tampaknya kurang sah bagi saya, mengingat bagaimana itu membutuhkan file I / O.
kuintopia
@ CᴏɴᴏʀO'Bʀɪᴇɴ Quintopia benar - hanya karena saya mendapatkan referensi file tidak berarti itu lebih baik. : 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)))))))))

Ini menggunakan mekanik kutipan Lisp untuk memberikan kode sumber sebagai input untuk dirinya sendiri.

Versi curang lama

:; 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)))

Tidak Disatukan:

:; 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
Tuan Yuuma
sumber
2
Tidakkah ini melanggar aturan bahwa "Anda tidak boleh membaca kode sumber dari file"?
ThisSuitIsBlackNot
@ThisSuitIsBlackTidak Anda benar ... kira saya harus mencari Quine yang tidak curang di Elisp
Lord Yuuma
1

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

Terima kasih kepada @Neil untuk penghematan satu byte!

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

Solusi terpendek yang bisa saya temukan adalah cukup mudah.

Jadi, inilah beberapa solusi bonus (lebih menarik):

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

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

Ini melecehkan repeatfungsi melempar pengecualian jika melewati non-integer.

JavaScript, 83 byte * 0.70 = 58.1

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

Yang terakhir ini jelas favorit saya, membagi input pada setiap empat karakter menggunakan regex /.{4}/. Jika ada karakter yang tersisa di akhir string saat kita pop, itu tidak dapat dibagi dengan 4, jadi beri tahu input. Kalau tidak, popmengurangi panjang array dengan satu, jadi pada titik ini panjang array sama dengan panjang input / 4. Dalam hal ini, cukup filldengan quine dan joinspasi.

Jrich
sumber
Saya pikir Anda dapat menyimpan byte dengan membalikkan kondisinya; ubah &&ke ||, letakkan !sebelum (p=prompt()), lepaskan <1dan pindahkan puntuk berada di bagian dalam ?:.
Neil
1

Perl, 68 65 * 0,75 = 48,75 byte

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

Lihat suite tes online sini.

Rusak

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
IniSuitIsBlackNot
sumber
0

Mathematica, 229 byte

($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]]]]) & []

Semua spasi putih adalah untuk InputFormprogram agar sesuai dengan kode aktualnya.

LegionMammal978
sumber
0

Javascript ES6, 45 byte

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

Perpanjangan Bling Quine 21-byte saya. Berharap pencampuran promptdan output fungsi diizinkan.

Mama Fun Roll
sumber
0

JavaScript, 33 byte

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

Solusi lain:

44 36 byte

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 byte

f=(i,l=i.length)=>l%4?i:Array(l/4).fill("f="+f).join` `
  • +55 byte
  • -25% bonus
  • Bonus -5%
ericw31415
sumber