Распечатайте первые N символов вашего кода


21

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

Чтение вашего исходного кода любым способом и чтение из файла, stdio и т. Д. Запрещено.

Примеры

(при условии, что ваш код yourcode)

Вход => Выход:

5=> yourc
10=> yourcodeyo
22=>yourcodeyourcodeyour

осветление

Ваша программа должна быть длиной не менее 1 байта.


15
Поздравляем с объявлением 2000-го соревнования по коду! :)
Мартин Эндер


1
@ MartinBüttner На самом деле, есть более 300 удаленных [code-golf] вопросов. Но достаточно близко;)
Дверная ручка

11
@ MartinBüttner Спасибо. Осталось 48, пока не выйдет круглое число!
Рандора

5
Может быть, пришло время явно упомянуть, что пустые программы недействительны?
Мартин Эндер

Ответы:



10

> <> , 49 байтов

'3d*}r0ff+0i:&0(?.~~a*&"0"-+60.&~:?!;1-&:o}&" "0.

Половина кода преобразует входные данные из строки в int. Если нам разрешено использовать кодовую точку одиночного символа, считанного из STDIN, то эта программа будет намного короче на 21 байт:

'3d*}ri:?!;1-&:o}&60.

объяснение

Я буду использовать вторую программу для объяснения.

'начинает анализ строки, нажимая каждый символ, пока не будет найдена заключительная кавычка. Поскольку остальная часть строки не имеет 'кавычек, каждый символ, кроме начального ', помещается в стек.

Но> <> - это тороидальный двумерный язык, поэтому после окончания строки указатель инструкции возвращается к началу, 'снова нажимает на клавишу и останавливает синтаксический анализ строки. В результате мы выдвинули все необходимое, кроме первоначальной цитаты, а именно

3d*}ri:0=?;1-&:o}&60.

'ASCII 39, поэтому мы нажимаем начальную кавычку нажатием 3d* = 3*13 = 39. Затем мы сдвигаем стек вправо ( }) и наоборот ( r), давая:

.06&}o:&-1;?=0:ir}*d3'

Теперь мы все готовы начать печатать. iчитает в символ ввода, но> <> символы в основном целые числа. В первой программе iсимвол заменяется циклом, который преобразует цепочку цифр из STDIN в целое число.

Затем мы выполняем следующий цикл, чтобы распечатать первые N символов:

:?!;               If the top of the stack (N) is 0, then terminate
                   Otherwise...
1-                 Subtract 1 from N
&                  Move N to the register temporarily
:o                 Output the next char in the program
}                  Shift the stack right
&                  Put N back on the stack
60.                Repeat loop by jumping back to the first :

9

CJam, 34 17 16 байтов

Это может быть много в гольф ..

{`"_~"+ri_@*<}_~

Расширение кода :

{`"_~"+ri_@*<}_~
{            }_~      "Put this code block on stack, take a copy and execute the copy";
 `                    "When executed, this block will the top element on stack to a string";
  "_~"                "Then put this string on stack";
      +               "Concat it to the the previous string on stack which ` created";
       ri             "Read an integer from STDIN";
         _@           "Copy the integer and put the concatinated string on top of stack";
           *          "Repeat the string input number of times";
            <         "Take the first input number of characters from the repeated string";

Наконец, все, что в стеке, распечатывается в STDOUT автоматически

Попробуйте онлайн здесь


5

Python 2, 117 байт

b=input();a=lambda x:(b*(2*(x+chr(34))+')'))[:b];print a("b=input();a=lambda x:(b*(2*(x+chr(34))+')'))[:b];print a(")

Подсказка жизни: не казни list(itertools.cycle(x)). По какой-то причине я не могу себе представить, почему, это сбивает переводчика.


1
itertools.cycle()является бесконечным генератором, поэтому, если ваш компьютер не имеет бесконечной памяти, у вас будут проблемы :)
Sp3000

5

JavaScript (ES6), 65 52 50 47 41 39

q=n=>('q='+q).repeat(n/39+1).slice(0,n)

Использует ES6 repeat()для клонирования кода, а затем срезает . Использует жестко закодированную длину.


