우리는 무엇을 잊었습니까?


31

귀하의 작업은 일부 바이트 시퀀스로 구성된 비어 있지 않은 컴퓨터 프로그램을 작성하는 것입니다. 프로그램에서 특정 바이트를 선택하고 프로그램에서 모든 인스턴스를 제거하면 수정 된 프로그램이 제거 된 바이트를 출력해야합니다.

예를 들어 프로그램이

aabacba

그런 다음 bcb출력은 것 a, aaaca출력에 필요 b하고 aababa겠습니까 출력 c.

수정되지 않은 프로그램의 기능은 중요하지 않습니다.

응답은 바이트 수를 최소화하는 목표로 바이트 단위로 점수가 매겨집니다.


4
이 챌린지에 quine 태그가 지정되지 않았으므로 자체 소스 코드를 읽을 수 있습니까?
Dennis

1
@ 데니스. 내 손님이 되십시오
밀 마법사

2
프로그램의 모든 바이트가 숫자를 나타내는 경우 종료 코드를 통해 출력 할 수 있습니까?
Mr. Xcoder

15
나는 이것이 사용되는 이산 문자의 수를 최대화 해야하는 코드 도전으로 더 나을 것이라고 생각합니다.
Notts90

2
비어 있지 않은 : P 대신 1 바이트 이상을 지정해야합니다 . 또는 Notts90이 말한 것.
Magic Octopus Urn

답변:


70

zsh을, 603 594 566 561 548 440 415 399 378 370 바이트

ec
ho \\n;ca t<<<$'\x20';exi t
d$c -e8BC6P
d0c -eKp
$'\172\163\150' $'\055\143' $'\146\157\162 v \151\156 \173\043\056\056\134\175\175\073\173 \146\147\162\145\160 \055\161 $\166 '$0$'\174\174\074\074\074$\166\073\175'
$'\145v\141\154' $':\073\072\046\046\145\170\151\164';#%&()*+,/9=>?@ADEFGHIJLMNOQRSTUVWXYZ[]^_`jklmsuwy
0# $#;for b in {$..z};{ fgrep -q $b $0||<<<$b;}

coreutils +에 따라 다릅니다 dc.

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

그건 ... 여정이었습니다.

이 답변에는 세 부분이 있습니다. 처음 4 줄은 특정 코드를 처리하기 위해 특정 경우를 처리합니다. 다음 두 줄과 마지막 줄은 본질적으로 동일한 것을 수행하지만 주어진 문자를 제거하면 정확히 한 줄이 실행됩니다. 대부분 보완적인 문자 세트로 작성되므로 문자를 제거하면 한 문자 만 제거하고 다른 문자는 계속 작동 할 수 있습니다.

첫 번째 부분을 보면 먼저 처리합니다

  • 개행 제거 ec\nho \\n
  • 공백 제거 ca t<<<$'\x20'( exi t나중에 코드를 실행하지 않도록하기 위해 이어짐)
  • $함께 삭제 d$c -e8BC6P( 8BC6= 9226이고 36*256 + 10, 36 및 10 바이트의 값이며 $, 각각의 문자와 개행 우리는 행 6에서 대형 주석에 포함하는 것을 피하기 위해 진수 16 진수를 사용)
  • 0with with d0c -eKp( K십진 정밀도를 얻습니다. 0기본적으로)

다음 부분에서는 (두 번째 줄의 끝에서 쓰레기를 제외하고) 사용 된 유일한 문자는 $'\01234567v;, space 및 newline입니다. 이 중 4 개가 설명되었으므로 나머지 줄 ( '\1234567v)은 마지막 줄에서 발생할 수 없습니다. 8 진수 이스케이프 확장 ( $'\123'값이 123 8 인 ASCII 문자를 나타냄)은 다음과 같습니다.

zsh -c 'for v in {#..\}};{ fgrep -q $v '$0'||<<<$v;}'
eval ':;:&&exit'

첫 번째 줄은 프로그램에 사용 된 모든 문자를 반복하고 자신의 소스 코드 ( $0실행중인 스크립트의 파일 이름)에서 각 문자를 검색하여 찾을 수없는 문자를 인쇄합니다.

두 번째 줄은 조금 이상하게 보이며 exit많은 nops와 같은 일을하는 것처럼 보입니다 . 그러나 exit8 진수로 인코딩 하면 또는이 $'\145\170\151\164'포함되지 않은을 직접 생성 합니다 . 우리는 실제로 이것을 제거에 탄력적으로 만들어야합니다 . 그 중 하나 가 제거되어 첫 번째 줄이 끊어지면 두 번째 줄도 끊어 나머지 코드를 실행할 수 있기 때문입니다. 그러나 3 행과 4 행을 실행할 수 있도록 또는 제거 된 경우에도 끊어야 합니다. 이것은 8 진수로 각각 2와 3을 갖는 및 에 구두 뿔을 사용하여 수행됩니다 .23'\014567v23:;

