미러 레벨을 출력하는 프로그램 작성


31

95 개의 인쇄 가능한 ASCII 문자가 있습니다 :

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

에서 Consolas 폰트 (스택 교환 코드 블록 기본값), 일부 문자는 대칭의 수직 축을 중심으로 거울을 가지고 :

  • 이 문자 쌍은 서로의 거울입니다. () [] {} <> /\
  • 이 캐릭터들은 그들 자신의 거울입니다 : ! "'*+-.8:=AHIMOTUVWXY^_ovwx|(공간은 하나입니다.)
  • 이들은 거울이 없습니다 : #$%&,012345679;?@BCDEFGJKLNPQRSZ`abcdefghijklmnpqrstuyz~

( i, l, 0, #, 그리고 아마도 다른 문자는 자신의 거울은 어떤 글꼴에 있지만 우리는 Consolas 모양에 충실 수 있습니다.)

문자열이 39 개의 거울 문자로만 만들어 지면 문자열 자체가 대칭이라고하며, 문자열의 중심 대칭 선이되도록 배열됩니다. 그래서 ](A--A)[자신의 거울입니다 만 ](A--A(]이 아니다.

그 자체의 거울 인 한 줄 짝수 길이 프로그램을 작성하십시오. 왼쪽 절반의 N 사본이 앞에 추가되고 오른쪽 절반 N 개의 사본이 추가되면 N + 1을 출력해야합니다. N은 음이 아닌 정수입니다.

예를 들어 프로그램이 ](A--A)[(왼쪽 절반 : ](A-, 오른쪽 절반 :) -A)[인 경우 :

  • Running ](A--A)[은 출력해야합니다 1. (N = 0)
  • Running ](A-](A--A)[-A)[은 출력해야합니다 2. (N = 1)
  • Running ](A-](A-](A--A)[-A)[-A)[은 출력해야합니다 3. (N = 2)
  • Running ](A-](A-](A-](A--A)[-A)[-A)[-A)[은 출력해야합니다 4. (N = 3)
  • . . .
  • Running ](A-](A-](A-](A-](A-](A-](A-](A-](A-](A--A)[-A)[-A)[-A)[-A)[-A)[-A)[-A)[-A)[-A)[은 출력해야합니다 10. (N = 9)
  • 기타

규칙

  • 표준 출력 또는 언어의 가장 가까운 대안으로 출력합니다. 선택적인 후행 줄 바꿈이있을 수 있습니다. 입력이 없어야합니다.
  • 이 프로세스는 충분한 메모리와 컴퓨팅 성능을 고려할 때 이론적으로 N 2 15 -1 이상 으로 작동해야합니다 .
  • REPL 명령 뿐만 아니라 전체 프로그램이 필요합니다 .

바이트 단위의 가장 짧은 초기 프로그램 (N = 0 인 경우)이 이깁니다.


일부 글꼴에서는 #자체 반사도 있지만 콘솔 라가 아니라 맞습니다.
SuperJedi224

1
repls를 사용할 수 있습니까? 다시 말해, 우리는 완전한 유효한 프로그램을 작성해야합니까, 아니면식이 충분해야합니까? 나는 ghci에서 실행될 때 작동하지만 유효한 완전한 프로그램이 아닌 Haskell 항목에 대해 생각하고 있습니다.
Bakuriu

@Bakuriu 전체 프로그램이 필요합니다. 하스켈 답변이 잘못되었습니다.
Calvin 's Hobbies

4
왜 'b'와 'd'가 서로 거울이 아닌가? 그것은 나의 계획을 불가능하게한다 : P
Thijs ter Haar

1
@ThijsterHaar 실제로는 고려하지 않았지만 Consolas 모양이 약간 다른 것처럼 보입니다. 죄송합니다 : P
Calvin 's Hobbies

답변:


20

핍, 12 8 4 바이트

이제 66 % 적은 바이트로!

x++x
  • x로 사전 초기화 된 변수 ""입니다. 숫자 컨텍스트에서는이됩니다 0.
  • 상반기는 마지막 +형태로 표현됩니다 x+x+...+x. 이것은 아무것도하지 않는 유효한 진술입니다.
  • 전반부의 결승 +을 포함하여 후반은 형식을 표현합니다 ++x+x+...+x. ++x단위는 x1, 나머지는 자체 N 번에 추가합니다. Pip에서는 표현식이 왼쪽에서 오른쪽으로 평가되므로 증분이 먼저 발생하고 결과는 미러 레벨 수와 같습니다.
  • 결국이 표현식의 값은 자동 인쇄됩니다.

불행히도 Pip은 큰 표현을 잘 처리하지 못합니다.이 솔루션은 maximum recursion depth exceeded500 이상의 N에 대해 오류를 발생시킵니다 . 8 바이트에 대한 이전 솔루션은 다음과 같습니다 .

x++oo++x

Pip에 대한 추가 정보


누군가 2 바이트 답변을 게시하지 않으면이 내용을 가방에 넣은 것처럼 보입니다. 그건 그렇고, N = 32767으로 실행했는지는 모르겠지만 실제 출력은 Fatal error: maximum recursion depth exceeded while calling a Python object입니다.
Dennis

@Dennis 그래, 나는 실제로 그 문제에 부딪쳤다. 그것은 아주 일찍 시작한다. 그 이유는 먼저 모든 하위 표현식을 재귀 적으로 평가하여 표현식을 평가하므로 x+x+...+xO (N) 재귀 깊이를 생성하기 때문입니다. 어쩌면 그것은이 대답을 무효화합니다. 메모를 추가하겠습니다.
DLosc

재귀 제한은 파이썬에서 쉽게 조정할 수 있습니까?
Dennis

@Dennis 예, 너무 높게 설정하면 시스템에 어떤 일이 일어날 지에 대한 심각한 경고 가 있지만 시도한 적이 없습니다. ;) 게다가 Pip 내에서 구성 할 수 없으므로 바람을 피우는 것 같습니다. 그래도 시도하고 싶다면 결과를 듣는 데 관심이 있습니다.
DLosc