Старая версия (50):

q=n=>n>(l=(t='q='+q).length)?t+q(n-l):t.slice(0,n)

Создает функцию q, принимая один параметр.

Он преобразует в строку текст функции и рекурсивно вызывает функцию, если nее длина превышает длину текста. В противном случае он возвращает подстроку текста.

Версия не ES6 (65):

function q(n){return t=q+'',l=t.length,n>l?t+q(n-l):t.slice(0,n)}

1
использование рекурсии, а не ES6 .repeat, для циклических требований было просто гениально.
Джейкоб

1
На самом деле, похоже, что с помощью repeat()позволил мне сократить его кучу, поэтому я использовал это вместо.
Scimonster

Не видел этого Во всяком случае - это очень хороший ответ
Джейкоб

почему то /39+1? почему бы просто не оставить достаточно длинную строку?
l4m2

1
q=n=>('q='+q).repeat(n).slice(0,n)отлично работает на firefox
l4m2

5

J - 24 символа

Принимает один положительный целочисленный аргумент и выплевывает строку.

($],quote)&'($],quote)&'

У J нет никаких уловок самореференции, поэтому мы просто делаем это в духе Куайн. Объяснил взрывом:

  ],quote                 NB. right arg prepended to quotation of right arg (quine)
 $                        NB. cyclically take left-arg characters from that
(        )&'($],quote)&'  NB. preload right arg with  ($],quote)&

Диадический $оператор в J циклически берет элементы из своего правого аргумента, чтобы соответствовать размерам, указанным слева. Когда измерение представляет собой одно число, это простой одномерный список символов, поэтому мы делаем именно то, что задает вопрос.

Попробуйте сами на tryj.tk .


Какова основная цель quoteглагола?
Рандомра

