Quat. Quine + Cat


22

Ein Quat ist eine Kombination aus einem und dem beliebten Esolang- Katzenprogramm .

Herausforderung

Die Herausforderung besteht darin, ein Standard-Katzenprogramm zu schreiben. Unabhängig von den Benutzereingaben gibt das Programm die Eingabe als stdout aus.
Wenn die Länge der Eingabe jedoch größer als 0 und ein Vielfaches von 4 ist, sollte das Programm seinen eigenen Quellcode ausgeben. Quat kommt aus dem portugiesischen quatro , was "vier" bedeutet.

Regeln

  • Es gelten Standardlücken
  • Möglicherweise lesen Sie den Quellcode nicht aus einer Datei
  • Eine leere Eingabe sollte eine leere Ausgabe erzeugen

Bonus

Wenn Ihre Eingabelänge ein Vielfaches von 4 ist, können Sie einen Bonus von 25% verdienen, indem Sie die Quine- length/4Zeiten drucken . Ein weiterer 5% Bonus, wenn Sie die Ausgabe durch Leerzeichen trennen (kein Leerzeichen erlaubt).

Testfälle

Die folgenden Testfälle gelten für das Programm in%4=0?cat:self(keine echte Sprache).

<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

Wertung

Das ist . Kürzester Code in Bytes gewinnt.


Kann die Eingabe mehrere Zeilen haben?
LegionMammal978

@ LegionMammal978 Natürlich, sei \ndas neue Zeilenzeichen für 1 Byte Eingabe
Bassdrop Cumberwubwubwub

Okay, es erschwert nur die Eingabe in meiner Sprache, die zeilenweise gelesen werden muss.
LegionMammal978

Sind Einbauten für Quines erlaubt? (siehe: Ernsthaft )
Addison Crump

@FlagAsSpam Ich habe nichts dagegen, aber ich denke, ein Meta-Post ist hier besser geeignet.
Bassdrop Cumberwubwubwub

Antworten:


8

CJam, 23 × 0,75 = 17,25 Bytes

Standard verallgemeinertes ...

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

oder

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

Teste es hier.

Erläuterung

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

In der anderen Version wird die Verwendung einer Variablen mithilfe des Stapeldrehtricks vermieden ]:\.


4

Im Ernst, 8 9 Bytes

Q,ó;l4@%I

Probieren Sie es online

(Drücken Sie einmal die Eingabetaste im Eingabefeld, um die Leereingabe zu testen.)

Der erste Bonus kann in 12 Bytes (16 * .75) erfolgen:

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

Erläuterung:

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)

Da einige Leute die Verwendung von Seriouslys integriertem Quining nicht mögen, stelle ich diese 22-Byte-Version zur Verfügung, die nicht Qals Referenz verwendet wird:

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

Wenn Sie einer dieser Leute sind, betrachten Sie dies als die endgültige Version (für den Moment) und starten Sie dann einen Meta-Thread über die Verwendung von eingebauten Inhalten in Quines.


6
Ich bin der Meinung, dass Sie in einer schwierigen Situation die Programmquelle nicht lesen können.
Conor O'Brien,

3
Die Anweisungen besagen, dass Sie es nicht aus einer Datei lesen können. Q ist ein integrierter Befehl, der die Quelle in den Stapel schiebt, wenn sie leer ist. Ich denke, dies fällt unter "die Stärken der Sprache
ausspielen

4
Ich denke, eine eingebaute Quining-Funktion liest den Quellcode. Dies entspricht der Verwendung einer integrierten Abfrage für einen Binomialkoeffizienten, wenn in der Abfrage "keine integrierten Fakultäten" angegeben sind.
Martin Ender

4
Q liest die Programmquelle technisch gesehen nicht aus einer Datei - sie befindet sich im RAM, der vom Interpreter gespeichert wird. Da in der Regel ausdrücklich "aus einer Datei" angegeben ist, sollte dies gültig sein.
Mego

