* any * 문자열을 인쇄하기위한 프로그램 템플릿


40

다음 속성을 가진 프로그램을 작성하십시오.

  • 있는 그대로 실행하면 프로그램은 출력을 생성하지 않습니다 (예 : 0 바이트 출력).

  • 프로그램 내 위치가 (당신의 선택은 : 그것은 시작, 끝, 또는 중간에 어딘가에 수) 다음과 같은 속성 : 배치를 통해 프로그램을 수정하는 모든 문자열하는 경우 해당 문자열을 인쇄 결과 프로그램이 원인이됩니다 처형.

    문자열에 따옴표, 백 슬래시, 주석 표시, 구분 기호, NUL 바이트 등이 포함되어 있는지 여부에 관계없이 작동해야합니다. 어떤 위치에 있더라도 문자열은 여전히 ​​문자열로 해석되어 완전히 그대로 인쇄됩니다. 그러나 컴파일러가 메모리 부족 등을 초래할 경우 매우 긴 문자열을 처리하지 못할 수 있습니다 (정확히 말하면 적어도 1000 바이트까지 문자열을 처리 할 수 ​​있어야합니다. 프로그램 길이 중 더 긴 것).

잘못된 솔루션 의 예 는 다음과 같습니다.

print("");
#      ^ text goes here

Python, Perl, Ruby 등에서; 많은 문자열에서 작동하지만 큰 따옴표가 포함 된 문자열 또는 하위 문자열이 포함 된 문자열 \n(줄 바꿈으로 해석 됨)에는 작동하지 않습니다 .

이 문제는 대부분의 언어에서 불가능할 수 있습니다. 문제는 그것이 작동하는 언어를 찾는 것에 관한 것입니다. 선택한 언어는 이 사이트 정의에 따라 프로그래밍 언어 여야합니다 ( 예 : Text에 솔루션 제출 안함) .

이것이 이므로 가장 짧은 프로그램 템플릿이 승리합니다. 그러나 현재 우승자를 이길 수없는 경우에도 솔루션을 제출하지 마십시오! 여전히 2 위, 3 위 등을 놓고 경쟁하거나 가능한 한 많은 답변을 찾기 위해 경쟁 할 수 있습니다. 그러나 제출하기 전에 프로그램이 전체 사양을 충족하는지 확인해야합니다. 대략적인 해결책은 문제의 요점을 놓칠 것입니다.


관련 샌드 박스 게시물은 여기에 있습니다 .

삽입 된 문자열에 대해 지원해야하는 문자 범위를 명확하게 설명 할 수 있습니까? ASCII? ASCII + 인쇄 할 수 없습니까? 모든 유니 코드?
DJMcMayhem

3
모든 256 옥텟. 바이트 또는 유니 코드로 해석하는지 여부는 사용자에게 달려 있습니다. 인쇄 할 때 큰 차이가 없습니다.

1
질문의 의도 (및 현재 표현되는 방식)는 추가 출력을 가질 수 없다는 것입니다. 피할 수없는 솔루션을 염두에 두었습니까? (스트레이 출력을 피하기 위해 여분의 바이트를 사용하는 것이 스트레이 출력을 생성하고 사양을 준수하지 않는 것이 좋습니다.)

1
이 코드 변경이 필요하지 않은 경우, 그것은 사소한 것 AWK그냥 1그것을 할 것입니다.
Robert Benson

답변:


37

엑셀, 1 바이트

'

언 골프 버전

'        <-- print the following text,
             and exit the current formula

나는 이것이 줄 바꿈을 받아 들일 수 있다고 생각하지 않습니다.
Conor O'Brien 1

3
@ ConorO'Brien 그것은 shift + enter와 관련이 있습니다
Adam

2
@MrPaulch 이것은 많은 복고풍 공학이었습니다. 나는이 명령이 시스템 충돌과 같은 다른 알려지지 않은 기능을 숨기고 있다고 확신합니다.
Adam

1
이것은 OpenOffice Calc에서도 작동합니다. 셀을 형식으로 설정할 때 자동으로 사용됩니다 @.
Ismael Miguel

