Quat. Quine + Cat

22

Quat to połączenie i popularnego programu dla kotów esolang .

Wyzwanie

Wyzwanie polega na napisaniu standardowego programu dla kotów. Cokolwiek użytkownik wprowadzi, program wyśle ​​echo wejścia na standardowe wyjście.
Jednak gdy długość wejścia jest większa niż 0 i wielokrotność 4, program powinien wypisać własny kod źródłowy. Quat pochodzi z portugalskiego quatro , co przekłada się na „cztery”.

Zasady

  • Standardowe luki zastosowanie
  • Nie możesz odczytać kodu źródłowego z pliku
  • Puste wejście powinno dawać puste wyjście

Premia

Jeśli twoja długość wejściowa jest wielokrotnością 4, możesz zarobić 25% bonusu drukując length/4czasy quine . Kolejny 5% bonus, jeśli oddzielisz wynik od spacji (niedozwolone jest końcowe miejsce).

Przypadki testowe

Dla programu obowiązują następujące przypadki testowe in%4=0?cat:self(nie jest to prawdziwy język).

<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

Punktacja

To jest . Najkrótszy kod w bajtach wygrywa.

Bassdrop Cumberwubwubwub
źródło
Czy dane wejściowe mogą mieć wiele wierszy?
LegionMammal978,
@ LegionMammal978 Ofcourse, niech \nbędzie nowym znakiem wiersza, na 1 bajt wejścia
Bassdrop Cumberwubwubwub
Ok, to po prostu komplikuje wprowadzanie w moim języku, który należy czytać pojedynczo.
LegionMammal978,
Czy dozwolone są wbudowane quiny? (patrz: Poważnie )
Addison Crump,
@FlagAsSpam Nie mam nic przeciwko, ale myślę, że meta-post jest tutaj bardziej odpowiedni.
Bassdrop Cumberwubwubwub

Odpowiedzi:

8

CJam, 23 * 0,75 = 17,25 bajtów

Standardowy uogólniony quine ...

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

lub

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

Sprawdź to tutaj.

Wyjaśnienie

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

Druga wersja unika używania zmiennej, stosując sztuczkę obracania stosu ]:\.

Martin Ender
źródło
4

Poważnie, 8 9 bajtów

Q,ó;l4@%I

Wypróbuj online

(Naciśnij raz w polu wprowadzania, aby przetestować puste dane wejściowe.)

Pierwszego bonusu można dokonać w 12 bajtach (16 * .75):

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

Wyjaśnienie:

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)

Ponieważ niektórym ludziom nie podoba się korzystanie z wbudowanego quiningu Seriously, udostępniam 22-bajtową wersję, która nie jest używana Qjako odniesienie:

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

Jeśli jesteś jedną z tych osób, rozważ tę ostateczną wersję (na razie), a następnie rozpocznij meta wątek na temat korzystania z wbudowanych w quines.

kwintopia
źródło
6
Uważam , że w quine quizie nie można odczytać źródła programu.
Conor O'Brien,
3
Instrukcje mówią, że nie można odczytać go z pliku. Q jest wbudowanym poleceniem, które wypycha źródło do stosu, gdy jest on pusty. Myślę, że należy to do „gry z mocnymi stronami języka”
stronami kwintopia
4
Myślę, że wbudowana funkcja quiningu odczytuje kod źródłowy. To tak, jakby użyć wbudowanego wyzwania dwumianowego, gdy wyzwanie mówi „brak wbudowanych silni”.
Martin Ender
4
Q technicznie nie odczytuje źródła programu z pliku - znajduje się w pamięci RAM, przechowywanej przez tłumacza. Ponieważ reguła wyraźnie stwierdza „z pliku”, powinno to być poprawne.
Mego
3
Naprawdę nie rozumiem, dlaczego jest to bardziej popularne niż jakiekolwiek poprzednie języki z wbudowanymi operatorami quine, w tym HQ9 + i MarioGolf Ismaela. Ale w każdym razie twój program nie działa poprawnie przy pustych danych wejściowych.
Martin Ender,
2

