다른 프린터를 사용하여 1-15 인쇄


22

다재다능한 정수 프린터를 만드는 것은 훌륭하지만 모두 다른 숫자를 인쇄하는 단일 코드를 작성하는 것은 번거 롭습니다. 숫자를 출력하는 스크립트를 만드는 것이 쉽지 않습니까? 다음 숫자를 얻는 새로운 스크립트를 제공합니까?

도전:

단일 정수 N와 실행 코드 를 출력하는 코드를 작성하십시오 . 다음 코드 N+1와 출력 할 수있는 코드가 출력되어야 합니다 N+2. 에 도달 할 때까지이 경로를 계속하십시오 N = 15. (마지막 인쇄 번호는 15 여야합니다).

규칙 :

  • 입력이 없습니다 (입력이 비어 있다고 가정).
  • 전체 프로그램 또는 기능 또는 기타 편리한 형식이 허용됩니다.
  • 첫 번째 코드가 출력되어야합니다 1.
  • 선행 0을 출력 할 수 없습니다. 즉 당신은 인쇄 할 수 없습니다 01위해 1.
  • 출력 형식이어야합니다 N, Code_for_N+1. 출력은 쉼표와 단일 공백으로 구분됩니다. 에 대한 코드 N+1에는 따옴표가 없습니다. N , Code_for_N+1허용되지 않습니다 (쉼표 앞에 공백). 후행 줄 바꿈은 괜찮습니다.
  • 출력의 첫 문자는 숫자 여야합니다. (앞 공백이 없거나 ans = N).
  • 인쇄 된 숫자는 다음 코드의 일부가 아니어야합니다 (코드에는이 숫자가 포함될 수 있지만 출력 번호는 코드의 일부로 사용할 수 없습니다)
    • 예 :의 출력 N=2은 다음과 같습니다 2, printer 2.. 이 경우에 printer 2대한 코드입니다 N=3. 전체 출력 2, printer 2을 코드로 사용할 수 없습니다 N=3.
  • 스크립트는 다른 언어로되어있을 수 있습니다
  • 데이터 유형은 관련이 없지만 (숫자는 문자열 일 수 있음), 따옴표 (괄호, 괄호 등)로 둘러 쌀 수 없습니다.
  • 출력 된 코드가있는 경우 N=15인쇄하거나 STOP!(보너스 참조) 아무 것도 인쇄하지 않아야합니다 (공백이나 줄 바꿈도 포함하지 않음).
    • 에 대한 코드가 N=15충돌 할 수 없습니다 (그러나 STDERR로 출력하는 것은 정상입니다).
    • N=15인쇄용 출력 코드 16또는 기타 사항 (보너스 제외)의 경우 자격이 박탈됩니다 .
  • 내장 quine 연산자는 허용되지 않습니다.
  • 파일 시스템을 통해 소스 파일에 액세스 할 수 없습니다.

보너스:

15를 인쇄하는 코드가 " STOP!" 를 인쇄하는 코드도 생성하는 경우 -10 바이트

Python 구문을 사용한 예 : (이것은 1에서 15가 아닌 선택된 정수에 대해서만 작동합니다.)

N = 1
print "1, print 2"
1, print 2

---
N = 15
print 15
15

---
N = 15   (Qualifies for the -10 bytes bonus)
print "15, print 'STOP!'"
15, print 'STOP!'

print 'STOP!'
STOP!

----

N = 15   (Qualifies for the -10 bytes bonus)
print "15, disp('STOP!')"
15, disp('STOP!')        (disp('STOP!') outputs STOP! in MATLAB)

----
N = 15   (This one is not OK. The submission is disqualified)
print "15, print 16"
15, print 16

표준 골프 규칙이 적용됩니다! 바이트 단위의 가장 작은 코드 (N = 1)가 승리합니다!


그렇다면 f=>f+""무효가 될까요? ( f+""함수의 구성 코드를 반환합니다.)
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ 그것 없이는 작업을 수행하는 것이 가능
할까요

@nicael 적어도 js 답변에서 이미 완료되었습니다
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ ... 가능한 방식으로 : D
nicael

규칙이 혼란 스럽습니다. 비슷한 것을 출력 할 수 14, print(14+1)있습니까?
nyuszika7h

답변:


39

Pyth + ///, 15 바이트-10 = 5