두 번째 줄 끝에있는 정크는 단순히 인쇄 가능한 모든 ASCII 문자가 적어도 한 번 나타나도록하기 위해 존재합니다. 각 문자를 반복하여 확인하는 방식에는이 문자가 필요합니다.

exit첫 번째 섹션에서 호출되지 않은 경우 (즉,이 중 하나를 제거하여 엉망이 된 경우) 두 번째 섹션으로 넘어가므로 '\01234567v이러한 문자를 사용하지 않고 동일한 작업을 수행해야합니다. 마지막 줄은 디코딩 된 첫 번째 줄과 비슷하지만 몇 바이트를 절약하기 위해 루프 범위를 축소 할 수 있다는 점을 제외하고 '\01234567v는 제외하고 모든 문자 가 포함되어 있음을 이미 알고 있습니다. 또한 그 0# $#앞에 주석이 달려있어 제거 0되거나 외부 출력이 외부 출력을 생성하지 못하게합니다 $.


5
와우, 관련된 독특한 캐릭터의 양을 고려하면 매우 인상적입니다! 그 설명을 확실히 기대합니다.
Kevin Cruijssen

3
@KevinCruijssen 여기에 당신이 간다 :)
손잡이

1
@Doorknob 이것이 인터넷에서 548 개의 인터넷을 얻지 못하면 어떻게해야할지 모르겠습니다. 솔직히 603 바이트 버전은 매우 인상적입니다.
Magic Octopus Urn

3
지금까지 유일한 흥미로운 답변.
htmlcoderexe

21

망막 , 1 바이트

1

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

단일 바이트 ( 1) 의 모든 인스턴스 가 제거되면 출력은 1입니다. 충분히 간단합니다.


6
나는 이와 같은 것을 찾기 위해 TIO를 탐색하고있었습니다. Btw 이것은
폴리 글롯

IMO,이 답변은 첫 번째 질문으로 폴리 글롯 답변으로 업그레이드해야하며 (언제나 불완전한 언어 목록이있을 수 있음) 다른 두 사람은 망각으로 하향 조정되었습니다. 아, 이것은 C 에서도 작동합니다 .

@Rogem "이것은 C에서 작동합니다." 1빈 프로그램에 대해 출력하는 C 컴파일러가 있습니까? 그럼에도 불구하고, 문제의 답변은 다른 접근법과 행동을 사용한다고 생각합니다. IMO 폴리 글 로트 답변은 접근 방식이 동일하게 유지되는 경우에만 보증됩니다. (아래의 답변에 대해서는 실제 코드가 다르기 때문에 객관적으로 이것은 폴리 글롯이 아닙니다.) 원하는 방식으로 자유롭게 투표하십시오. 그러나 유효한 답변은 올바른 답변입니다. 나는 답변을있는 그대로 유지하고 답변을 수집하고 싶지 않다.
코너 오브라이언

11

길이, 216173027061157310 바이트

216173027061157310 = (144115617572598740 + 144115241762960340 + 144115194786755540) / 2. 있다 216173027061157310 - 144115617572598740 $S, 216173027061157310 - 144115241762960340 #s와 216173027061157310 - 144115194786755540공간.

144115617572598740 #s 및 공백은 다음 BF 프로그램을 인코딩합니다.

++++++[>++++++<-]>.

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

The 144115241762960340 $s and spaces encode the following BF program:

+++++++[>+++++<-]>.

Try it online!

The 144115194786755540 $s and #s encode the following BF program:

++++++++[>++++<-]>.

Try it online!

Edit: Saved 72057832274401770 bytes thanks to @Nitrodon.


Why not use U and byte 127? Try it online! Or even just the nul byte and soh?
Jo King

@JoKing I didn't know that U was the shortest printable ASCII byte that could be output. I didn't want to use unprintable bytes.
Neil

Even without taking advantage of wrapping cells or unprintable characters, you can get this down to 216173027061157310 bytes by including the space character as a third distinct byte.
Nitrodon

7
I can't help but upvote because of "Edit: Saved 72057832274401770 bytes..."
Mr Lister


9

Polyglot*, 1 byte (awaiting confirmation)

0

Try it online! (using Triangularity)

*: This works in a (rather wide) variety of languages (except for esolangs like 4, ><> and the like and some other exceptions). Identical to the Jelly answer in source code, but the method of I/O is different – Output is via exit code. When one removes 0 from the source code, they're left with an empty program, which often doesn't error and yields exit code 0 in the majority of languages.



3

Unary (non-competitive), 96 bytes

00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0101 0101 0101 0101 0101 0101  ................

Here is xxd dump.

A wider definition of Unary language allows any characters in its source code. But I havn't find a compiler or interpreter which would work for this. So I marked this answer as non-competitive. If you can find one which posted before this question asked, I will link to it.


4
This is the smallest Unary program I've ever seen.
Draco18s
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.