1
개인적으로 나는이 대답이 괜찮다고 생각합니다. @Dennis는 동일한 개념을 사용하는 Mathematica 게시물을 삭제했습니다. 엑셀의 프론트 엔드는 // // "" "///를 테스트 할 때 동사가 아닌 그대로의 문자열로 저장하므로이를 삭제해야합니다. <Row> <Cell> <Data ss : Type =" String "x : Ticked ="1 "> 테스트 // & quot; & quot; & quot; /// </ Data> </ Cell> </ Row>
Kelly Lowder

20

줄프, 6 바이트

a Lq6(

설명

a Lq6(
a       print
  L 6   all but the first 6 characters of
   q    the source code
     (  and exit

15

Perl 5 , 30 21 19 바이트

print <DATA> __ END__

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

후행 줄 바꿈. 이것은 Perl 기능을 사용하여 임의의 데이터를 소스 파일에 추가 한 다음 DATA파일 핸들을 통해 읽을 수 있습니다 . 에 파일 핸들을 인수로 줄 때 print,리스트 컨텍스트가 주어 지므로 파일 핸들이 파일에있는 모든 행의 목록을 반환하고, 줄 바꿈이 포함됩니다. 그런 다음 print암시 적으로 그것들을 모두 연결하여 줄로 나누기를 취소하고 줄 바꿈의 위치에 관계없이 정확한 원래 문자열을 제공합니다.

@Dada 덕분에 줄 바꿈을 수동으로 처리 할 필요가 없다는 것을 깨달았으며 @ninjalj와 @b_jonas는 각각 골프를 칠 수있는 인물을 발견했습니다.


2
나는 당신이 필요하다고 생각하지 않습니다 undef$/. 의 인수로 print, <DATA>그것은이 모든 라인을 읽어야하므로,리스트 컨텍스트에서 호출된다.
Dada

네가 옳아. 한 번에 한 줄씩 입력을 읽고 줄 구분 기호를 유지 한 다음 인쇄 할 때 모든 문자를 암시 적으로 연결하므로 처음에는 sl을 필요가 없습니다. 8 바이트 절약입니다. 나는 게시물을 고칠 것이다.

4
__END__대신 사용할 수 있습니다 __DATA__.
ninjalj

@ninjalj의 말과 함께 더 큼 기호 다음에 줄 바꿈을 생략 할 수 있습니다 (그러나 프로그램 끝에 줄 바꿈이 필요합니다).
b_jonas

14

Zsh, 6 바이트

<<'
'

후행 줄 바꿈이 있습니다. 문자열은 프로그램 끝에서 삽입됩니다.

세게 때리다, 20 17 바이트

3 바이트를 제거해 준 Adam 에게 감사 합니다.

exec sed 1d "$0"

* nix 쉘 스크립트, 21 14 바이트

7 바이트를 제거해 준 Adam 에게 감사 합니다.

#!/bin/sed 1d

1
@Copper 후행 줄 바꿈이 있습니다. 그 후에 문자열이 삽입됩니다.
jimmy23013

아, 알겠습니다 수정 해 주셔서 감사합니다.
구리

6/9 바이트 솔루션은 인터프리터의 버그를 악용하는 것처럼 보입니다 (물론 허용되지 않음). (AFAICT는 몇 가지 실험을 통해 줄에서 줄 바꿈을 찾고 있지만 줄은 줄 바꿈으로 나뉘어 정의되므로 줄 자체의 줄 바꿈은 절대 일어날 수 없습니다.) zsh해결책은 정확 해 보입니다. 그러나 9 바이트 bash솔루션이 잘못되었습니다 (파일에 줄 바꿈이 없으면 줄 바꿈이 추가됩니다).

@ ais523 나에게도 버그 인 것 같았다. 그리고 나는 그들이 통역사들에게 허락되는 것을 기대하지 않았습니다. Bash 솔루션을 제거했습니다.
jimmy23013

1
bash sed 1d대신에 대신 사용할 수 있습니다tail -n+2
Adam

13

brainfuck ( 읽을 수없는 Brainfuck ), 9 바이트

,+[-.,+]!

입력을 끝에 추가하십시오. 이번에는 후행 줄 바꿈이 없습니다.

프로그램의 끝에 추가 된 입력을 받아 들일 언어를 찾고있는 brainfuck은 별개의 가능성처럼 보였다. esolang으로 작성된 많은 brainfuck 통역사는 표준 입력에서 프로그램과 프로그램의 입력을 모두 취하므로 그들 사이에 말할 방법이 필요합니다. 이 경우 !문자가 프로그램과 입력을 구별 하는 규칙이 있습니다 ,[.,]!Hello, world!. 이것은 기본적으로 !정상과 다른 의미 의 다른 방언을 만듭니다 .

따라서 이론적으로 우리는 이러한 해석기 중 하나를 찾아서 cat사양을 충족시키기 위한 프로그램을 제공 할 수 있습니다. 그래도 큰 미묘함이 있습니다. brainfuck은 일반적으로 각 셀에 256 개의 값을 사용하고 256 옥텟이 있으며 하나는 EOF에 사용해야합니다. 따라서 문자 그대로 256 옥텟을 모두 에코하려면 EOF를 전혀 감지 할 수 없으므로 다른 방법으로 프로그램을 종료해야합니다. 다시 말해, 256 옥텟과 EOF 257에 다른 값을 주거나 EOF에서 충돌하는 구현을 찾아야합니다.

읽을 수 없음을 입력하십시오 . Unread에는이 도전을 앞두고 !; 다음에 입력을받는 brainfuck 인터프리터가 있습니다 . 또한 대부분의 brainfuck 인터프리터와 달리 bignum 셀과 EOF에 -1을 사용하여 EOF를 다른 256 개의 옥텟과 구별 할 수 있습니다. 따라서 Unreadable Brainfuck을 프로그램의 특정 인터프리터로 사용하면 catEOF = -1에서 중단 되는 brainfuck 프로그램을 작성하여 단 9 바이트만으로 문제를 해결할 수 있습니다 .

더 잘할 수 있습니까? 우리는 다음 7 바이트 프로그램을 시도해 볼 수 있는데 , 루프에서 빠져 나오기 전에 문자열 끝에 EOF 를 출력 하려고 시도합니다 .

+[,.+]!

이 프로그램의 동작은 오류 조건에 대한 읽을 수없는 인터프리터의 동작에 따라 다릅니다 (따라서 이는 brainfuck의 구현뿐만 아니라 brainfuck의 구현을 실행 하는 데 사용되는 구현에 의존합니다 ). 불행히도, 내가 사용하는 읽을 수없는 해석기는 표준 출력 에서 출력 오류를 발생시킵니다 .이 절약이 작동하지 않음을 의미합니다. EOF 출력 시도가 종료되거나 자동으로 시도를 건너 뛰는 읽을 수없는 인터프리터를 아는 사람이 있으면 알려주십시오. 그것은 바로 7 바이트 솔루션이 될 것입니다.


1
,[.,]!여기에서 작동 하며 6 바이트입니다 (표시된 상자를 선택하십시오 !). 또한 종료됩니다.
FinW

@FinW : 해당 웹 사이트에 NUL 바이트를 입력하는 방법을 알 수는 없지만 코드가 보이면 일찍 종료됩니다.

내가 그것을했을 때 NUL 바이트없이 잘 작동했습니다.
FinW

1
문자 그대로 ,(현재 테이프 요소에 대한 표준 입력 읽기) 뒤에 ](현재 테이프 요소가 0 인 경우 종료 루프)가 있습니다. 따라서 값이 0 인 입력 바이트 (예 : NUL)를 읽으면 루프가 중단됩니다.

그러나 인터프리터가 입력을 읽지 않으면 (예 :. 뒤에 문자열의 끝 !) 현재 테이프 요소를 0으로 자동 설정하여 루프를 종료합니다.
FinW

9

Dyalog APL , 11 바이트

다음은 함수 f 의 본문입니다 .

2↓⎕CR'f'⋄→

후행 줄 바꿈이 있으며 그 후에는 아무것도 삽입 될 수 있습니다.

2↓ 첫 두 줄 (헤더와이 줄)을

⎕CR'f'C haracter R 의 epresentation F

그때

떠나다


9

루비, 20 바이트

프린트 * DATA
__종료__

입력은 끝에서 시작합니다 (후행 줄 바꿈 후). DATA관용구는 루비 중 하나입니다 펄에서 훔친 .

eval.in에서 사용해보십시오 : https://eval.in/684370


1
그것은 그것을 훔 쳤을뿐만 아니라 더 짧습니다 ...
simbabque

9

자바 스크립트 + HTML5 DOM, 163 바이트

<html><body><script>fetch(location).then((r)=>r.text().then((t)=>console.log(t.slice(145,t.lastIndexOf("</b")))));document.body.remove()</script></body></html>

닫는 본문 태그 바로 앞에 원하는 것을 삽입 할 수 있습니다. 이것은 페이지 소스를 가져오고 여는 코드와 닫는 태그를 제거하여 작동합니다.

실제 키커는 무한 루프를 피하는 방법을 알아 냈습니다. while(true){}페이지를 넣으면 모든 콜백이 영구적으로 차단되어 실행이 중단되며 JavaScript는 기본 스레드를 일시 중지 할 방법이 없습니다. 그러나 더 이상 존재하지 않는 코드는 실행되지 않으므로 문서 본문은 마지막 명령에서 seppuku를 커밋하고 복제본이로드 될 때까지 자체를 삭제합니다.

네, 길고 둥글지만 JS에서 가능하다는 사실은 놀랍습니다.


1
Chrome은 최근 파서 차단 스크립트에 대해 모두 화가 났으며 그에 대해 불평합니다. 필자는 파서가 의도적 으로 인쇄 시도를 망칠 수 없도록 파서를 차단하는 아이디어를 좋아합니다 .

7

PHP, 46 바이트

(후행 줄 바꿈 포함)

<?=join([""]+file(__FILE__));halt_compiler();
STRING HERE

예 :이 file기능 조차도 이진 안전합니다.

[""]+ 0- 인덱스 (파일의 첫 줄)를 빈 문자열로 바꿉니다.



5

PHP 94 바이트

<?$f=fopen(__FILE__,'rb');fseek($f,93);while(false!==($c=fgetc($f)))echo$c;__halt_compiler();

마지막 세미콜론 뒤에 문자열을 배치하십시오.

모호한 기능이 있다고 생각하십니까? __halt_compiler ()는 이름에서 정확히 원하는 것을 수행합니다. 이전 코드는 파일을 열고 마지막 세미콜론 뒤의 바이트를 표준 출력에 씁니다. NUL, BEL 등이 잘 나옵니다. 유니 코드 리터럴 (♪)은 Windows에서 망쳐 져 있지만 유니 코드에서 실패하는 Windows cmd 일뿐입니다.


1) 94 바이트가 아닌 93 바이트를 셉니다. 2) false!==$c=...괄호가 필요하지 않습니다. 3) rb따옴표가 필요하지 않습니다. 4) 한 바이트를 절약 할 수 있습니다. for($f=fopen(...),fseek($f,88);false!==(...);)echo$c;5) 다른 두 바이트 더 짧은 :<?for($f=fopen(__FILE__,rb);false!==$s=fgets($f,86);)echo$i++?$s:"";__halt_compiler();
Titus