pPt`S15", STOP!

이것은 시작 및 끝 브래킷을 제거하고 즉시 인쇄 한 다음 ", STOP!" 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, STOP!으로 Pyth에 range(1,15+1)인쇄합니다.

다음 열네 프로그램에 /// 직접 포함하지 않는 모든 프로그램을 출력하는 /또는 \. 그래서 두 번째 프로그램

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15

제공 2하고 세 번째 프로그램 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15. 두 번째 프로그램은 15, STOP!인쇄 15, STOP!되므로 마지막 프로그램은 그냥 STOP!입니다.


3
건방진. 나는 그것을 좋아한다. :)
Martin Ender 2016 년

cat언어로 간주 됩니까 ?
user253751

@immibis cat는 원시성 테스트를 수행하지 않으므로 아닙니다.
user48538

1
프로그램 # 2 이상도 PHP에서 작동합니다. :)
Ilmari Karonen

31

자바 스크립트, 131238-10 = 131228 바이트

순진한 접근법은 예상보다 나빴습니다. 가늠자로 나는 그것을 예상 했어야했다. 그러나 나는 그것을 어쨌든 공유 할 것이라고 생각했다. 여기에 전체 코드가 있습니다.

아이디어 : 반복적으로 이스케이프 및 추가 N-1, ...

alert("14,alert(\"15, alert(\\\"STOP!\\\")\")")

7
나는 이것이 PPCG 답변에서 가장 큰 역 슬래시라고 생각합니다.
lirtosiast

1
나는 이것을 위해 NP ++과 정규 표현식을 사용
했음을

19
하하,이 -10는 많은 도움이됩니다 : D
nicael

2
나는 순진한 87573 바이트 솔루션 을 만들었습니다 .
LegionMammal978

보너스없이 일부 바이트를 저장할 수 있습니다.
Rɪᴋᴇʀ

8

CJam, 26 25 24 바이트

1{", "2$)@"_~"](_F<@*}_~

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

후속 프로그램은 단순히 첫 번째 숫자가 증가합니다. 프로그램을 16 번 실행합니다.


또는 동일한 점수에 대한 보너스가있는 경우 :

1{", "\2$)_G<\@`+"_~"+"STOP!"`?}_~

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

후속 프로그램은 단순히 첫 번째 숫자가 증가합니다. 프로그램을 16 번 실행합니다.

보너스에 대한 대체 솔루션 :

1{", "\2$)Gmd@`+"_~"+"STOP!"`\?}_~

2
@FryAmTheEggman cjam.tryitonline.net/… 은 Base64를 사용하여 프로그램을 인코딩하므로 주석에 퍼머 링크를 게시하는 것이 좀 더 쉽습니다. </selfpromotion>
Dennis

@ 데니스 감사합니다, 그것은 약간의 두통이었다 : P 어쨌든 마틴 자신을 쓴 것 같습니다.
FryAmTheEggman

@FryAmTheEggman 링크를 본 후에 만 ​​제안 해 주셔서 감사합니다. ;)
Martin Ender 2016 년

7

자바 스크립트 (ES6), 62 61 바이트-10 보너스 = 51 점

_=>"1, "+(f=n=>`_=>"`+(n<16?n+`, "+(${f(n+1)})`:`STOP!"`))(2)

설명

자체 소스 코드를 읽지 않고 엄청나게 길지 않은 솔루션.

첫 번째 프로그램은 15 개의 다른 프로그램을 모두 구성하고 재귀 함수를 사용하여 서로 중첩시킵니다. 문자열 대신 함수 자체 (출력 중 문자열로 캐스트)를 중첩하여 백 슬래시 문제를 해결합니다.

_=>
  "1, "                // print the first number
  +(f=n=>`_=>"`+(      // f = recursive function for printing program N
    n<16?              // for programs 2 - 15:
      n+`, "+(${       // add N to the output of the nested function
        f(n+1)         // nest the code of program N + 1
      })`
    :`STOP!"`          // program 16 just outputs "STOP!" for the bonus
  ))(2)                // start from program 2

테스트


1
함수 본문을 얻는 JavaScript의 내장 기능을 사용하지 않는 경우 +1 (Quining을위한 회색 영역)
Aᴄʜᴇʀᴏɴғᴀɪʟ