Pyth, 33 * .75 = 24,75

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

Pakiet testowy

Standardowa Quine Pyth za pomocą łączyć. To tylko prawdziwa quine na tłumaczu online, który nie dodaje końcowej nowej linii.

Otrzymanie końcowej premii powoduje wynik 39 * .7 = 27,3:

?%lz4zjd*/lz4]jN*2]"?%lz4zjd*/lz4]jN*2]
FryAmTheEggman
źródło
2

Vitsy , 18 17 bajtów

Tak blisko . Yus. Teraz wygrywam wśród niewbudowanych quinerów! patrzy na Poważnie

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.

Nie ma powodu, abym sięgał po bonusy - rzuciły o wiele więcej bajtów.

Oszustwo wersja quine, 12 bajtów:

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
źródło
G` jest super! Wydaje się bardziej uzasadnione niż proste Qpolecenie.
Conor O'Brien,
Wydaje mi się mniej uzasadnione, ponieważ wymaga plików I / O.
kwintopia,
@ CᴏɴᴏʀO'Bʀɪᴇɴ Quintopia ma rację - tylko dlatego, że dostaję odwołanie do pliku, nie znaczy, że jest lepiej. : 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)))))))))

Wykorzystuje to mechanikę cytowania Lispa do podania kodu źródłowego jako danych wejściowych.

Stara wersja oszukiwania

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

Nie golfowany:

:; 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
Lord Yuuma
źródło
2
Czy nie narusza to zasady „Nie możesz odczytać kodu źródłowego z pliku”?
ThisSuitIsBlackNot
@ThisSuitIsBlackNie masz racji ... myślę, że będę musiał poszukać nie zdradzającej Quine w Elisp
Lord
1

JavaScript, 57 56 72 bajtów * 0,75 = 54

Dzięki @Neil za jednobajtowe oszczędności!

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

Najkrótsze rozwiązanie, jakie udało mi się znaleźć, było dość proste.

Oto kilka dodatkowych (ciekawszych) rozwiązań:

JavaScript, 82 81 bajtów * 0,75 = 60,75

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

Ten nadużywa repeat funkcjonalność zgłaszania wyjątku, jeśli zostanie przekazana liczba całkowita.

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

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

Ten ostatni jest zdecydowanie moim ulubionym, dzieląc dane wejściowe na każde cztery znaki za pomocą wyrażenia regularnego /.{4}/. Jeśli na końcu łańcucha pozostały jakieś znaki, gdy my pop, nie można go podzielić przez 4, więc zaalarmuj dane wejściowe. W przeciwnym razie popzmniejszyliśmy długość tablicy o jeden, więc w tym momencie długość tablicy jest równa długości wejściowej / 4. W tym przypadku po prostu fillz quine i joinspacjami.

jrich
źródło
Myślę, że możesz zapisać bajt, odwracając warunek; Zmień &&się ||, położyć !przed (p=prompt()), usunąć <1i przenieść psię na wewnętrznej stronie z ?:.
Neil,
1

Perl, 68 65 * 0,75 = 48,75 bajtów

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

Zobacz pakiet testów online tutaj.

Zepsuty

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
ThisSuitIsBlackNot
źródło
0

Mathematica, 229 bajtów

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

Cała biała spacja jest InputFormzgodna z faktycznym kodem programu.

LegionMammal978
źródło
0

JavaScript ES6, 45 bajtów

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

Rozszerzenie mojej 21-bajtowej wersji Bling Quine. Mam nadzieję, że miksowanie prompti generowanie funkcji jest dozwolone.

Mama Fun Roll
źródło
0

JavaScript, 33 bajty

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

Inne rozwiązania:

44 36 bajtów

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 bajtów

f=(i,l=i.length)=>l%4?i:Array(l/4).fill("f="+f).join` `
  • +55 bajtów
  • -25% bonusu
  • -5% bonus
ericw31415
źródło