6) 및 두 번째 매개 변수를 생략 fgets하고 템플릿에 후행 줄 바꿈을 추가 하면 다른 두 바이트 .
Titus


3

PHP, 48 60 바이트

<?=substr(file_get_contents(__FILE__),60);__halt_compiler();STRING HERE

PHP를 닫아도 문자열이 포함되는 것을 막을 수 없다는 것을 알게되었습니다 <?.


닫는 괄호가 잘못되었습니다. 내 시도보다 훨씬 더 깔끔한 파일 덤프, substr ()은 null 바이트에서 질식 할 것이라고 생각했습니다.
ToXik-yogHurt

이것을 시도하십시오 : <?die(substr(file_get_contents(__FILE__),48))?>STRING HERE. 작동해야합니다. 나는 함께 노력했고 <?die('a')?>효과가 있었다.
이스마엘 미구엘

@IsmaelMiguel이 작동하지 않습니다. die매개 변수를 인쇄하지 않지만 종료 코드로 보냅니다. 그것은이어야한다 die(print ...).
Titus

@ ToXik-yogHurt 대부분의 문자열 함수는 이진 안전합니다. 조차 file. 사실 나는 현재 그런 생각을 할 수 없습니다.
Titus

@Titus Trydie('text');
Ismael Miguel