2
@Callodacity "" + (n=>m)함수 본문을 얻는 것으로 어떻게 계산되지 n=>m않습니까?
Neil

@Neil 실제로 당신은 맞습니다-저는 프로그램 1 만 보았고 출력을
거치지 않았기

모든 백 슬래시는 어디로 갔습니까!?
국수

5

Matlab, 226212-10 = 202 바이트

@StewieGriffin 덕분에 몇 바이트 =)

'awFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)

첫 번째 부분은 두 번째 줄 (아래)을 나타내는 문자열이며 실제 코드는 9만큼 이동했습니다. Matlab에서 문자열은 문자로 채워진 행렬이므로 스칼라를 더하거나 빼면 쉬프트를 쉽게 수행 할 수 있습니다. 따라서 프로그램은 동일한 문자열 *과 동일한 문자열을 다시 인쇄하지만 코드를 이동시킵니다.

* 확실하지 않음 : 첫 번째 바이트는 매 반복마다 증가해야하는 카운터입니다.

끈이 달린 퀴인 트릭은 여기서 뻔뻔스럽게 도난당했습니다 .

'awFjw|Dro)w1:26B?G:>DwF0\}xy*0Dnu|nDwFdw~v;|}{1w1:26B?2505)05<B5w1:24:5w1;Cnwm25<B5>B5w1;Cnwm26B500fDnwmDmr|y1w2';
n=ans;if n(1)-96>15;n='Stop!';else;n=[num2str(n(1)-96),', ',39,n(1)+1,n(2:end),39,59,n(2:end)-9,''];end;disp(n)

콘솔에서 복사 된 시퀀스의 마지막 몇 줄은 다음과 같습니다.

>> 'mwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
13, 'nwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
>> 'nwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
14, 'owFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
>> 'owFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
15, 'pwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
>> 'pwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
STOP!

5

JavaScript, 50 47 44 42 44 * 바이트

a=_=>(x=1)+(x<15?", a="+a:"").replace(x,x+1)

그것은 자신의 몸을 추출하고 (그냥 a) 대체하는 기능입니다. 명시 적으로 quine 연산자가 아니지만 함수 본문에 JavaScript의 내장 기능을 가져 오는 경우 (잘못된 경우 대답을 제거합니다).

a=_=>(x=1)+(x<15?", a="+a:"").replace(x,x+1);
alert(a());

경우는 (나를 위해 그것을하지 않기 때문에), 당신은 예를 볼 수있다 임베디드 제대로 작동하지 않습니다 있습니다 .


*-스 니펫이없이 결과를 생성하는 것처럼 보이 a=므로 추가 호출이 불가능합니다.


1
"함수 본문을 가져 오기위한 내장 기능"은 quine 연산자와 어떻게 다릅니 까? 나는 그것이 유효하지 않다고 말하는 것이 아니라 그 차이점이 무엇인지 궁금합니다.
Stewie Griffin

나는 단지 하나에서 일하고 있었다. o_o 할 수 없습니까 .replace(x++,x)?
Conor O'Brien

3
@StewieGriffin quining을 위해 만들어진 것들 중 하나는 합법적 인 기능입니다.
Conor O'Brien

@Stewie 그러나 "quine operator"는 전체 프로그램을 반환해야하지만 내 예제에서는 quine을 만들 목적없이 함수를 검색합니다 (전체 프로그램 코드를 반환하는 내장 기능은 없습니다). 함수를 허용 했으므로 비슷 할 수 있으므로 궁금합니다.
nicael

합니까의 a=_=>(x=1)+(x<15?`, ${a}`:"").replace(x,x+1)작업?
Conor O'Brien

5

파이썬 2.7.10, 196 92-10 = 82 바이트

휘 !!! 재미있었습니다. 훨씬 짧아졌습니다. :피

n=1;a='n=%d;a=%r;print n,a%%(n+1,a)if n!=15else"STOP!"';print n,a%(n+1,a)if n!=15else"STOP!"

설명:

나는 이것으로 시작했다 :

a='a=%r;print a%%a';print a%a

그것은 단지 간단한 quine입니다. 카운터가 추가 된 것입니다.

n=1;a='n=%d;a=%r;print n,a%%(n+1,a)';print n,a%(n+1,a)