난 노력 했어. 내 컴퓨터에서 재귀 제한을 20000으로 늘리면 이미 segfault입니다. 그러나 충분한 메모리와 컴퓨팅 성능만으로도 답이 작동 해야하므로 문제가되지 않습니다.
Dennis

34

GolfScript, 10 바이트

!:{)::(}:!

웹 골프 스크립트를 사용하여 온라인으로 사용해보십시오 : N = 0 , N = 1 , N = 2 , N = 3 , N = 41

웹 GolfScript는 1024 자로 제한되지만 Ruby 인터프리터는 N = 32767을 완벽하게 처리 합니다.

$ curl -Ss http://www.golfscript.com/golfscript/golfscript.rb > golfscript.rb
$ echo '"!:{):"32768*":(}:!"32768*' | ruby golfscript.rb > mirror-level-32767.gs
$ ruby golfscript.rb mirror-level-32767.gs
32768

작동 원리

입력하지 않으면 GolfScript는 처음에 스택에 빈 문자열이 있습니다.

첫 번째 왼쪽 절반에서 다음이 발생합니다.

  • !빈 문자열에 논리 NOT을 적용합니다. 이 푸시1 .

  • :{ 변수의 스택에 정수를 저장합니다 { .

    예, 저장된 값을 검색 할 방법이 없지만 유효한 식별자입니다.

  • ) 스택의 정수를 증가시킵니다.

  • : 불완전한 명령입니다.

이후의 왼쪽 절반은 다음과 같습니다.

  • :! (어디에 : 이전의 남은 은) 변수의 스택에 정수를 저장합니다 !.

    예, 또한 유효한 식별자입니다. 이것은! 명령 되지만 더 이상 사용하지 않습니다.

  • :{, ): 이전처럼 작동합니다.

첫 번째 오른쪽 절반에서 다음이 발생합니다.

  • ::(: 이전의 남은 부분 은) 변수의 스택에 정수를 저장합니다 :.

    예, 심지어 유효한 식별자입니다. 와 마찬가지로 {저장된 값을 검색 할 방법이 없습니다.

  • ( 스택의 정수를 감소시켜 왼쪽 절반의 수를 산출합니다.

  • }일치하지 않으므로 즉시 실행을 종료합니다.

    이것은 문서화되지 않은 기능입니다. 나는 그것들을 수퍼 멘션 이라고 부릅니다 .

나머지 코드는 단순히 무시됩니다.


}거울 경쟁에서 코드의 하반기에 타의 추종을 불허하는 것은 정말 이상하게 보입니다 .
ballesta25

회문 변형에서 일반적인 트릭입니다. 에서 "\""/"두 번째 큰 따옴표는 이스케이프 처리되었으므로 네 번째 큰 따옴표도 일치하지 않습니다.
Dennis

27

Z80 기계 코드, 8 6 바이트 *

<8ww8> * Amstrad BASIC에서 입력하여 특정 조건을 가정

<   INC A         // A=A+1
8w  JR C, #77     ## C is unset unless A has overflowed, does nothing

w   LD (HL), A    // Saves A to memory location in HL (randomly initialised)
8>  JR C, #3E     ## C is still unset, does nothing

ABASIC에서 입력하면 처음에는 0입니다. A n 번 증가한 다음 동일한 메모리 위치 (기본적으로 약간 임의의 위치로 설정 됨)에 n 번 씁니다 ! JR이후 점프 상대 작업은 아무것도하지 않을 C플래그는 항상 해제 그래서 다음 바이트 "주석"을 사용! 이 버전은 특정 입력 조건, 즉 A항상 0 인 BASIC 보장에서 입력한다고 가정하여 약간의 부정 행위를 합니다. 위치는 (HL)안전하지 않을 수 있으며 실제로 위험한 위치 일 수 있습니다. 아래 코드는 훨씬 강력하기 때문에 훨씬 길다.

Z80 기계 코드, 30 바이트

ASCII로 : o!.ww.!>A=o>{))((}<o=A<!.ww.!o

기본적으로 전반부는 0 값 생성을 보장하고 후반은이를 증가시켜 메모리에 씁니다. 아래의 확장 된 버전 ##에서 미러의 절반에 목적이없는 코드를 나타냅니다.

o   LD L, A       ## 
!.w LD HL, #772E  // Load specific address to not corrupt random memory!
w   LD (HL), A    ## Save random contents of A to memory
.!  LD L, #21     ## 
>A  LD A, #41     // A=#41
=   DEC A         // A=#40
o   LD L, A       // L=#40
>{  LD A, #7B     ## 
)   ADD HL, HL    // HL=#EE80
)   ADD HL, HL    // HL=#DD00. L=#00 at this point

