코드의 첫 N자를 인쇄하십시오


21

양의 정수 N를 입력으로 받아 N코드 의 첫 문자를 인쇄 하는 프로그램이나 함수를 작성해야 합니다. 경우 N당신이 주기적으로 출력에게 코드를 계속해야 코드의 길이보다 더 크다.

어떤 방식 으로든 소스 코드를 읽거나 파일, stdio 등에서 읽을 수 없습니다.

(코드가 있다고 가정 yourcode)

입력 => 출력 :

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

설명

프로그램의 길이는 1 바이트 이상이어야합니다.


15
2000 번째 코드 골프 챌린지를 게시 한 것을 축하합니다! :)
Martin Ender

3
Douglas Hofstadter 는 이것을 좋아할 것입니다!
Luis Mendo

1
@ MartinBüttner 실제로, 삭제 된 [code-golf] 질문이 300 개가 넘습니다. 그러나 충분히 가까이;)
Doorknob

11
@ MartinBüttner 감사합니다. 라운드 번호까지 48 만 남았습니다!
randomra

5
빈 프로그램이 유효하지 않다고 명시 적으로 언급했을 때가 있습니까?
Martin Ender

답변:



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입력 문자로 읽지 만> <> 문자는 기본적으로 정수입니다. 첫 번째 프로그램에서는 iSTDIN의 숫자 문자열을 정수로 변환하는 루프로 바뀝니다.

그런 다음 다음 루프를 실행하여 첫 번째 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

파이썬 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