n처음에 인쇄되는 카운터 변수입니다. 그는 인쇄 할 때 그런 n=부분을, 그것을 대체 n+1에 대한%d . 그래서 여기에서 그것은 무한히 계산됩니다.

그리고 여기 최종 버전이 있습니다. 15에서 멈추는 if 절을 추가하고 "STOP!"을 인쇄합니다. 게다가.

n=1;a='n=%d;a=%r;print n,a%%(n+1,a)if n!=15else"STOP!"';print n,a%(n+1,a)if n!=15else"STOP!"

오래된 코드 :

a= ['if num==15:print"STOP!!!";exit()','print num','print"a=",a','print"num=",num+1', 'for s in a:print s']
num= 1
print num
if num==15:print"STOP!!!";exit()
print"a=",a
print"num=",num+1
for s in a:print s

절대 이길 수는 없지만 재미 있습니다. : P 지금은 아직 짧지 만 아직 기회는 없습니다. :피


와우. 이것이 멋지지만 설명을 추가 할 수 있습니까? 나는 무슨 일이 일어나고 있는지 전혀 모른다 : D
Sherlock9

@ Sherlock9 완료. 감사합니다.
Rɪᴋᴇʀ

이것을 대화 형 파이썬 2.7.6 세션에 잘라 붙여 넣으면 elses 앞에 공백이 없다고 불평합니다 .
eric jan

@eric 나는 파이썬 2.7.10을 사용하고 있으며 나를 위해 작동합니다 ...
Rɪᴋᴇʀ

3

파워 셸 (215-10)는 205 = 197 167 106 104 103 바이트

$d='$c=(,1*{2}).count;$d={0}{1}{0};(("$c, $d"-f[char]39,$d,($c+1)),$c)[$c-eq15]';"1, $d"-f[char]39,$d,2

(단 하나의 도구가 PowerShell 인 경우 모든 문제는 손톱처럼 보입니다. 잠깐만 ...)

기본적으로, 우리는 설정으로 시작 $dalmost-의 큰 늙은-긴 문자열로 동일 quine 원래의 코드. 출력은 1다음 $d의 형식 연산자 -f정확하게 채우기 {0}, {1}, {2}스탠드 - 인은 증가 {2}의 수가 ,1*{2}하나씩 시간 섹션.

,x*yPowerShell 의 작업은 y각각이 동일한 새 항목 배열을 만듭니다 x. 예를 ,2*3들어와 같습니다 @(2,2,2).

즉, 첫 번째 출력은 1, $c=(,1*2).length;$d=(etc...)이므로 두 번째 코드가 실행될 $c때 배열의 개수와 같 @(1,1)거나 2$c이됩니다. 이는 후속 실행에서 원본 코드의 변수로 사용되지 않습니다.

단순히 여부를 계산하여 15을 인쇄 할 때 정지 $c동등 15하고 배열로 인덱싱 0 번째 원소를 $c, $d상술 한 바와 같이, 다른 막이다 15. 따라서 $c15 일 때 출력 15되고 다른 것은 없습니다. "15, {0}STOP!{0}"-10의 가치가 너무 길기 때문에 5 자 길이 이므로 보너스를받을 수 없습니다 .

너비가 150보다 큰 PowerShell 터미널이 필요합니다. 또는 코드를 복사하여 붙여 넣을 때 추가 줄 바꿈 ( 터미널이 출력 줄 바꿈에 유용하게 삽입) 을 수동으로 제거 할 수 있습니다 . 또는 출력을 변수로 캡처 한 다음 해당 변수를 다시 실행하십시오. 기타.

편집 1- "STOP!"을 제거하여 일부 바이트를 저장했습니다. 말씨.
편집 2-Durr, 매번 .length를 사용하지 말고 한 번만 호출
Edit 3- Quine 일 필요는 없으므로 초기 실행이 훨씬 짧아 질 수 있습니다.
Edit 4-문자열 사용에서 다음으로 변경 계산할 배열로 $c2 바이트를 절약했습니다. 나는 이것이이 접근법에 거의 최적이라고 확신합니다.
편집 5-모딩 대신 동등성을 직접 계산하여 다른 바이트를 저장했습니다.


Windows 10 콘솔 창은 더 이상 출력 줄 바꿈을 복사하지 않습니다.
Neil

2