((  JR Z, #28     ## 
}   LD A, L       // A=L
<   INC A         // A=L+1
o   LD L, A       // L=L+1
=   DEC A         // A=L
A   LD B, C       ## 
<   INC A         // A=L+1
!.w LD HL, #772E  // Load address back into HL
w   LD (HL), A    // Save contents of A to memory
.!  LD L, #21     ## 
o   LD L, A       // L=A

허용 된 지침의 분류 :

n   op    description
--  ----  -----------
28  LD    LoaD 8-bit or 16-bit register
3   DEC   DECrement 8-bit or 16-bit register
1   INC   INCrement 8-bit or 16-bit register
1   ADD   ADD 8-bit or 16-bit register

Available but useless instructions:
3   JR    Jump Relative to signed 8-bit offset
1   DAA   Decimal Adjust Accumulator (treats the A register as two decimal digits
          instead of two hexadecimal digits and adjusts it if necessary)
1   CPL   1s ComPLement A
1   HALT  HALT the CPU until an interrupt is received

허용 된 39 개의 명령어 중 28 개는로드 작업입니다 (0x40에서 0x7F까지의 블록은 모두 단일 바이트 LD명령어 임). 대부분 여기서는 도움이되지 않습니다! 여전히 허용되는 메모리로드 명령 LD (HL), A은 값을에 저장해야한다는 것입니다 A. 이후 A유일하게 허용 된 왼쪽 레지스터 INC명령이 실제로 매우 편리합니다!

AASCII 0x00은 허용되는 문자가 아니므로 0x00으로 로드 할 수 없습니다 ! 사용 가능한 모든 값이 0과 거리가 멀고 모든 수학 및 논리 명령이 허용되지 않습니다! 빼고 ... 난 여전히 할 수있어 ADD HL, HL16 비트 HL를 추가 할 수 있습니다 ! 별도로 직접 (아무 소용이 여기에!) 값을로드 이상 증가 A및 감소시키는 A, L또는HL 이것이 내가 레지스터의 값을 변경의있는 유일한 방법입니다! 실제로 상반기에 도움이 될 수있는 하나의 전문적인 지시가 있지만 하반기에 해결해야 할 고통과 여기에 거의 쓸모가없고 공간을 차지할 수있는 보충 지시가 있습니다.

그래서 0에 가장 가까운 값을 찾았습니다 .0x41. 어떻게 0에 가깝습니까? 이진수로 0x01000001입니다. 나는 그것을 감소 그래서,에로드 L하고 할 ADD HL, HL두 배! L이제 0입니다.A . 불행히도의 ASCII 코드 ADD HL, HL)이제 (두 번 사용해야 합니다. 다행히 (되고 JR Z, e, 여기서 e다음 바이트입니다. 그래서 그것은 두 번째 바이트를 혼란스럽게 만들고 Z플래그 에주의를 기울여 아무것도하지 않도록해야합니다 ! Z플래그에 영향을 미치는 마지막 명령 은 DEC A(반 직관적으로, ADD HL, HL변경하지 않습니다) A그 시점에서 그것이 0x40 이라는 것을 알고 있기 때문에 Z설정되지 않았다는 것이 보장 됩니다.

JR Z, #28A가 255에서 0으로 오버플로 된 경우에만 Z 플래그를 설정할 수 있기 때문에 후반의 첫 번째 명령 은 처음 255 회 아무 것도 수행하지 않습니다. 그러나 출력은 잘못됩니다. 그러나 어쨌든 8 비트 값만 저장하므로 중요하지 않습니다. 코드를 255 번 이상 확장하면 안됩니다.

깨끗하게 반환하는 모든 가능한 방법이 허용되지 않았으므로 코드는 스 니펫으로 실행되어야합니다. 모든 RETurn 명령어는 0x80보다 높으며, 8 비트 음수 값도 모두 허용되지 않았기 때문에 허용되는 소수의 점프 연산은 양의 오프셋으로 만 점프 할 수 있습니다!


6
뭐. 이게 뭐야?
cloudfeet

4
이제 GolfScript / J / etc를 사용 하여이 답변을 보았습니다. 속임수처럼 보입니다. : p
cloudfeet

16 비트 A 레지스터가있는 Z80 호환 프로세서가 있습니까? 질문에 코드가 N = 32767 작동해야하기 때문에 묻습니다 .
Dennis

1
@Dennis 프로그램이 N = 32767 에서 작동 하려면 길이가 2 x 32767 또는 65534 바이트 이상이어야합니다 . Z80은 65536 바이트의 메모리 만 처리 할 수 ​​있으므로 프로그램을 6 바이트보다 작게 만들 수 없다고 믿기 때문에 불가능한 작업입니다! A레지스터는 다른 프로세서가 Z80와 호환되지 않을 것입니다, 항상 8 비트이다. 충분한 메모리와 컴퓨팅 능력 이 여기에서 다루어 졌다고 말할 것입니다 !
CJ 데니스

1
@Dennis Z80 호환 프로세서에 A8 비트 이외 의 레지스터 가없는 이유를 알고 있습니까? 16 비트로 변경하면 예를 들어 255 + 1 = 0에 의존하는 코드가 중단 됩니다. CPU를 발명하고 기본 16 비트 레지스터를 사용하지만 Z80과 동일한 8 비트 명령어 세트를 사용하는 Z160이라고하겠습니다. 기묘한!
CJ 데니스

19

J, 16 14 바이트

(_=_)]++[(_=_)

사용법 :

   (_=_)]++[(_=_)
1
   (_=_)]+(_=_)]++[(_=_)+[(_=_)
2
   (_=_)]+(_=_)]+(_=_)]++[(_=_)+[(_=_)+[(_=_)
3

설명:

  • J는 오른쪽에서 왼쪽으로 평가됩니다.

  • (_=_)is inf equals infis true, 값이 1이므로식이됩니다 1+]...[+1. ( (8=8)또한 작동하지만 이것은 더 시원해 보입니다. :))

  • [] 그들은 2 인자가있는 경우 각각 자신의 왼쪽과 오른쪽 인수를 반환합니다. 그들이 1을 얻는다면 그들은 그것을 돌려줍니다.

  • +2 개의 인수를 추가합니다. 1을 얻는다면 그것을 반환합니다.

이제 레벨 3 표현식 (오른쪽에서 왼쪽으로 이동)을 평가 해 보겠습니다.

(_=_)]+(_=_)]++[(_=_)+[(_=_)  NB. (_=_) is 1

1]+1]+1]++[1+[1+[1  NB. unary [, binary +

1]+1]+1]++[1+[2  NB. unary [, binary +

1]+1]+1]++[3  NB. unary [, unary +

1]+1]+1]+3  NB. unary +, binary ]

