Еще одна программа, и я вышел!

21

При заданном уровне вложенности целых чисел nи строке sпечатных символов ascii ( для ~вывода программы, которая при запуске на том же языке выводит программу, которая выводит программу ..., которая выводит строку s.

Всего nдолжно быть сгенерировано программ, все из которых должны быть выполнены на том же языке, что и ваш ответ.

Примечание: вы можете выводить программы или функции - все, что вам разрешено по умолчанию в качестве представления.

Вы можете вводить sс помощью экранированных символов, как программа или функция на вашем языке обычно вводит строку.


пример

Например, с учетом n=1и s="recursion", программа на Python 2 может вывести:

print "recursion"

Выполнение этого приведет к выводу:

recursion

Учитывая n=2и s = "PPCG", программа на Python 2 может вывести:

print "print \"PPCG\" "

Запуск этого вывода:

print "PPCG"

Запуск этого вывода:

PPCG

Связанный (+ название вдохновения): еще один LUL и я вышел

Также связанные (в песочнице - теперь удалено, но все еще может быть просмотрено с достаточной репутацией): рекурсия исходного кода

Тестовые случаи

Убедитесь, что ваш код работает для следующих тестовых случаев (по одному на строку):

n s
2 PPCG
4 Robert'); DROP TABLE Students;--
17 Deep
2 Spaces In Here
3 "Don't forget quotes!"
5 'Backt`cks might be a h`tch'
6 5%s
8 [Brackets]<Are>(Great){Usually}
3 !"#$%&'()*+,-./ 0123456789:;<=>?@ABCDEFGHIJKLMN
6 OPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
7 THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
3 the quick brown fox jumps over the lazy dog
fireflame241
источник
1
Читал задание и звучал как «эй, это выглядит очень знакомо…», а затем заметил ваш « Также связанный (в песочнице): Вдохновение исходного кода » на мой вопрос «Песочница». :) Я оставлю свой вопрос там, но удалю его через пару недель. Ваш в основном то же самое, за исключением добавления целочисленного параметра.
Кевин Круйссен,
1
Как предлагается здесь , разрешено ли возвращать анонимные функции вместо программ?
Арно
1
Включает ли "положительное целое число" 0?
Феликс Пальмен,
1
Вы выбрали программу по причине? По умолчанию это функция или программа? Разрешено ли иметь функцию, печатающую функцию?
Кевин Круйссен,
1
@StewieGriffin, потому что экранирование в подвыражениях или вложенных программах может быть проблематичным (и кто-то попросил кавычки в тестовой среде).
fireflame241

Ответы:

19

Желе , 2 байта

Ṿ¡

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

Ṿ¡  Main link; left argument (text) is x, right argument (repetitions) is y
 ¡  Repeat y times:
Ṿ   Uneval x; produce code that outputs x

хе-хе встроенные

HyperNeutrino
источник
Это сломано, «Привет» производит Привет, а не «Привет»
Tahg
10
@Tahg Ввод Jelly автоматически оценивается как код Python, если он не выдает ошибку. Если это так, то это просто строка. Вы должны сделать, '"hi"'чтобы увидеть ожидаемый результат
HyperNeutrino
19

JavaScript (ES6), 47 44 байта

Сохранено 3 байта благодаря @HermanLauenstein

Принимает ввод в синтаксис карри (n)(s).

n=>g=s=>`alert(atob("${btoa(--n?g(s):s)}"))`

пример

f(2)('PPCG')

Будет выводить:

'alert(atob("YWxlcnQoYXRvYigiVUZCRFJ3PT0iKSk="))'

Который напечатает:

'alert(atob("UFBDRw=="))'

Который напечатает:

'PPCG'

демонстрация

Более сложный пример, в котором alert()переопределены промежуточные результаты, которые выводятся на консоль и автоматически выполняются.


Альтернативная версия, 40 байт

Предложено @Shaggy

Этот возвращает анонимную функцию вместо полной программы.

n=>g=s=>`_=>atob("${btoa(--n?g(s):s)}")`
Arnauld
источник
Не могли бы вы вернуть анонимную функцию вместо использования alert? 41 байт
Мохнатые
@ Шэгги, я действительно не знаю. Я спросил ОП.
Арно
Если нет, может быть, вы могли бы сойти с IIFE вместо 45 байтов.
Лохматый
-3 байта с использованием каррирования: n=>g=s=>BTalert(atob("${btoa(--n?g(s):s)}"))BT(замените BT на backticks)
Herman L
@HermanLauenstein Спасибо! :)
Арно
10