자바 스크립트, 79-10 = 69 바이트

s='STOP!';for(i=15;i;){s=i--+',alert("'+s.replace(/[\\"]/g,"\\$&")+'")'};alert(s)

Function.prototype.toString전혀 사용하지 않고 .



2

배치, 73 + 5-10 = 68 바이트

@set a=STOP!
@for /l %%a in (15,-1,1)do @set a=%%a, @echo !a!
@echo %a%

필요 CMD /V:ON나는 그 5 바이트를 추가 있도록.


2

Python 2.7, 107 자

재귀를 사용 하고 quine을 쓰지 않으면 서 많은 것을 구할 수 있다고 생각했지만 사실은 아니지만 충분하지는 않습니다. 승자는 아니지만 접근 방식이 재미 있다고 생각합니다.

나는 N = 4에 대한 문자열을 만들어 시작하여 \and "문자를 피했습니다 .

print "1, print \"2, print \\\"3, print \\\\\\\"4, print \\\\\\\\\\\\\\\"STOP!\\\\\\\\\\\\\\\"\\\\\\\"\\\"\""

그런 다음 재귀를 사용하여 시작 색인과 중지 색인을 기반 으로이 문자열을 만드는 람다 함수를 만들었습니다. 이거 야:

l=lambda n,m:str(n)+", print "+"\\"*(2**(n-1)-1)+"\""+l(n+1,m)+"\\"*(2**(n-1)-1)+"\"" if n<m else "STOP!"

다음과 같이 사용하십시오.

print l(1,15)

출력 : [32902 자, 처리하기에 너무 깁니다]

그래서, 내 kolmogorov 복잡성 접근이 그렇게 성공적이지 않은 것 같습니다 ;-)


2

SMBF , 28 바이트

\x10리터럴 바이트 (10 진수 값 16)를 나타냅니다. 정수는 정수 (바이트)로 출력됩니다. 첫 번째 문자 출력은 \x01입니다. 그런 다음 프로그램은 ","를 인쇄합니다. 자체 소스를 인쇄 할 때 +처음에 추가 를 인쇄합니다 .

+.<-<<.>.>[[<]>.[.>]<[-]], \x10

설명:

+.                                  Increment number and print
  <-                                Pre-decrement loop counter
    <<.>.>                          Print comma and space from own source
          [             ]           Only execute if loop counter != 0
           [<]>.                    Move to left of source, then print `+`
                [.>]                Print entire source.
                    <[-]            Zero out the loop counter so this program halts.
                         , \x10     The comma, space, and loop counter used earlier.
                                    Input is empty, so `,` doesn't do anything.

입력에 16 진 리터럴이 필요하므로 표준 인터프리터에서이를 실행할 수 없습니다. 16 진 출력이 제대로 작동하려면 특수 터미널이 필요합니다.


1

배쉬, 78 74 73-10 = 63 바이트 (예, 이길 수 없음)

p='if(($((++a>15))));then unset a p;fi;echo ${a-STOP\!}${p+, $p}';eval $p

늦게오고 있지만 bash가 시도되지 않은 것을 보았습니다. 첫 걸프 도전과 and 같은 퍼즐. 그들은 재미 있어요!

설명:

이것은 a1에서 15까지의 단계 unset와 함께 작동하기 때문에 작동합니다 p. 에 저장된 스크립트 pset"STOP!"인 경우 모두 인쇄합니다 . 그렇지 않으면. 는 처음 unset a이다 set는 산술 확장에 나타나기 때문에 0.


1

𝔼𝕊𝕄𝕚𝕟, 30 자 / 47 바이트 (비경쟁)

⟮a=1)+(a<ḏ?⬬+ⒸⅩ222+ᶈ0:⬯)ē(a,⧺a

Try it here (Firefox only).

마침내 𝔼𝕊𝕄𝕚𝕟에 대한 좋은 ol 'true quine을 찾았습니다.

설명

내가 사용한 진정한 quine은 다음과 같습니다. ⟮ⒸⅩ222+ᶈ0

내 대답에 보입니까? 잘만되면, 당신은 거기에서 확장 할 수있을 것입니다.


1

+ PHP, 19-10 = 10 바이트

ï_(. \,,,)\!POTS(,

1부터 15까지 세고 멈 춥니 다. TIO

통, 13 바이트

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