1]+1]+3  NB. unary +, binary ]

1]+3  NB. unary +, binary ]

3

보시다시피의 오른쪽 절반 1이 추가되고 왼쪽 1이 생략되어 원하는 정수인 N미러 수준이됩니다.

여기에서 온라인으로 사용해보십시오.


12

하스켈, 42 바이트

(8-8)-(-(8-8)^(8-8))--((8-8)^(8-8)-)-(8-8)

다행히 Haskell (-> --) 의 행 주석은 미러링 가능하고 그 절반 (-> -)은 유효한 함수입니다. 나머지는 숫자를 얻을 수있는 몇 가지 수학이다 0하고 1. 기본적으로 우리는이 (0)-(-1)코멘트에로N=0(0)-(-1)- 각 단계마다 덧붙 입니다.

부동 소수점 숫자를하는 것은 출력을 위해 허용되는 경우에, 우리는 만들 수 있습니다 1에서8/8 26 바이트에 의해 얻을 :

하스켈, 26 바이트

(8-8)-(-8/8)--(8\8-)-(8-8)

출력 1.0, 2.0


2
전체 프로그램이어야하므로 기술적으로 유효하지 않습니다.
Calvin 's Hobbies

@ Calvin'sHobbies : 알겠습니다. 전체 프로그램의 최소 요구 사항에 대한 합의가 있습니까? 메타를 검색했지만 프로그램이 아니라 함수에 대한 토론 만 찾았습니다. 전체 프로그램의 정의에 따라 솔루션을 수정할 수 있습니다.
nimi

