Кват. Quine + Cat


22

Quat є поєднання і популярної esolang кішки програми.

Виклик

Завдання полягає в тому, щоб написати стандартну програму для котів. Що б не вводило користувач, програма повторює вхід до stdout.
Однак, коли довжина вводу більше 0 і кратна 4, програма повинна вивести власний вихідний код. Quat походить від португальського quatro , що в перекладі означає «чотири».

Правила

  • Застосовуються стандартні лазівки
  • Ви не можете прочитати вихідний код з файлу
  • Порожній вхід повинен дати порожній вихід

Бонус

Якщо ваша тривалість введення кратна 4, ви можете заробити 25% бонус, надрукувавши кількість квитків length/4. Ще 5% бонус, якщо ви розділите результат пробілами (не допускається пробіл).

Тестові кейси

Наступні тестові випадки стосуються програми in%4=0?cat:self(не реальною мовою).

<empty input> -> <empty output>
input -> input
1234 -> in%4=0?cat:self
12345678 -> in%4=0?cat:self 0% бонус
12345678 -> in%4=0?cat:selfin%4=0?cat:self 25% бонус
12345678 -> in%4=0?cat:self in%4=0?cat:self 30% бонус

Оцінка балів

Це . Виграє найкоротший код у байтах.


Чи може вхід мати кілька рядків?
LegionMammal978

@ LegionMammal978 Звичайно, \nбудьте новим символом рядка, на 1 байт введення
Bassdrop Cumberwubwwwwub

Гаразд, це просто ускладнює введення моєю мовою, яку треба читати по одному рядку.
LegionMammal978

Чи дозволені вбудовані лайки? (див .: Серйозно )
Аддісон Кримп

@FlagAsSpam Я не заперечую, але я думаю, що мета-пост тут є більш підходящим.
Bassdrop Cumberwubwubwub

Відповіді:


8

CJam, 23 * 0,75 = 17,25 байт

Стандартні узагальнені квінти ...

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

або

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

Перевірте це тут.

Пояснення

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

Інша версія уникає використання змінної, використовуючи трюк обертання стека ]:\.


4

Серйозно, 8 9 байт

Q,ó;l4@%I

Спробуйте в Інтернеті

(Натисніть Enter один раз у поле введення, щоб перевірити порожній ввід.)

Перший бонус можна зробити в 12 байт (16 * .75):

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

Пояснення:

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)

Оскільки деяким людям не подобається використання вбудованого сервісного сервісу, я надаю цю 22-байтну версію, яка не використовується Qдля довідок:

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

Якщо ви один з цих людей, розгляньте це остаточну версію (поки що), а потім перейдіть до мета-потоку про використання вбудованих лайків.


6
У Куайном виклику, я вважаю , ви не можете прочитати вихідний код програми.
Conor O'Brien

3
Інструкція говорить, що ви не можете прочитати його з файлу. Q - це вбудована команда, яка виштовхує джерело до стеку, коли воно порожнє. Я думаю, що це підпадає під "грати до сильних мов"
квінтопія

4
Я думаю, що вбудована функція квинінгу дійсно читає вихідний код. Це як використовувати вбудований для виклику біноміального коефіцієнта, коли виклик говорить "немає вбудованих факторіалів".
Мартін Ендер

4
Q не читає джерело програми з файлу, технічно - це в оперативній пам'яті, що зберігається перекладачем. Оскільки правило спеціально зазначає "з файлу", це має бути дійсним.
Мего

3
Я не розумію, чому це більш популярно, ніж будь-які попередні мови із вбудованими операторами quine, включаючи HQ9 + та MarioGolf Ismael. Але в будь-якому випадку ваша програма, здається, не працює належним чином для порожнього введення.
Мартін Ендер

2

Pyth, 33 * .75 = 24.75

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

Тестовий сюїт

Стандартний Pyth quine за допомогою приєднання. Це лише справжня лайка онлайн-інтерпретатора, яка не додає остаточного нового рядка.

Отримання остаточних бонусних результатів з оцінкою 39 * .7 = 27.3:

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

2

Віци , 18 17 байт

Так близько . Юс. Зараз я перемагаю серед небудованих квінерів! поглядає на Серйозно

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.

Немає мені причини йти за бонусами - вони блукали набагато більше байтів.

Версія Quating Quine, 12 байт:

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` це круто! Здається, це більш законно, ніж проста Qкоманда.
Conor O'Brien

Мені здається менш законним, бачачи, як це вимагає файлового вводу / виводу.
Кінтопія

@ CᴏɴᴏʀO'Bʀɪᴇɴ Quintopia має рацію - лише тому, що я отримую посилання на файл, це не означає, що це краще. : 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)))))))))

Для цього використовується механізм цитування Lisp, щоб дати вихідний код як вхід до себе.

Стара версія обману

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

Безголівки:

:; 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
Чи це не порушує правило, що "Ви не можете прочитати вихідний код з файлу"?
ThisSuitIsBlackNot

@ThisSuitIsBlackNot ти маєш рацію ... здогадуюсь, мені доведеться шукати Квіна, який не обманює, в Еліспі
лорд

1

JavaScript, 57 56 72 байти * 0,75 = 54

Дякуємо @Neil за економію на один байт!

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

Найкоротше рішення, яке я міг знайти, було досить прямим.

Отже, ось кілька бонусних (більш цікавих) рішень:

JavaScript, 82 81 байт * 0,75 = 60,75

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

Цей зловживає repeatфункціональністю викидання винятку, якщо передано не ціле число.

JavaScript, 83 байти * 0,70 = 58,1

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

Цей останній, безумовно, мій улюблений, розділяючи дані на кожні чотири символи, використовуючи регулярний вираз /.{4}/. Якщо в кінці рядка залишилися символи, коли ми pop, це не ділиться на 4, тому попереджайте введення. В іншому випадку popзменшено довжину масиву на одиницю, тому в цей момент довжина масиву дорівнює вхідній довжині / 4. У цьому випадку просто fillйого з quine та joinз пробілами.


Я думаю, ви можете зберегти байт, перевернувши стан; змінити &&на ||, поставити !перед (p=prompt()), видалити <1та перемістити pна внутрішню частину ?:.
Ніл

1

Perl, 68 65 * 0,75 = 48,75 байт

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

Дивіться онлайн-тестовий набір тут.

Зломаний

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

Математика, 229 байт

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

Все пробіл InputFormпрограми повинен відповідати його фактичному коду.


0

Javascript ES6, 45 байт

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

Розширення мого 21-байтного Bling Quine. Сподіваємось, що promptдозволено змішування та виведення функцій.


0

JavaScript, 33 байти

f=(i,l=i.length)=>l%4?i:("f="+f).repeat(l/4)
  • +44 байт
  • -25% бонус

Інші рішення:

44 36 байт

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 байт

f=(i,l=i.length)=>l%4?i:Array(l/4).fill("f="+f).join` `
  • +55 байт
  • -25% бонус
  • -5% бонус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.