@randomra Его определение в стандартной библиотеке ''''&,@(,&'''')@(#~ >:@(=&'''')), или на английском языке, «удваивает любые 'символы, затем добавляет один в начало и конец». J использует Ada-подобные строковые литералы, так что это экранирует строку.
алгоритмическая

4

k2 - 7 символов

{x#$_f}

В английском языке это функция с аргументом, xчье определение " xtake string self".

  • Self (существительное _f) является самой внутренней выполняемой в настоящее время функцией. Вот это функция {x#$_f}.
  • String (monadic $) преобразует свой аргумент в строку. В случае функции она создает строку с исходным определением функции.
  • Take (dyadic #) принимает левые элементы из списка в правом аргументе . В случае строки элементы являются символами, поэтому мы делаем именно то, что нам нужно.

Это не будет работать в Kona с открытым исходным кодом, потому что кажется, что он создает черные дыры, которые поглощают все попытки использовать их в качестве аргументов для чего-либо. Я не уверен в правильной семантике k3, но они, вероятно, не намного добрее.

В Q это {x#string .z.s}и в k4 {x#2_$.z.s}. Мы должны использовать, 2_чтобы отбросить два начальных символа в k4, по причинам, которые может любить только мать.


3

Рубин, 66 64 63 байта

eval s=%q(puts"eval s=%q(#{s})".chars.cycle.take(gets.to_i)*'')

То же самое с использованием функции, позволяющей избежать вызова, getsнемного длиннее (81 байт):

def f(i);eval s=%q(puts"def f(i);eval s=%q(#{s});end".chars.cycle.take(i)*'');end

Лямбда-версии одинаковы по 69 и 65 байт:

l=->i{eval s=%q(puts"l=->i{eval s=%q(#{s})}".chars.cycle.take(i)*'')}
->i{eval s=%q(puts"->i{eval s=%q(#{s})}".chars.cycle.take(i)*'')}

1
.cycleаккуратно, я должен помнить это. :) Вы, вероятно, можете сократить .joinдо *''.
Мартин Эндер

Вы можете сохранить несколько символов, используя String#formatвместо интерполяции:eval s="$><<('eval s=%p'%s).chars.cycle.take(gets.to_i)*''"
Ventero

3

Mathematica, 65 байт

Print[StringTake[StringJoin @@ Table[ToString[#0], {#1}], #1]] & 

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

Print[StringTake[StringJoin @@ Table[ToString[#0], {#1}], #1]] & [75]

какие отпечатки

Print[StringTake[StringJoin @@ Table[ToString[#0], {#1}], #1]] & Print[Stri

К сожалению, применение ToStringк функции не уступает в точности так , как вы ввели функцию, поэтому я не могу сократить это путем удаления пробелов, сокращения #1до #или используя префикс нотацию для вызова функции.


«сокращение #до #1»?
подземный

@undergroundmonorail наоборот, спасибо
Мартин Эндер

3

MATLAB, 319 141 символов

Мне удалось выжать несколько байтов из исходного:

function d=g(n);d='gvodujpo!e>h)o*<e>(<e>\e)2;2:*.2-e-e)2:;foe*.2^<e>e)2,npe)1;o.2-252**<';d=[d(1:19)-1,d,d(19:end)-1];d=d(1+mod(0:n-1,141));

Отличный ответ ...! Понятия не имею, как это работает :-)
Луис Мендо

3

JavaScript, 34 байта

f=n=>n&&('f='+f+f(n-1)).slice(0,n)

Рекурсивная функция, которая повторяет код nраз, а затем разрезает результат.


3

Japt , 2 байта

îî

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

Первый î- это числовой метод, который принимает один параметр и повторяет его до длины n. Потому что это первый метод, nстановится входом. Второй îбросается в строку и повторяется.

Это переносится на:

n.î("î")-> Повторите, "î"пока не достигнет длиныn

8-байтовое решение

îQi"îQi"

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

îQi"îQi" переносится в n.î(Qi"îQi")

n.î(Qi"îQi")
      "îQi"    // String "îQi"          -> îQi
    Qi         // Insert "              -> îQi"
n.î            // Repeated to length n  -> îQi"îQi"îQi"  (n=12)

1
Прекрасна в своей простоте!
Лохматый

2

R 203 байта

Когда N = 203, код полностью печатает сам.

(f <- function(N){
str <- paste0("(f <- function(N)", paste0(as.character(body(f)), collapse = "\n"), ")}(", N, ")")
cat(rep(str, floor(N/nchar(str))), sep = "")
cat(substr(str, 1, N%%nchar(str)))})(203)

Когда N = 50, код обрезается.

(f <- function(N){
str <- paste0("(f <- function(N

Когда N = 300, код частично повторяется.

(f <- function(N){
str <- paste0("(f <- function(N)", paste0(as.character(body(f)), collapse = "\n"), ")}(", N, ")")
cat(rep(str, floor(N/nchar(str))), sep = "")
cat(substr(str, 1, N%%nchar(str))))}(300)(f <- function(N){
str <- paste0("(f <- function(N)", paste0(as.character(body(f)), collapse = "\

Попробуйте:(f=function(N){s=paste0("(f=",paste0(capture.output(f),collapse=""),")");cat(rep(s,N%/%nchar(s)),substr(s,1,N%%nchar(s)),sep="")})(200)
Томас

2

Матлаб (57)

function s=f(n);s=evalc('type f');s=s(mod(1:n,nnz(s))+1);

Начальный 1индекс (вместо 0) в последней строке объясняется тем, что функция Matlab typeвводит начальный перевод строки, который следует удалить. Спасибо Деннису за его исправление (последний индекс) и за его предложение ( nnzкорочеnumel ).


Боюсь, что это не соответствует ожиданиям (f (4) возвращает fun), хорошая новость в том, что вы можете исправить это, сохранив 2 символа. (удалить -1). - Я думаю , вы также можете удалить вторую строку и выгрузить numelдля nnz.
Деннис Джаэруддин

@Dennis Спасибо за эти две идеи! Я отредактировал, чтобы включить оба
Луис Мендо

Хм, я не хочу быть в моде, но разве type fчасть не противоречит требованию Чтение вашего исходного кода каким-либо образом и чтение из файла, stdio и т. Д. Запрещено ?
knedlsepp

@knedlsepp Я думаю, что вы правы. У меня тоже было это подозрение. typeвероятно, получает доступ к жесткому диску. Как вы думаете, я должен удалить ответ?
Луис Мендо

@ LuisMendo: я не думаю, что кто-то действительно возражает. :-) Я просто хотел вчера разрешить эту проблему, так как уже несколько раз не получал похожую на эту муку. И конечно я должен был проверить, было ли уже решение Matlab. :-) В конце концов, это дало мне достаточно мотивации, чтобы вникнуть в это достаточно глубоко, чтобы наконец-то найти решение. ( modМежду прочим, я украл твою -индексированную идею.)
knedlsepp

2

Унарный (1-8 версия) , 23855 байт

Принимает ввод как унарный из '1', а код 23855 '1 ( ,[.,])


1
Какой бред, это тоже переводит?
DJMcMayhem

@DJMcMayhem Это кошка
l4m2

Теперь найдите язык, в котором унарный ввод имеет смысл, и какая-нибудь 1-символьная программа делает cat
l4m2

2

Japt , 40 28 байт


"îR+Q+V+Q+R+V"
îR+Q+V+Q+R+V

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

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

Спасибо Оливеру за грандиозные 12 байтов .

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


Хорошо :) Вы можете заменить tTUна ¯Uи использовать îвместо p, переместив его вперед: Попробуйте онлайн
Oliver

Если подумать, я не думаю, что вам вообще нужно его нарезать. îR+Q+V+Q+R+Vдолжно работать просто отлично.
Оливер

@ Оливер О, это умно, я не знал î, это очень удобно. Большое спасибо!
Нить

Я не слишком хорош с квинами, но я думаю, что это должно работать на 24 байта.
Лохматый

1

С ++, 305

int L=305;string s="int main(){string t=\"string s=\";int n;cin>>n;t+=s;t+=\"\";\";t+=s;while(n>0){if(n>L){cout<<t;n-=L;}else{cout<<t.substr(0,n);}return 0;}";
int main(){string t="int L=305;string s=\"";int n;cin>>n;t+=s;t+="\";";t+=s;while(n>0){if(n>L){cout<<t;}else{cout<<t.substr(0,n);}n-=L;}return 0;}

Пояснение Кроме символа выхода все остальные символы выводятся на печать. Метод main находится внутри строки s, а внутри main строится полная строка и печатается в stdout


1

Pyth, 15 13 14 байтов

<jN*Q]"<jN*Q]"

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

Модифицированная версия стандартного Pyth Quine .


@ l4m2 Как так? Пожалуйста, объясните, я не вижу ничего плохого ...
hakr14

29 должно быть <jN*Q]"<jN*Q]<jN*Q]"<jN*Q]<jNне так?
l4m2

@ l4m2 Ага, верно. Я исправил это.
hakr14

<jN*Q]"<jN*Q]"кажется работа?
l4m2

Да, я понял это. Спасибо за помощь, кстати!
hakr14

1

Хун , 185 байт

=/(f "=/(f k |=(n=@ =+((trim 5 f) `tape`(scag n `tape`(zing (reap n :(weld p <f> (slag 1 q))))))))" |=(n=@ =+((trim 5 f) `tape`(scag n `tape`(zing (reap n :(weld p <f> (slag 1 q))))))))

Установите fкод программы в виде ленты, но с «k» для себя. Разбейте ленту на символ 5, устанавливая переменные [p=left q=right]. Соедините строки p, оригинальную строку fи все после первого символа q. Повторите эту строку nраз, а затем верните первые nсимволы.

Делать это было немного затруднено из-за того, что stdlib Хуна не имеет функции форматирования или поиска и замены ... Кроме того, я не уверен, зачем нам нужен еще один приведение после scag, так как он должен хранить информацию о типе. Такие вот дела.




1

Gol> <> , 12 байт

"r2ssIFLko|;

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

Как это устроено

"r2ssIFLko|;

"..."   Push the chars in reverse order
r2ss    Reverse the stack, then push `"`
IF...|  Input n, and repeat the following n times...
  L     Push the loop counter (0 to n-1)
   k    Pop x and copy x-th from the top
    o   Pop and print as char
;       Halt

k может оборачиваться любое количество раз, поэтому нам не нужно дублировать весь стек в зависимости от ввода.


1

SmileBASIC, 106 66 байт

INPUT N?MID$(("+CHR$(34))*3,23,N)INPUT N?MID$(("+CHR$(34))*N,23,N)

0

KSFTgolf - 4 символа , 6 байтов

KSFTgolf - язык, который я пытался разработать для гольф-кода. Я сильно изменил это, так что это, вероятно, не должно учитываться.

☃\@2

Что это за язык ? Есть ссылки? Спец? объяснение ..
Оптимизатор

@ Оптимизатор Ах, да. Я забыл об этом. Это язык, который я разрабатывал для гольф-кода. Это, наконец, проблема, где (если я исправлю все ошибки) он может действительно победить.
KSFT

1
Более того, насколько я вижу, язык был создан около 10 минут назад, так что технически это неконкурентный ответ :). Кроме того, я предполагаю, что это блок, соответствующий вашему коду, который полностью выглядит как что-то, что было специально сделано для этой задачи (поскольку во всем вашем файле нет других блоков кода на основе юникода).
Оптимизатор

@Optimizer Эта инструкция была на самом деле на языке раньше (хотя коммит, который слегка ее изменил, был опубликован после публикации запроса), который был создан несколько дней назад. Поскольку я не думаю, что это будет работать в той версии языка, которая была общедоступной, когда был опубликован вопрос, я не думаю, что этот ответ действительно должен учитываться, как я уже говорил в своем ответе.
KSFT

4
Ты хочешь построить снеговика?
flawr


0

J, 41 байт

Теперь это была головоломка!

((,quote,')$~'"_)'((,quote,'')$~''"_)')$~

Объяснение:

((,quote,')$~'"_)'((,quote,'')$~''"_)')$~  | Expression taking 1 argument
                                       $~  | Reshape left argument to fit right, taking cyclically.
(                                     )    | One large expression that evaluates to a string
                 '((,quote,'')$~''"_)'     | String literal containing the code to the left of it
 (,quote,'$)~'"_)                          | A 4-Hook:
         '$)~'"_                           | The string '$)~'
   quote,                                  | Appended to the quoted version of the string
  ,                                        | Appended to the raw string

Примеры:

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 10
((,quote,'

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 20
((,quote,')$~'"_)'((

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 30
((,quote,')$~'"_)'((,quote,'')

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 41
((,quote,')$~'"_)'((,quote,'')$~''"_)')$~

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 50
((,quote,')$~'"_)'((,quote,'')$~''"_)')$~((,quote,


0

Java 10, 193 176 байт

n->{var s="n->{var s=%c%s%1$c;s=s.format(s,34,s);for(int i=n;i>0;i/=176)s+=s;return s.substring(0,n);}";s=s.format(s,34,s);for(int i=n;i>0;i/=176)s+=s;return s.substring(0,n);}

Объяснение:

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

n->{                       // Method with integer parameter and String return-type
  var s="n->{var s=%c%s%1$c;s=s.format(s,34,s);for(int i=n;i>0;i/=176)s+=s;return s.substring(0,n);}";
                           //  Unformatted source code
  s=s.format(s,34,s);      //  Create the formatted quine
  for(int i=n;i>0;         //  Loop `i` as long as it's not 0
      ;                    //    After every iteration:
       i/=176)             //     int-divide `i` by the hardcoded length of the source code
    s+=s;                  //   Exponentially enlarge the source code
  return s.substring(0,n);}//  Return the first `n` characters of the source code

-часть:

  • var sСодержит исходный код отформатирован.
  • %s используется для ввода этой строки в себя с s.format(...) .
  • %c, %1$cИ34 используются для форматирования двойных кавычек.
  • s.format(s,34,s) складывает все это вместе.

Задание часть:

  • for(int i=n;i>n;i/=176)петли ceil(n/176)раз, где176 длина исходного кода.
  • s+=s;экспоненциально увеличивает размер исходного кода String. ( abстановится abab; ababстановится abababab; ababababстановитсяabababababababab ; и т. д.)
  • s.subtring(0,n);принимает первые nсимволы строки.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.