파일로 저장 program.hs한 다음 $ runhaskell program.hs명령 줄에서 실행 하여 출력을 볼 수 있다면 전체 프로그램이라고 부릅니다 . 나는 Haskell을 모른다. 그래서 나는 무엇이 바뀌어야하는지 정확하게 말할 수 없다.
Calvin 's Hobbies

2
@ Calvin'sHobbies : runhaskell는 환경을 설정 ghc하고 Haskell 컴파일러를 호출하는 쉘 스크립트입니다 . 당신은 직접 내 코드를 실행할 수 있습니다 ghc: ghc -e "(8-8)-(-8/8)--(8\8-)-(8-8)". 이 출시 ghc인수로 제공되는 코드를 평가하고, 그 결과를 출력하고 종료. REPL, 상호 작용 없음 물론 이것은의 바이트 수에 +1을 추가합니다 -e.
nimi

@nimi : -e이 경우 점수에 기여하지 않습니다. 우리는 바이트 포함되지 않습니다 perl -E또는 gcc -std=c99중 하나를.
Dennis

11

CJam, 14 바이트

]X+:+OooO+:+X[

CJam 인터프리터에서 온라인으로 시도하십시오 : N = 0 , N = 1 , N = 2 , N = 3 , N = 41

이 코드는 오류 메시지와 함께 완료됩니다. Java 인터프리터를 사용하면 STDERR을 닫거나 경로 재지 정하여 해당 오류 메시지를 억제 할 수 있습니다. 1

작동 원리

왼쪽 절반에서 다음이 발생합니다.

  • ] 전체 스택을 배열로 래핑합니다.

  • X1해당 배열에 추가 합니다.

  • :+ 모든 배열 요소의 합을 계산합니다.

  • Oo 빈 배열의 내용을 인쇄합니다 (즉, 아무것도 아님).

첫 번째 오른쪽 절반에서 다음이 발생합니다.

  • o 스택에 정수를 인쇄합니다.이 출력은 원하는 출력입니다.

  • O+ 스택의 최상위 항목에 빈 배열을 추가하려고합니다.

    그러나를 밀기 전에 스택이 비어있었습니다 O. 이것은 실패하고 프로그램의 실행을 종료합니다.

나머지 코드는 단순히 무시됩니다.

1 메타 설문 조사에 따르면 제출이 오류와 함께 종료되어야합니까? 이 허용됩니다.


나는 오류로 인해 이것을 받아들이는 것에 회의적이지만, 승리하지 않았기 때문에 너무 걱정하지 않습니다.
Calvin 's Hobbies

CJam에서는 이와 같은 작업이 골프 언어라고 생각하면 놀라 울 정도로 어렵습니다. 실행되지 않은 블록 의 구문 오류 (예 : 정의되지 않은 연산자)조차도 전체 프로그램이 실행되지 못하게합니다. 여전히 오류를 제거하려고합니다.
Dennis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.