2

이진 람다 미적분 , 1 바이트

 [text goes here]

그것은 텍스트 앞의 단일 공백 ​​(0x20)입니다.

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

작동 원리

0x20 = 00100000 2 는 다음과 같이 파싱됩니다.

00    λx.
01        x
0000  (ignored, can be anything)

(실제로 모든 문자 !"#$%&\'()*+,-./가 동일하게 작동합니다.)

이것은 완전한 표현이기 때문에 프로그램의 나머지 부분은 입력 데이터로 해석되며 이진 람다 미적분학 I / O 규칙에서는 항등 함수 λ x 로 해석됩니다 . x 입력을 출력으로 직접 복사합니다.


관심이 없다면, 아이덴티티 함수와 삽입 사이의 후행 0 비트가 에코되지 않는 이유는 무엇입니까?

@ ais523 인터프리터는 한 번에 바이트를 읽고 λ x 한 번 읽습니다 . x 가 구문 분석되었으며 패딩이 이미 사용되었습니다.
Anders Kaseorg

2

배쉬, 17 바이트

tail -n+3 $0
exit
<string here>

jimmy23013의 답변 과 독립적으로 개발되었습니다 .


당신은 의미하지 $0않습니까? 그 외에도, 나는 그것이 효과가 있다고 생각합니다 (나는 후에 아무것도 해석하지 않는다는 것을 확인했습니다 exit).

@ ais523 고정! 감사.
noɥʇʎԀʎzɐɹƆ


1

Excel VBA, 6 바이트

이것은 주로 VBA 환경 에서 Adam의 Immediates 창에 대한 답변 에 표시된 대로 텍스트를 인쇄하는 방법에 대한 질문에 대한 답변 입니다.

기본 설정 :

활성 시트의 A1 셀 에서 아래 수식을 사용하여 인쇄 할 문자열을 유지하십시오. 바이트 카운팅을 위해 1 바이트를 추가해야합니다.

'[Your Text Here]

예 :

'Hello 
World

즉시 창 기능, 5 + 1 = 6 바이트

?[A1]

'셀 A1의 경우 +1 바이트


0

Vim (ex 모드), 28 바이트

#!/bin/ex -c ':1d' -c ':wq'
[string]

28 바이트는 마지막 줄 바꿈을 포함합니다.


0

Vim, 738 바이트

:imap <esc> <c-v><esc>
:imap <c-a> <c-v><c-a>
:imap <c-b> <c-v><c-b>
:imap <c-c> <c-v><c-c>
:imap <c-d> <c-v><c-d>
:imap <c-e> <c-v><c-e>
:imap <c-f> <c-v><c-f>
:imap <c-g> <c-v><c-g>
:imap <c-h> <c-v><c-h>
:imap <c-i> <c-v><c-i>
:imap <c-j> <c-v><c-j>
:imap <c-k> <c-v><c-k>
:imap <c-l> <c-v><c-l>
:imap <c-m> <c-v><c-m>
:imap <c-n> <c-v><c-n>
:imap <c-o> <c-v><c-o>
:imap <c-p> <c-v><c-p>
:imap <c-q> <c-v><c-q>
:imap <c-r> <c-v><c-r>
:imap <c-s> <c-v><c-s>
:imap <c-t> <c-v><c-t>
:imap <c-u> <c-v><c-u>
:imap <c-v> <c-v><c-v>
:imap <c-w> <c-v><c-w>
:imap <c-x> <c-v><c-x>
:imap <c-y> <c-v><c-y>
:imap <c-z> <c-v><c-z>
:imap <c-@> <c-v><c-@>
:imap <c-\> <c-v><c-\>
:imap <c-]> <c-v><c-]>
:imap <c-^> <c-v><c-^>
:imap <c-?> <c-v><c-?>
i

삽입 모드의 모든 제어 문자를로 바인드하고 <c-v>그 뒤에 제어 문자를 입력하면 문자가 입력됩니다. ^ _ (단위 구분자)는 기본적으로 문자 그대로 출력되므로 리 바인드가 필요하지 않은 것 같습니다.

변수 텍스트는 물론 끝납니다.

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