원형 문자 이동 후 유효한 프로그램 작성


17

매우 어려울 수 있지만이 사이트에서 놀라운 것들이 나오는 것을 보았습니다.

목표는 원하는 언어로 프로그램을 작성하는 것입니다. 캐치 프로그램이 후 유효해야한다는 것입니다 어떤 문자의 원형 이동.

원형 문자 이동은 원형 이동 과 매우 유사합니다 . 몇 가지 예는 분명합니다.

프로그램 int main() { return 0; }

6 자로 왼쪽으로 이동하면 다음이 생성됩니다. in() { return 0; }int ma

왼쪽으로 1자를 바꾸면 다음과 같이됩니다. nt main() { return 0; }i

오른쪽으로 10자를 바꾸면 다음과 같습니다. eturn 0; }int main() { r

그러나이 프로그램은 분명히 규칙을 준수하지 않습니다.

규칙

  • 모든 언어
  • 승자는 투표권에 의해 결정됩니다
  • 동일한 작업 또는 각 회전마다 완전히 다른 작업을 수행하는 솔루션은 점수에 100 개의 가상 투표를받습니다.

업데이트 나는 이것이 오랫동안 지속되었다고 생각합니다. 가장 많은 투표 (가상 투표 포함)를 가진 우승자는 Mark Byers입니다. 잘 했어!


5
int 리터럴이 유효한 프로그램 인 언어에는 지루한 잠재적 답변이 있습니다. 그들은 가상 -100을 받습니까?
피터 테일러

1
@PeterTaylor 지루한 답변이 더 적은 표를받을 것이라고 가정합니다.
Griffin

" 아마도 매우 어렵다" 이런 종류의 진술을 일반적인 방식으로 만들기 전에 많은 이상한 언어에 익숙해지는 것이 항상 도움이된다. c 또는 java에서는 어렵지만 1 문자 명령과 간단한 구문이있는 언어는 어떻습니까? 별로.
dmckee 2016 년

@dmckee 따라서 "잠재적으로"...
그리핀

@PeterTaylor 또한 언어의 많음에 빈 프로그램은 유효한 프로그램입니다
JK.

답변:


31

작업에 적합한 언어를 사용하십시오. 이 경우 Befunge 입니다.

이 언어는 다음과 같은 이유로 자연스럽게 회전을 허용합니다.

  • 모든 명령은 단일 문자입니다.
  • 처음부터 다시 시작하여 프로그램의 끝에 도달하면 컨트롤이 줄 바꿈됩니다.

이 Befunge 프로그램은 사용하는 "원형 문자 이동"수에 관계없이 정확히 동일한 출력 ( "Hello")을 인쇄합니다.

86*01p75*1-02p447**1-03p439**04p439**05p455**1+06p662**07p75*1-08p645**2-09p69*4+019+p57*029+p59*1-039+p555**1-049+p88*059+p86*01p75*1-02p447**1-03p439**04p439**05p455**1+06p662**07p75*1-08p645**2-09p69*4+019+p57*029+p59*1-039+p555**1-049+p88*059+p645**2-00p645**2-00p

Befungee에서 실행됩니다 . 보드를 늘려야합니다 (80 자 기본값이 아님). 다음과 같이 실행할 수 있습니다.

python befungee.py -w400 hello.bef

먼저 "Hello"를 인쇄하는 프로그램을 동적으로 생성하고 저장 한 다음 첫 번째 바이트를 덮어 써서 컨트롤을 새로 작성된 프로그램으로 리디렉션합니다. 바이트가 처음으로 올바르게 작성되지 않으면 두 번째로 수정되도록 프로그램이 두 번 작성됩니다.

이 아이디어는 임의의 복잡한 프로그램을 생성하도록 확장 될 수 있습니다.


아주 좋은 입장!
ChristopheD 2016 년

22

Brainf * ck

직무에 가장 적합한 도구를 선택하십시오. 바로이 직무와 관련이 없었습니다.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++.+.>++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++.++++++++++++++.>++++++++++.+

여기에 표시되는 이동되지 않은 프로그램은 단순히 인쇄 SHIFT(줄 바꿈)도 표시합니다. 임의로 순환 이동하면 다양한 다른 출력이 생성되지만 항상 6 개의 ASCII 문자가 출력됩니다.


나는 질문과 생각을 읽었습니다. Brainfuck, 그것은 티켓입니다. 그러나 당신은 저를 이겼습니다.
jmoreno 2016 년

12

코모도어 64 베이직

?의 약자로 PRINT, 그리고 :그래서, 성명 구분이다 :

?1:?2:?3:          // prints 1, 2, and 3
:?1:?2:?3          // prints 1, 2, and 3
3:?1:?2:?          // adds a program line 3 :PRINT1:PRINT2:PRINT
?3:?1:?2:          // prints 3, 1, and 2
:?3:?1:?2          // prints 3, 1, and 2
2:?3:?1:?          // adds a program line 2 :PRINT3:PRINT1:PRINT
?2:?3:?1:          // prints 2, 3, and 1
:?2:?3:?1          // prints 2, 3, and 1
1:?2:?3:?          // adds a program line 1 :PRINT2:PRINT3:PRINT

물론 더 긴 변형이 가능합니다.

?1:?2:?3:?4:?5:?6:?7:?8:?9:?10:?11:

기타...


11

골프 스크립트

이 프로그램은 프로그램이 어떻게 이동되는지에 관계없이 항상 2까지 합계되는 일부 숫자를 인쇄합니다.

10 2 base
0 2 base1
 2 base10
2 base10 
 base10 2
base10 2 
ase10 2 b
se10 2 ba
e10 2 bas

첫 번째 줄 1010은 이진수로 10을 인쇄 02하고 두 번째 줄은 인쇄 하고 다른 모든 줄은 인쇄 2합니다.

최신 정보:

이 프로그램은 여기에서 테스트 할 수 있습니다 . 각 행의 끝에 출력 형식을 지정하기 위해 s를 추가 n했습니다. 이들은 제거 될 수 있으며 프로그램은 여전히 ​​작동합니다.


10

루비, 아마도 가장 짧은 해결책 중 하나입니다.

p

그리고 조금 더 길고 흥미로운 것 :

;;p";p;";p

9

x86 16 비트 이진

이 ( 1 2 ) 테이블, nasm 및 ndisasm 의 도움으로 수동으로 구성됩니다 . 이것은 바이트가 점프하거나 스택을 변경하지 않으며 ret어떤 경우에도 단일 바이트 명령 으로 끝나기 위해 NOP로 채워지기 때문에 충돌이나 무한 루프없이 항상 반환됩니다 .

대부분의 경우 이것은 출력 FOO이거나 그 하위 문자열입니다. AX깨진 경우 임의의 int 10 (내 테스트 중 하나에서 커서 깜박임 속도가 변경됨) 을 호출 하지만 일반적으로 충돌이 발생하지 않습니다.

시도해 보려면 hexdump를 파일에 넣고을 사용한 xxd -r foo.hex > foo.com다음 dos 환경에서 실행하십시오 (dosbox를 사용했습니다).

이 파일의 16 진 덤프는 다음과 같습니다.

0000000: b846 0d90 90fe c490 9090 bb05 0090 9043  .F.............C
0000010: 43cd 1090 b84f 0d90 90fe c490 9090 bb05  C....O..........
0000020: 0090 9043 43cd 1090 b84f 0d90 90fe c490  ...CC....O......
0000030: 9090 bb05 0090 9043 43cd 1090 9090 c3    .......CC......

그리고 몇 가지 흥미로운 분해 오프셋 :

+0

00000000  B8420D            mov ax,0xd42
00000003  90                nop
00000004  90                nop
00000005  FEC4              inc ah
00000007  90                nop
00000008  90                nop
00000009  90                nop
0000000A  BB0500            mov bx,0x5
0000000D  90                nop
0000000E  90                nop
0000000F  43                inc bx
00000010  43                inc bx
00000011  CD10              int 0x10
00000013  90                nop
00000014  B84F0D            mov ax,0xd4f
00000017  90                nop
00000018  90                nop
00000019  FEC4              inc ah
0000001B  90                nop
0000001C  90                nop
0000001D  90                nop
0000001E  BB0500            mov bx,0x5
00000021  90                nop
00000022  90                nop
00000023  43                inc bx
00000024  43                inc bx
00000025  CD10              int 0x10
00000027  90                nop
00000028  B84F0D            mov ax,0xd4f
0000002B  90                nop
0000002C  90                nop
0000002D  FEC4              inc ah
0000002F  90                nop
00000030  90                nop 
00000031  90                nop
00000032  BB0500            mov bx,0x5
00000035  90                nop
00000036  90                nop
00000037  43                inc bx
00000038  43                inc bx
00000039  CD10              int 0x10
0000003B  90                nop
0000003C  90                nop
0000003D  90                nop
0000003E  C3                ret

(아래 예의 나머지 바이너리는 여전히 유효합니다)

+1

00000000  42                inc dx
00000001  0D9090            or ax,0x9090
00000004  FEC4              inc ah
00000006  90                nop

+2

00000001  0D9090            or ax,0x9090
00000004  FEC4              inc ah
00000006  90                nop

+6

00000000  C4909090          les dx,[bx+si-0x6f70]
00000004  BB0500            mov bx,0x5
00000007  90                nop
00000008  90                nop
00000009  43                inc bx
0000000A  43                inc bx
0000000B  CD10              int 0x10

+11

00000000  050090            add ax,0x9000
00000003  90                nop
00000004  43                inc bx
00000005  43                inc bx
00000006  CD10              int 0x10

+12

00000000  00909043          add [bx+si+0x4390],dl
00000004  43                inc bx
00000005  CD10              int 0x10

+18

00000000  1090B84F          adc [bx+si+0x4fb8],dl
00000004  0D9090            or ax,0x9090
00000007  FEC4              inc ah
00000009  90                nop

(다른 오프셋은 단지 위의 반복입니다)

+58

00000000  10909090          adc [bx+si-0x6f70],dl
00000004  C3                ret

7

단항 답변 :

000000 ... 00000

^ 44391 제로

고양이 프로그램. 어떻게 회전하든 동일한 프로그램입니다.


6

PHP

다음은 유효한 PHP 프로그램입니다.

Is this still funny?

2
"ate"와 같은 단어를 사용 했어야합니다 (더 긴 단어가있을 것입니다). 따라서 각 문자 이동은 여전히 ​​실제 단어가됩니다.
Peter

10
이걸 +1할지, 아니면 -1할지 모르겠습니다
Lie Ryan

6

스칼라

중첩 된 따옴표 :

""""""""""""""""""""""""""""""""

C ++ / 자바 / C # / 스칼라

논평:

///////////////////////////////////

빈 명령 :

;;;;;;;;;;;;;;;

세게 때리다

주석, 공백 및 쉘 내장 조합 :

#

:

세드

독립형 유효한 명령 :

p P n N g G d D h H

위의 조합 :

p;P;n;N;g;G;d;D;h;H;

AWK

파일의 모든 줄을 인쇄하려면

1

또는

//

아무것도 인쇄하지 마십시오 :

0

abcd

SED가 이상한 회전으로 실패하는 것처럼 보입니까? 가 ;P;n;N;g;G;d;D;h;H유효?
captncraig

@CMP : 그렇습니다.
프린스 존 웨슬리

5

제이

먼저 프로그램의 유효한 회전을 확인하는 스크립트 s:

check =: 3 :'((<;(". :: (''Err''"_)))@:(y |.~]))"0 i.#y'

예를 들어, 프로그램 +/1 5(1과 5의 합)은 다음을 제공합니다.

 check '+/1 5'
┌───────┬───┐
│┌─────┐│6  │
││+/1 5││   │
│└─────┘│   │
├───────┼───┤
│┌─────┐│Err│
││/1 5+││   │
│└─────┘│   │
├───────┼───┤
│┌─────┐│Err│
││1 5+/││   │
│└─────┘│   │
├───────┼───┤
│┌─────┐│6  │
││ 5+/1││   │
│└─────┘│   │
├───────┼───┤
│┌─────┐│6  │
││5+/1 ││   │
│└─────┘│   │
└───────┴───┘

그런 다음 지루하고 유효한 프로그램 :

check '1x1'
┌─────┬───────┐
│┌───┐│2.71828│ NB. e^1
││1x1││       │
│└───┘│       │
├─────┼───────┤
│┌───┐│       │ NB. Value of variable x11
││x11││       │ 
│└───┘│       │
├─────┼───────┤
│┌───┐│11     │ NB. Arbitrary precision integer
││11x││       │
│└───┘│       │
└─────┴───────┘

2

dc

dc 프로그램은 모든 회전에서 쉽게 유효합니다. 예를 들면 다음과 같습니다.

4 8 * 2 + p  # 34
8 * 2 + p 4  # stack empty / 10
...

1

기계 코드

NOP 용 Z80 / Intel 8051 머신 코드는 어떻습니까 ?

확실히 작동하지 않지만 1 ~ 2주기가 걸리므로 원하는만큼 가질 수 있습니다.

그리고 위의 Ruby 응답에 동의하지 않습니다 . 단일 바이트 00h가 Ruby보다 짧다고 생각합니다 p.


1

케이

.""

빈 문자열을 평가합니다

"."

마침표 문자를 반환

"".

'.'의 부분 적용을 리턴합니다. 빈 문자 목록으로 이동합니다.


1

쉬, 배쉬

cc
cc: no input files

cc 회전 된 cc는 다시 cc이지만 알몸이라고하면 친절하지 않습니다.

dh 
dh: cannot read debian/control: No such file or directory
hd 

dh debhelper 도 매우 협조적이지는 않지만 hexdump 는 입력을 기다립니다.

gs
sg 

Ghostscript 는 대화식 모드를 시작하고 스위치 그룹 은 사용법 메시지를 표시합니다. 여기에도 유효한 솔루션입니다.

다음은 이러한 프로그램의 후보를 찾는 스크립트입니다.

#!/bin/bash
for name in /sbin/* /usr/sbin/* /bin/* /usr/bin/*
do 
    len=${#name}
    # len=3 => 1:2 0:1, 2:1 0:2
    # len=4 => 1:3 0:1, 2:2 0:2, 3:1 0:3
    for n in $(seq 1 $((len-1)))
    do
        init=${name:n:len-n}
        rest=${name:0:n}
        # echo $init$rest
        which /usr/bin/$init$rest 2>/dev/null >/dev/null && echo $name $init$rest $n
    done 
done

(arj, jar) 또는 (luatex, texlua)와 같이 더 긴 시퀀스를 발견하면 매 교대 후에는 유효하지 않지만 처음에는 잘못 읽은 몇 가지 교대 후에 만 ​​쉽기 때문에 쉽지 않습니다. 수동으로 걸러냅니다.


두 글자 이상의 예는 유효하지 않습니다. 영업 이익은 "프로그램이 후 유효해야했다 어떤 원형의 변화". 따라서 명령 이 없으므로 arj/ jar는 유효하지 않습니다 rja(이 예제는 마음에 들지만). 스크립트에 +
1-

내가 영어를 모국어로 확신, 그리고 이었기 때문에, 나는 중 하나를 의미하는 것으로, 모호한 발견 사전, 상담 every, 또는 의미를 a random one. 와 예 shift left by 6, left by 1그리고 right by 10난 그냥 하나의 변화 가능성을 찾을 필요가 있다는 해석 나를 안심하시기 바랍니다.
사용자 알 수 없음

모호하지 않습니다. 임의의 시프트 후 프로그램이 유효해야하는 경우 가능한 모든 시프트에 대해 유효해야합니다.
Griffin

@Griffin : 알겠습니다. 질문을 썼습니다. 더 긴 예제를 제거했습니다. 다행히도 gs 및 sg와 같은 유닉스에는 충분한 crptc abbrv prgnms가 있습니다. :) Btw .: 당신은 네이티브 Englisch 스피커입니까? 이전 문장에서, ... in any language ... 내 솔루션은 bash (및 sh, zsh, ash 및 기타 몇 가지)에서만 작동하지만 다른 모든 솔루션도 프로그램 이름을 사용합니다.
사용자 알 수 없음

0

사소한 파이썬 예제 :

"a""b""c""d""e""f""g""h""i""j""k""l""m""n""o""p""q""r""s""t""u""v""w""x""y""z""";print

점점 더 많은 알파벳을 나타 내기 위해 세 문자를 반복해서 이동할 수 있습니다.


죄송합니다. 질문을 더 명확하게해야합니다. 모든 교대는 유효한 프로그램을 생성해야합니다. 질문을 업데이트했습니다.
Griffin

0

파이썬

123456789.0

그냥 몇 가지 숫자를 평가


0

dc 는 이미 사용되었지만 다음 프로그램 은 회전에 관계없이 항상 같은 출력을합니다 .

d

출력

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