sh + coreutils, 31 байт

yes exec sed 1d \$0|sed $1q;cat

Принимает nв качестве параметра командной строки и sSTDIN.

Нил
источник
8
Этот код говорит: «Да, вы обязательно должны казнить меня».
RedClover
Можете ли вы добавить объяснение? У меня возникли проблемы с разработкой
JoshRagem
1
@JoshRagem yesмногократно печатает свою командную строку exec sed 1d $0( $метасимвол оболочки, поэтому он должен быть заключен в кавычки). sed $1qпрекращает печать после $1(т.е. n) строк. catзатем копирует входную строку. Полученный файл представляет собой shскрипт, который говорит оболочке заменить себя копией sedс параметрами 1dи именем файла скрипта. sedзатем пропускает первую строку файла и выводит остальные. Каждый сценарий имеет на один exec sed 1d $0префикс меньше , пока после nвыполнения не будет напечатан только исходный ввод.
Нил
5

Haskell, 17 байт

На момент написания этой статьи это самый короткий ответ для языка, не относящегося к гольфу .

Это функция, которая принимает sи nв этом порядке и возвращает результат или исходный код выражения, который при оценке возвращает следующий исходный код.

(!!).iterate show

Аргументация того, почему это имеет значение:

  1. Решения могут быть функциями.
  2. Их выходы могут быть функциями.
  3. Эти функции не имеют параметров.
  4. В Haskell, поскольку он ленив и все закручен, наиболее естественным - для практического программирования - определение функции с 0 параметрами совпадает с ее результатом; самая близкая альтернатива, функция с 1 параметром, которая игнорирует параметр, является глупой.

Если fзадано PPCGи в 2качестве его параметров, результатом является текст "\"PPCG\""(первая сгенерированная функция), который при оценке возвращает текст "PPCG"(вторая сгенерированная функция), а когда он оценивается, он возвращает PPCG.

Спасибо Ними за предложение сокращения.

Кевин Рид
источник
В Haskell есть соответствующий вопрос Meta по вопросу о функциях без аргументов, хотя он еще не получил такого большого внимания и все еще имеет открытые вопросы: codegolf.meta.stackexchange.com/q/12924/56433
Laikoni
3

APL (Dyalog) , 24 23 байта

-1 благодаря нгн.

Это полная программа, которая запрашивает, sа затем nи печатает в STDOUT.

''''{⍺,⍨⍺,⍵/⍨1+⍵=⍺}⍣⎕⊢⍞

Попробуйте онлайн! (регистр 17 Deep опускается, так как он превышает предел вывода TIO - работает в автономном режиме)

подсказывать s

 дать это (отделить и )

''''{... }⍣⎕ запрашивать nи применять эту лямбду с одинарной кавычкой в ​​качестве левого аргумента много раз. обозначает левый аргумент (цитата) и обозначает правый аргумент (входной текст):

⍵=⍺ Логическое значение, где текст равен кавычке

1+ добавить одну

⍵/⍨ повторить каждый символ аргумента соответствующее количество раз

⍺, ставить цитату

⍺,⍨ добавить цитату

Это работает, потому что строки в APL 'разделены, а одинарные кавычки в строках удваиваются, в то время как другие символы не требуют экранирования.


Dyalog APL также поставляется с утилитой ( ⎕SE.Dyalog.Utils.repObj), которая генерирует выражение APL, которое оценивает его аргумент (аналогично неравномерному Jelly ). Следовательно, следующая программа эквивалентна вышеупомянутой, но работает для всех массивов:

SE.Dyalog.Utils.repObj⍣⎕⊢⎕

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

Адам
источник
Я думаю, что APLX допускает строки с двойными и одинарными кавычками. Если остальное работает там, вы можете сохранить байт :) Раньше ngn / apl но я удалил ""
ngn
Подумайте о том, чтобы передать кавычку как .-, которая сохраняет (как минимум) байт.
нгн,
@ngn Спасибо, но у APLX нет dfns. NARS2000 имеет как двойные кавычки, так и dfns, но символы стоят по два байта каждый.
Адам
2

Firefox JavaScript, 41 35 байт

f=(s,n)=>"_=>"+uneval(--n?f(s,n):s)

У Firefox есть приятный uneval, который делает то, на что это похоже - не показывает данный объект, в данном случае - строку.

dzaima
источник
2

Java 8, 95 93 байта

String c(String s,int n){return"v->\""+(n-->1?c(s,n).replaceAll("[\\\\\"]","\\\\$0"):s)+'"';}

-2 байта благодаря @Lynn .