3
Ich verstehe nicht wirklich, warum dies bei integrierten Quine-Operatoren, einschließlich HQ9 + und Ismaels MarioGolf, beliebter ist als alle vorherigen Sprachen. Aber auf jeden Fall scheint Ihr Programm bei Leereingaben nicht richtig zu funktionieren.
Martin Ender

2

Pyth, 33 * .75 = 24,75

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

Test Suite

Standard-Pyth-Quine mit Join. Dies ist nur eine echte Quine für den Online-Interpreter, der keine abschließende Newline hinzufügt.

Die endgültigen Bonusergebnisse erhalten Sie mit einer Punktzahl von 39 * .7 = 27.3:

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

2

Vitsy , 18 17 Bytes

So nah dran . Yus. Ich gewinne jetzt unter nicht eingebauten Quinern! starrt Ernsthaft an

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.

Es gibt keinen Grund für mich, nach den Boni zu suchen - sie würden viel mehr Bytes einwerfen.

Cheating Quine Version, 12 Bytes:

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` ist cool! Es scheint mehr legitim als ein einfacher QBefehl.
Conor O'Brien

Scheint mir weniger legitim, da es Datei-E / A erfordert.
Quintopia

@ CᴏɴᴏʀO'Bʀɪᴇɴ Quintopia hat recht - nur weil ich die Dateireferenz bekomme, heißt das nicht, dass es nicht besser ist. : 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)))))))))

Hierbei wird die Zitiermechanik von Lisp verwendet, um den Quellcode als Eingabe für sich selbst zu geben.

Alte betrügerische Version

:; 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
Verstößt dies nicht gegen die Regel "Sie können den Quellcode nicht aus einer Datei lesen"?
ThisSuitIsBlackNot

@ThisSuitIsBlackNot du hast Recht ... Ich schätze, ich muss in Elisp nach einem nicht betrügenden Quine Ausschau halten
Lord Yuuma

1

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

Vielen Dank an @Neil für die Einsparung von einem Byte!

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

Die kürzeste Lösung, die ich finden konnte, war ziemlich einfach.

Also, hier sind ein paar (interessantere) Bonuslösungen:

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

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

Dies missbraucht repeatdie Funktionalität, eine Ausnahme auszulösen , wenn eine Nicht-Ganzzahl übergeben wird.

JavaScript, 83 Byte * 0,70 = 58,1

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

Letzteres ist definitiv mein Favorit, indem ich die Eingabe mit dem Regex auf vier Zeichen aufteile /.{4}/. Wenn am Ende der Zeichenfolge noch Zeichen vorhanden sind pop, ist dies nicht durch 4 teilbar. Warnen Sie daher die Eingabe. Andernfalls wird die popLänge des Arrays um eins verringert, sodass an dieser Stelle die Länge des Arrays der Eingabelänge / 4 entspricht. In diesem Fall nur fillmit dem Quine und joinmit Leerzeichen.


Ich denke, Sie können ein Byte speichern, indem Sie die Bedingung invertieren; Ändern Sie den Wert &&auf ||, setzen Sie einen !vor den (p=prompt())Wert, entfernen Sie den Wert <1und verschieben Sie den pWert auf die Innenseite des ?:.
Neil

1

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

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

Die Online-Testsuite finden Sie hier.

Heruntergebrochen

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 Bytes

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

Das gesamte Leerzeichen entspricht dem InputFormtatsächlichen Code des Programms.


0

Javascript ES6, 45 Bytes

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

Erweiterung meines 21-Byte-Bling Quine. Hoffe, dass Mischen promptund Funktionsausgabe erlaubt ist.


0

JavaScript, 33 Bytes

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

Andere Lösungen:

44 36 Bytes

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 Bytes

f=(i,l=i.length)=>l%4?i:Array(l/4).fill("f="+f).join` `
  • +55 Bytes
  • -25% Bonus
  • -5% Bonus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.