자바 스크립트 (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
.repeat순환 요구 사항에 대해 ES6 대신 재귀를 사용하는 것은 단순히 천재적이었습니다.
Jacob

1
실제로, 사용 repeat()하면 무리를 줄일 수 있었기 때문에 대신 사용했습니다.
Scimonster

그것을 보지 못했습니다. 어쨌든-이것은 아주 좋은 대답입니다
Jacob

/39+1? 왜 충분히 긴 끈을 남겨 두지 않겠습니까?
l4m2

1
q=n=>('q='+q).repeat(n).slice(0,n)파이어 폭스에서 잘 작동
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 의 이항 연산자는 오른쪽 인수에서 왼쪽에 지정된 치수에 맞게 항목을 주기적으로 가져옵니다. 차원이 단일 숫자 인 경우 간단한 1D 문자 목록이므로 질문에서 요구하는대로 정확하게 수행합니다.

tryj.tk 에서 직접 사용해보십시오 .


quote동사 의 일반적인 목적은 무엇입니까 ?
randomra

@randomra 표준 라이브러리의 정의는 ''''&,@(,&'''')@(#~ >:@(=&''''))영어 또는 "영어로"모든 '문자를 두 배로 한 다음 시작과 끝에 하나 추가 "입니다. J는 Ada와 같은 문자열 리터럴을 사용하므로 문자열을 이스케이프합니다.
algorithmshark

4

k2-7 자

{x#$_f}

영어에서 이것은 x" xtake string self" 라는 정의를 가진 인수를 가진 함수입니다 .

  • self (명사 _f)는 현재 실행중인 가장 안쪽 함수입니다. 여기 기능 {x#$_f}입니다.
  • String (monadic $)은 인수를 문자열로 변환합니다. 함수의 경우 함수의 원래 정의로 문자열을 만듭니다.
  • Take (dyadic #)는 왼쪽 -arg 항목을 right-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

동일한 Lambda 버전은 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*''.
Martin Ender

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

@undergroundmonorail 다른 방법으로, 감사합니다
Martin Ender

3

MATLAB, 319141

나는 원래 바이트에서 몇 바이트를 짜낼 수 있었다.

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

좋은 대답 ...! 그것이 어떻게 작동하는지 전혀 모른다 :-)
Luis Mendo

3

자바 스크립트, 34 바이트

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

코드 n시간 을 반복 한 다음 결과를 슬라이스하는 재귀 함수 .


3

Japt , 2 바이트

îî

온라인으로 사용해보십시오!

첫 번째 î는 하나의 매개 변수를 사용하여 length로 반복하는 숫자 방법입니다 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
단순함이 아름답습니다!
Shaggy

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

2

MATLAB (57)

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

마지막 줄 의 초기 1인덱스 (대신 0)는 Matlab의 함수 type가 초기 줄 바꿈을 도입 하기 때문에 제거해야하기 때문입니다. 수정 (마지막 색인)과 제안 ( nnz보다 짧은 )에 대해 Dennis에게 감사합니다 numel.


이것이 내가 기대하는 것 (f (4)는 'fun'을 반환)을하지 않는 것을 두려워합니다. 좋은 소식은 2 문자를 저장하여 해결할 수 있다는 것입니다. (을 제거하십시오 -1). - 당신은 또한 밖으로 두 번째 줄 바꿈과 스왑 제거 할 수 있다고 생각 numel를 들어 nnz.
Dennis Jaheruddin

@Dennis이 두 가지 아이디어에 감사드립니다! 나는 두 가지를 통합하기 위해 편집했다
Luis Mendo

흠, 나는 버즈 킬하고 싶지 않지만 type f요구 사항과 충돌 하지는 않습니다. 어떻게 든 소스 코드를 읽고 파일, stdio 등에서 읽는 것은 허용되지 않습니까?
knedlsepp

@knedlsepp 당신이 옳다고 생각합니다. 나도 그 의심을했다. type아마 하드 디스크에 액세스합니다. 답을 삭제해야한다고 생각하십니까?
Luis Mendo

@LuisMendo : 나는 누군가가 정말로 마음을 생각하지 않습니다. :-) 나는 이미 몇 번 전에 이와 비슷한 quine을 생성하지 못했기 때문에 어제이 문제를 해결하고 싶었습니다. 물론 Matlab 솔루션이 있는지 확인해야했습니다. :-) 결국 이것은 나에게 이것으로 깊이 파고 들어 마침내 해결책을 만들 수있는 충분한 동기를 주었다. (나는 mod색인 생성 아이디어를 훔쳤다 .)
knedlsepp

2

단항 (1-8 버전) , 23855 바이트

입력을 '1의 단항으로 취하고 코드는 23855'1 '( ,[.,])입니다.


1
이것도 무엇을 번역합니까?
DJMcMayhem

@DJMcMayhem 고양이입니다
l4m2

이제 단항 입력이 의미가있는 언어를 찾고 일부 1 문자 프로그램은 고양이를 수행합니다
l4m2

2

apt , 40 28 바이트


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

처음으로 퀴네를 쓰면 아마 약간 단축 될 수 있습니다. 다른 한편으로, 나는 그것이 전혀 효과가 없다는 것을 매우 기쁘게 생각합니다.

의도적으로 줄 바꿈을 이끄는 두 번째 줄은 데이터이며 나머지 줄은 데이터를 풀고 입력과 같은 길이에 도달 할 때까지 전체 결과 문자열을 반복합니다.

Oliver 덕분에 무려 12 바이트를 줄 였습니다.

온라인으로 사용해보십시오!


니스 :) 당신은 대체 할 수 있고 대신 tTU에 그것을 앞으로 이동 하여 대신 ¯U사용할 수 있습니다 : 온라인 사용해보십시오îp
Oliver

두 번째 생각에, 나는 당신이 그것을 슬라이스해야한다고 생각하지 않습니다. îR+Q+V+Q+R+V잘 작동합니다.
Oliver

@Oliver 아, 그것은 영리 î합니다. 몰랐습니다 . 매우 편리합니다. 고마워요!
Nit

나는 quines 너무 좋은 아니에요 중 하나를하지만 난 생각 24 바이트 작동합니다.
Shaggy

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;}

설명 외에도 이스케이프 문자에서 다른 모든 문자가 인쇄되어 있습니다. 주요 방법은 문자열 내부에 있으며 기본 내부에는 전체 문자열이 빌드되어 표준 출력으로 인쇄됩니다.



1

Hoon , 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문자 를 반환하십시오 .

Hoon의 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

이것이 무슨 언어 지 ? 어떤 링크? 사양? 설명 ..
최적화

@Optimizer 아, 맞아. 나는 그것을 잊었다. 코드 골프를 위해 설계 한 언어입니다. 이것은 마침내 (모든 버그를 수정하면) 실제로 이길 수있는 도전입니다.
KSFT

1
또한 내가 볼 수있는 한, 언어는 10 분 전에 만들어 졌으므로 기술적으로 이것은 경쟁이 아닌 대답입니다. :). 또한 이것이 코드에 해당하는 블록 이라고 가정합니다. 파일은 전체 파일에 다른 유니 코드 기반 코드 블록이 없기 때문에이 과제를 위해 특별히 수행 된 것처럼 보입니다.
Optimizer

@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)루프 ceil(n/176)시간, 여기서 176소스 코드의 길이입니다.
  • s+=s;소스 코드 String의 크기를 기하 급수적으로 증가시킵니다. ( ab된다 abab; abab된다 abababab; abababab된다 abababababababab; 등)
  • s.subtring(0,n);n문자열 의 첫 문자를 사용합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.