Экранирование специальных символов так раздражает в Java.

Попробуйте здесь и попробуйте полученный метод здесь .

Объяснение:

String c(String s,int n){  // Method with String and int parameters and String return-type
  return"v->\""+           //  Return literal "v->" + a leading double-quote +
   (n-->1?                 //   If `n` is larger than 1:
     c(s,n)                //    Recursive-call,
      .replaceAll("[\\\\\"]","\\\\$0")
                           //    with all double-quotes ('"') and slashes ('\') escaped
    :                      //   Else:
     s)                    //    The input String
   +'"';                   //   + a trailing double quote
}                          // End of method 

Дополнительное объяснение для замены регулярного выражения:

.replaceAll("[\\\\\"]","\\\\$0")
.replaceAll("        ","      ")  // Replace the match of the 1st String, with the 2nd
             [      ]             //  One of these inner characters:
              \\\\                //   Escaped slash ('\')
                  \"              //   Escaped double-quote ('"')
                                  //  And replace them with:
                        \\\\      //   Escaped slash ('\'),
                            $0    //   plus found match

Почему все эти косые черты?

\   →  \\       // Escapes a single slash for the regex
\\  →  \\\\     // Escapes both regex-escaped slashes for the String
"   →  \"       // Escapes a double-quote for the String
Кевин Круйссен
источник
1
Я не думаю, что вам нужно убегать "в классе символов регулярных выражений, поэтому \\\\\"(пять обратных косых черт) должны быть в порядке.
Линн
2

Недогрузка , 11 байт

(a(S)*)~^^S

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

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

MegaTom
источник
1

QuadR , 8 байт

Простой перевод ответа ngn .

Принимает в nкачестве аргумента и в sкачестве ввода.

^|'|$
'&

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

PCRE R заменяет все экземпляры

^|'|$ Начало строки ИЛИ Цитата ИЛИ Конец строки

'& с цитатой и весь матч

Аргумент указывает, сколько раз повторить преобразование.

Адам
источник
ах, теперь я знаю, для чего этот язык :)
ngn
1

R , 62 байта

f=function(n,s){"if"(n,{formals(f)$n=n-1;formals(f)$s=s;f},s)}

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

Назовите это так: f(n,s)следуют nкопии()

Именованная функция; возвращает анонимную функцию. Все, что он делает, это изменяет значения по умолчанию для formalsof f, позволяя вызывать результирующую функцию (и затем результат этого вызванного, ntimes). когда nдостигает 0, он возвращается s.

R на самом деле не так уж плох в побеге! Он использует экранирование в стиле C, так что вам просто нужно взять ввод, заменить "на \"и \с \\, а затем обернуть все это " ".

Giuseppe
источник
0

Pyth, 21 байт

L++NsXbJ,N\\+L\\JNyFz

Попробуй это здесь.

К сожалению, рекурсивная функция (не полная программа, как указано выше) длиннее (24 байта):

M?GgtG++NsXHJ,N\\+L\\JNH
Эрик Outgolfer
источник
0

Рубин , 34 байта

%pявляется специфичным для Ruby флагом printf, который получает inspectзначение своего аргумента, аналогично %rPython. $><<означает печать.

f=->n,s{"$><<%p"%(n>1?f[n-1,s]:s)}

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

Значение чернил
источник
0

Excel VBA (32-разрядная версия), 67 байт

Версия ограничена 32-битным Excel VBA, потому что 2^iоценивается без ошибок в 32-битном VBA, но не в 64-битном VBA

Функция анонимного непосредственного окна VBE, которая принимает входные данные nи данные sиз диапазонов[A1] и [B1]выводит анонимную функцию, которая при оценке вплоть до только терминала (после nитераций) выводит только sкак этот терминал

For i=0To[A1-1]:q=q+"?"+String(2^i,34):Next:?q[B1]Replace(q,"?","")

Пример ввода / вывода

[A1:B1]=Array(7, "PPCG")
For i=0To[A1-1]:q=q+"?"+String(2^i,34):Next:?q[B1]Replace(q,"?","")
?"?""?""""?""""""""?""""""""""""""""?""""""""""""""""""""""""""""""""?""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""PPCG"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
?"?""?""""?""""""""?""""""""""""""""?""""""""""""""""""""""""""""""""PPCG"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
?"?""?""""?""""""""?""""""""""""""""PPCG"""""""""""""""""""""""""""""""
?"?""?""""?""""""""PPCG"""""""""""""""
?"?""?""""PPCG"""""""
?"?""PPCG"""
?"PPCG"
PPCG
Тейлор Скотт
источник