Роздрукуйте перші 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, щоб пройти до круглого номера!
randomra

5
Можливо, саме час ви чітко згадали, що порожні програми недійсні?
Мартін Ендер

Відповіді:



10

> <> , 49 байт

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

Половина коду - це перетворення вводу з рядка в int. Якщо нам дозволяється використовувати кодову точку одного знака, прочитаного з STDIN, тоді ця програма буде набагато коротшою на 21 байт:

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

Пояснення

Я буду використовувати другу програму для пояснення.

'починається синтаксичний розбір, проштовхуючи кожну таблицю, доки не знайдеться кінцева цитата. Оскільки в решті рядка немає жодної 'лапки, кожна гра, крім початкової ', висувається на стек.

Але> <> - це тороїдальна 2D мова, тому після закінчення рядка вказівник повертається до початку, натискаючи 'знову і зупиняє розбір рядків. Результат полягає в тому, що ми просунули все необхідне, крім початкової цитати, а саме

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

Життя protip: не виконуйте 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 char

Бере єдиний цілий цілий аргумент і виплетає рядок.

($],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 циклічно бере елементи з правого аргументу, щоб відповідати розмірам, зазначеним зліва. Коли параметр - це одне число, це простий 1D список символів, тому ми робимо саме те, що задає питання.

Спробуйте самі на tryj.tk .


Яке загальне призначення quoteдієслова?
randomra

@randomra Її визначення в стандартній бібліотеці ''''&,@(,&'''')@(#~ >:@(=&''''))або англійською мовою "подвійно будь-які 'символи, потім додайте їх до початку та кінця". J використовує Ada-подібні літеральні рядки, тому це уникає рядка.
Алгоритм

4

k2 - 7 char

{x#$_f}

В англійській мові це функція з аргументом x, визначення якого - " xвзяти рядок".

  • Я (іменник _f) - це найпотужніша в даний час функція, що виконує. Ось це і функція {x#$_f}.
  • Рядок (monadic $) перетворює свій аргумент у рядок. У випадку функції вона створює рядок з початковим визначенням функції.
  • Take (dyadic #) бере ліві аргументи з списку в правий-arg . У випадку з рядком елементи є символами, тому це робиться саме те, що ми хочемо.

У Коні з відкритим кодом це не вийде , оскільки, здається, створюються чорні діри, які їдять усі спроби використовувати їх як аргументи до чого-небудь. Я не впевнений у належній семантиці 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)*''"
Вентеро,

3

Математика, 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) повертається "весело"), хороша новина полягає в тому, що ви можете виправити це, зберігаючи 2 символи. (видалити -1). - Я думаю , ви також можете видалити другий рядок і вивантажити numelдля nnz.
Денніс Джахеруддін

@Dennis Дякую за ці дві ідеї! Я редагував, щоб включити обидва
Луїс Мендо,

Гм, я не хочу бути buzzkill, але чи type fчастина конфлікту з вимогою Читання вихідного коду будь-яким способом і читання з файлу, stdio тощо не дозволяється ?
knedlsepp

@knedlsepp Я думаю, ти маєш рацію. У мене була й така підозра. typeймовірно, доступ до жорсткого диска. Як ви вважаєте, я повинен зняти відповідь?
Луїс Мендо

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


2

Japt , 40 28 байт


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

Перший раз писав королеву, тож, напевно, це можна трохи скоротити. З іншого боку, я дуже щасливий, що я змусив його працювати взагалі.

Ведучий новий рядок навмисно, другий рядок - це дані, а решта він розгортає дані, потім повторює весь отриманий рядок до досягнення довжини, що дорівнює вхідному.

Поголили колосальних 12 байт завдяки Оліверу .

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


Nice :) ви можете замінити tTUз , ¯Uі ви можете використовувати îзамість pпереміщаючи його вперед: Спробуйте Інтернет
Олівер

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

@ Олівер О, це розумно, я не знав про îце, це дуже зручно. Дуже дякую!
Ніт

Я теж не дуже хороший з лайками, але я думаю, що це повинно працювати на 24 байти.
Кудлатий

1

C ++, 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;}

Пояснення Крім символу втечі, всі інші символи роздруковуються. Основний метод знаходиться всередині рядка s, а всередині основного повний рядок будується та друкується до 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

Так, я зрозумів це. Дякуємо за допомогу btw!
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

Гол> <> , 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

Яка мова це? Будь-які посилання? Спец? пояснення ..
Оптимізатор

@Optimizer Ага, правильно. Я про це забув. Це мова, яку я розробляв для коду гольфу. Це, нарешті, виклик, коли (якщо я виправити всі помилки) він насправді може перемогти.
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

-part:

  • var sМістить вихідний код відформатований.
  • %sвикористовується для введення цього рядка в себе за допомогою s.format(...).
  • %c, %1$cі 34використовуються для форматування подвійних лапок.
  • s.format(s,34,s) зводить це все разом.

Частина виклику:

  • for(int i=n;i>n;i/=176)loops ceil(n/176)times, де 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.