Quat. Quine + Cat


22

Quat - это комбинация и популярной программы esolang cat .

Вызов

Задача состоит в том, чтобы написать стандартную программу для кошек. Независимо от того, что пользователь вводит, программа отобразит ввод на стандартный вывод.
Однако, когда длина ввода больше 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 Cumberwubwubwub

Хорошо, это только усложняет ввод на моем языке, который должен читаться по одной строке за раз.
LegionMammal978

Разрешены ли встроенные модули для Quines? (см .: Серьезно )
Эддисон Крамп

@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

Попробуйте онлайн

(Нажмите ввод один раз в поле ввода, чтобы проверить пустой ввод.)

Первый бонус может быть сделан в 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)

Так как некоторым людям не нравится использование встроенного quining в Seriously, я предоставляю эту 22-байтовую версию, которая не используется Qдля справки:

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

Если вы один из тех людей, считайте это окончательной версией (на данный момент), а затем начните мета-поток об использовании встроенных модулей в quines.


6
В Куайне вызова, я полагаю , вы не можете прочитать исходный код программы.
Конор О'Брайен

3
В инструкциях говорится, что вы не можете прочитать его из файла. Q - встроенная команда, которая помещает источник в стек, когда он пуст. Я думаю, что это подпадает под «игру в сильные стороны языка»
Quintopia

4
Я думаю, что встроенная функция цитирования действительно читает исходный код. Это похоже на использование встроенной задачи для биномиального коэффициента, когда в задаче говорится «нет встроенных факториалов».
Мартин Эндер

4
Технически, Q не читает исходный код программы из файла - он находится в ОЗУ и хранится в интерпретаторе. Поскольку в правиле конкретно указано «из файла», это должно быть действительно.
Мего

3
Я не очень понимаю, почему он более популярен, чем любые предыдущие языки со встроенными операторами quine, включая HQ9 + и MarioGolf Исмаэля. Но в любом случае ваша программа не работает правильно для пустого ввода.
Мартин Эндер

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.

У меня нет причин искать бонусы - они набирают больше байтов.

Читерская версия 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команда.
Конор О'Брайен

Кажется менее законным для меня, видя, как это требует файлового ввода-вывода.
Quintopia

@ CᴏɴᴏʀO'Bʀɪᴇɴ Квинтопия прав - если я получу ссылку на файл, это не значит, что она лучше. : P
Эддисон Крамп

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

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
Не нарушает ли это правило: «Вы не можете читать исходный код из файла»?
ThisSuitIsBlackNot

@ThisSuitIsBlackНе вы правы ... думаю, мне придется искать
Куинаса

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с квинной и 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

Mathematica, 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.