극성 반전


12

이 과제의 목표는 다음 조건을 만족시키는 프로그램을 작성하는 것입니다.

  • 프로그램은 회문 또는 본질적으로 회문이 아닙니다 (프로그램의 효과를 변경하지 않고 회문으로 만들기 위해 문자를 제거 할 수 있음을 의미 함).

  • 프로그램은 혁신이 아닙니다 (출력에서 실행될 때 원래 입력을 생성하지 않음을 의미 함)

  • 반대 극성 프로그램이 상기 통상 프로그램의 역행렬이고; 따라서 반전 된 프로그램이 일반 프로그램의 출력에서 ​​실행될 때 원래 입력을 반환합니다.

무엇 않습니다 반전 극성는 말인가요? 언어마다 다릅니다.

  • 대부분의 비속어의 경우 이는 단일 작업에서 하위 작업의 순서를 바꾸고 인수의 순서를 바꾸고 하드 코딩 된 목록 / 배열 / 튜플 / 사전 / 스택 / 큐 / 등의 내용을 반대로하는 것을 의미합니다. 코드 블록과 독립형 라인의 순서를 반대로하는 것 (블록 내의 라인은 아님)

예 :

하스켈 : x`mod`y-> y`mod`x; zipWith ((*3).(+)) [1,2,3] [4,5,6]->zipWith ((+).(*3)) [6,5,4] [3,2,1]

파이썬 : 2**3-> 3**2; for x,y in [(1,2),(3,4),(5,6)]->for y,x in [(6,5),(4,3),(2,1)]

  • 1 문자 기능 (예 : Pyth, APL)이있는 언어의 경우 간단히 명령 문자열을 반대로

  • BF 같은 1 차원 esolangs 들어, 명령 역방향 또는 극성을 바꿀; 극성 스왑은 []-> {}, +-> -, --> +, >-> <, <-> >, .-> ,,->입니다 .(둘다는 아님).

  • Befunge와 같은 2 차원 esolang의 경우 x 축 또는 y 축 또는 대각선을 가로 질러 반사를 수행하거나 180도 회전하거나 반사와 회전의 조합을 수행 할 수 있습니다

교환 법칙이 성립 작업이 허용되지만, 상동 사람은 없습니다 : 2*x괜찮지 만, x+x좋지 않습니다. 극성 역전의 정의는 매우 느슨하지만 의미가 무엇인지에 대한 당신의 판단을 사용하십시오. 객체는 가장 영리한 허점을 찾는 것이 아니라 가장 영리한 솔루션을 찾는 것입니다.

이것은 인기 경연 대회이므로 매우 영리한 허점이 인기가 있지만이 도전의 정신을 지키려고 노력하십시오. 우승자는 최소 1 개의 공감이있는 솔루션이 10 개 이상 있고 공감이 1 ​​개 이상인 제출물보다 1 개 이상의 투표가있는 솔루션이 하나 이상있을 경우 발표됩니다. 또는 1 개월 안에 둘 중 빠른 날짜가 있습니다. 이것은 나의 첫 번째 도전이므로, 공정하고 공정한 피드백을 주려고 노력하지만, 이것이 부당한 도전인지 또는 어떤 식 으로든 잘못 분류되거나 모호한 것인지 알려주십시오. 제가 여기에 설정 한 비둘기 구멍에 맞지 않는 언어에 대해 궁금한 점이 있으면 의견을 말하고 특정 설명이나 규칙 변경에 대한 강한 외침이 있으면 공동체의 의지에 구부릴 것입니다.

최신 정보

이 콘테스트가 시작된 지 정확히 1 개월이 지났습니다 (실제로 제 시간에 도착했는지 모른 채 우연히 확인했습니다). 이것이 인기 콘테스트이므로 우승자 (산사태로)는 Pietu1998-Befunge 입니다. 하단 구성 요소 (텍스트 리버 서 및 역방향 알파벳)가 모두 혁신적이지만 인코더 / 디코더에는 문제가 없으므로 아무런 문제가 없습니다. "BEFUNGE"를 중간에 쓰도록하기위한 보너스 포인트 (제 생각에는). 나는 언어가 시원하게 보이기 때문에 Zgarb의 Theseus 솔루션의 참신함을 개인적으로 좋아했습니다 (제한된 경우). 참여해 주신 모든 분들께 감사 드리며, 당첨자가 선정되는 동안이 콘테스트를 완전히 열어두고 향후 제출을 환영합니다.


1
극성 프로그램이 정상적인 프로그램 과 반대라는 것은 무엇을 의미 합니까? 출력이 어떤면에서 다른가요?
Sp3000

역 연산을 수행합니다. 반전 된 프로그램이 일반 프로그램의 출력에서 ​​실행될 때 원래 입력을 반환합니다.
archaephyrryx

오류로 죄송합니다. 나는 전에 그것을들은 적이 없었고 그것은 조금 괴상한 것처럼 보였으므로 그것이 Esolang이라고 가정했을 것입니다. 나는 그것을 바꿀 것이다.
archaephyrryx 2014

1
아마도 지정해야 할 것- ()회문입니까? 기술적으로는 그 반대입니다 )(.
Sp3000

1
Haskell 예제에서 함수 인수가 끝까지 섞이지 않는 이유는 무엇입니까? 타입 안전성을 유지하는 방식으로 리버스를 선택 했습니까? 극성 반전 작업에 대한 세부 사항을 선택할 수 있습니까?
John Dvorak '11

답변:


41

펀지

우와, 그것은 내가이 도전을 위해 만든 편집자 조차도 직업이었습니다 . 다음은 멋진 11x12 블록입니다.

v$,g6<6g,$v
v,$ _^_ $,v
1W>v\B\v>L1
~T+:1E1:-O~
+F00-F-02L+
>:|6gUg6|:>
{a@>^N^>@z`
>1+|@G$| +>
:^9< E<  ^1
~>7^@_,#:>:
 xD>65 ^=P~
v,-\+**<  v

슬프게 만 소문자에 대해서만 몇 가지 작업을 수행합니다.

그것이하는 일

정상적으로 실행되면 입력 에서 시저 암호 를 수행합니다 .

abcxyz      -> bcdyza
exampletext -> fybnqmfufyu

수평으로 뒤집 으면 상기 암호가 반대로됩니다. 이것이 도전의 요구 사항이지만 여기서 끝나지는 않습니다.

bcdyza      -> abcxyz
fybnqmfufyu -> exampletext

수직으로 뒤집 으면 반전 알파벳으로 입력이 암호화됩니다. 이것은 시저 암호에 대한 반대 접근법으로 간주 될 수 있습니다.

abcxyz      -> zyxcba
exampletext -> vcznkovgvcg

마지막으로 180도 회전하면 입력이 반대로됩니다. 나는 무언가의 반전이어야한다고 생각합니다 (힌트 : 입력).

abcxyz      -> zyxcba
exampletext -> txetelpmaxe

작동 원리

이 블록은 기본적으로 네 개의 반 중첩 알고리즘으로 구성됩니다.

시저 암호 인코더

v$,g6<
v,$ _^
1 >v\
~ +:1
+ 00-
>:|6g
{a@>^

시저 암호 해독기 (가로로 ipped)

v$,g6<
v,$ _^
1 >v\
~ -:1
+ 20-
>:|6g
`z@>^

역 알파벳 암호 (수직 뒤집기)

v,-\+**<
   >65 ^
~>7^
:^9<
>1+|@
   >^

텍스트 반 전기 (180도 회전)

v  <
~      
:>:#,_@
1^  <
>+ |$
   >^

2
Befunge가 여기에 약간의 이점이 있다고 생각합니다. 항상 왼쪽 위 사분면을 사용하고 나머지 코드의 내용을 완전히 무시할 수 있기 때문입니다. 그래도 좋은 일입니다!
Martin Ender

1
와! 비록 내가 3 위로 떨어 졌다는 것을 의미하지만, 나는 이것을지지해야한다.
Level River St

18

Brainfuck, 5

,+.-,

아마도 처음으로 Brainfuck은 코드 길이에 대해 경쟁력있는 답변을 생성합니다. 코드 골프 질문이 아닙니다.

바이트 (문자)를 입력하고 증가시킨 다음 결과를 출력합니다. 끝에있는 쉼표는 다른 입력을 기다리는 중이며 주어진 경우 무시됩니다. 올바른 종료에 대한 사양에는 아무것도 없습니다 :-) *

* (또는 양방향으로 모든 코드에서 유용한 것을 수행하는 것에 대해)

일반적인 결과 (주어진 경우 두 번째 문자는 무시 됨).

앞으로 : B->C

역전 : B-> A또는 C->B


11

놀라운

다음은 우리를 시작하는 간단한 것입니다. STDIN에서 하나의 문자를 읽고 증분하여 인쇄합니다.

--
]]
00
]]
++

이것을 스왑 브래킷없이 180 ° 회전 시키거나 x 축에 대칭 시키면

++
]]
00
]]
--

STDIN에서 바이트를 읽고 감소시킵니다.

여기서 테스트 할 수 있습니다 .

좀 더 복잡한 Marbelous 프로그램을 살펴볼 수도 있지만 es1024가 나를 이길 것이라고 확신합니다. ;)

설명

00(임의로) 값 0 대리석이다. ]]장치가 STDIN에서 바이트 읽기 - 대리석은 그들을 통해 떨어지는 경우입니다, 대리석의 값은 읽기 바이트로 변경됩니다. ++--장치를 간단하게 증가 또는 (256 모드) 대리석의 값을 감소 및하자 그것을 통해 가을. 대리석이 보드에서 떨어지면 바이트가 STDOUT에 기록됩니다.

따라서 제어 흐름이 해당 장치에 도달하지 않기 때문에 상단의 두 장치는 단순히 무시됩니다.


또는 세 개의 가운데 행을 단일 입력 장치로 바꿀 수 있습니다.
오버 액터

@overactor 아니면 서브 보드로 }0사용 하시겠습니까?
Martin Ender

}0정확한 명령 행 입력으로.
overactor

5

놀라운

이 보드는 하나의 인수 ( x)를 취하고를 반환합니다 (101 * x) mod 256.

.. @5 .. }0 }0 @1 .. @0 .. @2 .. 
.. /\ Dp << \\ .. &0 >0 &1 .. .. 
!! @3 .. << }0 .. \/ -- \/ .. }0 
@4 .. .. &0 @1 /\ &0 65 &1 /\ @2 
/\ Dp .. @4 .. .. @3 @0 @5 !! \\

y 축을 따라 을 미러링하면 하나의 인수 ( y)를 취하고을 반환 하는 보드가 생겨 (101 * y + 8 * y) mod 256첫 번째 보드의 역수입니다.

.. @2 .. @0 .. @1 }0 }0 .. @5 ..
.. .. &1 >0 &0 .. \\ << Dp /\ ..
}0 .. \/ -- \/ .. }0 << .. @3 !!
@2 /\ &1 65 &0 /\ @1 &0 .. .. @4
\\ !! @5 @0 @3 .. .. @4 .. Dp /\

여기서 이것을 테스트하십시오 . 원통형 보드 및 라이브러리 포함을 모두 확인해야합니다.

입력 / 출력 예 :

Original Board:      Mirrored Board:
Input   Output       Input    Output
025     221          221      025
042     146          146      042
226     042          042      226

Marbelous는 양의 정수만 인수로 전달할 수 있으며이 정수는 인터프리터에 의해 프로그램 모듈로 256에 전달됩니다.

101는 두 가지 이유로 선택되었습니다. 이는 소수 (및이 프로그램에 대한 모든 가능한 입력은 고유 한 출력을 생성 함)와 관련된 역 연산 109입니다 101.

간단한 설명

셀을 포함하는 열 (위에서 아래로) @0 >0 -- 65 @0은 두 보드에서 동일하게 실행되며 101오른쪽으로 향하기 전에 시간을 반복 합니다. >0브랜치 의 양쪽에는 다른 동기화 기가 있습니다. 어느 것이 선택되는지는 보드의 미러링 여부에 따라 다릅니다.

양쪽에서 중앙 루프와 동기화하여 입력이 반복적으로 합산되어를 얻습니다 101*x mod 256. 반전 된 보드에서 두 개의 입력 사본도 왼쪽 ( input * 4) 으로 두 번 비트 시프트 된 다음 동기기에서 합산되어 왼쪽으로 이동합니다.

중앙 루프가 완료되면 보드의 측면에있는 인쇄용으로 요약 된 구슬이 전송됩니다 (원본 보드의 경우 왼쪽, 미러의 경우 오른쪽). 인쇄 후 !!셀에 도달하여 보드를 종료합니다. 제공 한 루프 101 * x는 보드가 종료 될 때까지 계속 실행됩니다.

Dp 단순히 결과를 10 진수로 인쇄합니다.


5

테세우스

이것은 허점으로 간주 될 수 있지만 언어가 마음에 듭니다. 이 프로그램은 n 마다 3n ~ 3n + 1 , 3n + 1 ~ 3n + 23n + 2 ~ 3nf 을 매핑하는 자연수에 대한 함수 를 정의합니다 .

data Num = Zero | Succ Num

iso f :: Num <-> Num
  | n                          <-> iter $ Zero, n
  | iter $ m, Succ Succ Succ n <-> iter $ Succ m, n
  | iter $ m, Succ Succ Zero   <-> back $ m, Zero
  | iter $ m, Succ Zero        <-> back $ m, Succ Succ Zero
  | iter $ m, Zero             <-> back $ m, Succ Zero
  | back $ Succ m, n           <-> back $ m, Succ Succ Succ n
  | back $ Zero, n             <-> n
  where iter :: Num * Num
        back :: Num * Num

테세우스 는 하스켈과 유사한 구문을 가진 가역적 언어로, 모든 함수가 뒤집을 수없는 (종료되지 않은 문제는 제외) 매우 실험적이며 연구 목적으로 설계되었습니다. 위의 코드는 자연수에 대한 데이터 유형과 함수를 정의합니다 f. 입력 번호가 주어지면 왼쪽에서 패턴과 일치합니다 (항상 일치합니다 n). 그런 다음 오른쪽의 패턴을 봅니다. 해당 패턴에 레이블이있는 경우 (여기iter)의 경우 왼쪽에서 패턴 일치를 진행하고 오른쪽에서 해당 값을 다시 가져옵니다. 이것은 오른쪽에 레이블이없는 값이 될 때까지 반복되며 출력입니다. 왼쪽과 오른쪽의 패턴은 철저하고 겹치지 않아야합니다 (각 레이블마다 따로 따로). 이제의 "극성을 바꾸려면" f다음을 수행합니다.

  • 모든 레이블의 두 값을 교환하십시오. 이것의 의미는 바뀌지 않습니다 f.
  • 기능 바디에서 오른쪽과 왼쪽을 교환하십시오. 이것은 f 설계의한 역함수를 정의합니다 .

결과:

iso f :: Num <-> Num
  | iter $ n, Zero             <-> n
  | iter $ n, Succ m           <-> iter $ Succ Succ Succ n, m
  | back $ Zero, m             <-> iter $ Succ Succ Zero, m
  | back $ Succ Succ Zero, m   <-> iter $ Succ Zero, m
  | back $ Succ Zero, m        <-> iter $ Zero, m
  | back $ Succ Succ Succ n, m <-> back $ n, Succ m
  | n                          <-> back $ n, Zero
  where iter :: Num * Num
        back :: Num * Num

3

tr

a b

예:

$ echo "apple" | tr a b
bpple
$ echo "bpple" | tr b a
apple

'a'와 'b'를 모두 포함하지 않는 문자열의 도메인에서 진정한 역수입니다.


실제로 도메인을 그보다 조금 더 제한해야합니다. 예를 들어, "bog"로 시작하면 프로그램과 그 반대로 "bog"-> "bog"-> "aog"를 제공합니다. 따라서 'b'를 포함하는 문자열은 문제가됩니다 (또는 역 프로그램을 먼저 적용하는 경우 'a'를 포함 함).
user19057

tr abc bca역 극성 버전과 함께 사용할 수 있습니다 tr acb cba.
Christian Sievers

2

또 다른 놀라운 답변

원래 오른쪽은 명령 행 입력 (8 비트 값)을 이동 시키며, 시프트하여 1이 손실되면 맨 앞에 추가합니다. ( 0000 0001 -> 1000 0000)

{0 ..
~~ ..
>> {0
-2 =0
.. ^0
\/ }0
}0 Sb
<< ..
\\ ..
:Sb
// ..
Sb >>
}0 ..
^7 }0
{0 \/

이 보드를 180 ° 회전 (그러나 각 셀의 내용은 동일하게 유지) 왼쪽으로 이동하도록 프로그램을 변경합니다 ( 1000 0000 -> 0000 0001)

\/ {0
}0 ^7
.. }0
>> Sb
.. //
:Sb
.. \\
.. <<
Sb }0
}0 \/
^0 ..
=0 -2
{0 >>
.. ~~
.. {0

여기서 테스트 할 수 있습니다 . ( '출력을 10 진수로 표시'를 켜야합니다)

설명

두 프로그램 모두 메인 보드 (명령 행 입력을 얻음)와와 같은 두 개의 보드로 구성됩니다 Sb. 메인 보드의 두 가지 버전을 살펴보고 각 방향으로 도달 할 수있는 셀만 봅니다 (대리석은 일반적으로 위쪽으로 갈 수없고 입력 장치가 맨 위에 있지 않기 때문에).

original:      flipped:
   }0          }0
}0 Sb          .. }0
<< ..          >> Sb
\\ ..          .. //

그것들은 매우 간단한 보드이며, 두 개의 입력 사본 ( }0셀 대신 사용) . 원본은 하나의 버전을 왼쪽 시프트 장치에 공급 <<하고 뒤집힌 버전은 오른쪽 시프트 장치에 넣습니다 >>. 비트 시프트를 수행하지만 불행히도 로스트 비트 Sb보드가 들어오는 곳에서 보드는 공급되는 값을 비트 시프 팅하여 비트가 손실되는지 확인하고 결과에 추가 될 값을 반환하여 로스트 비트를 방지합니다.

다음 Sb은 원래 프로그램에 대한 원래 보드 의 관련 부분입니다 .

}0
^7
{0

`^ 7 '은 가장 중요한 비트의 값을 확인합니다. 이 값이 1이면 왼쪽 이동을 수행하면이 비트가 손실됩니다. 따라서이 보드는이 비트의 값을 8 비트 값으로 출력하여 비트 시프트 결과에 추가됩니다.

반전 된 버전, Sb최하위 비트와 수익을보고있다 128거나 0,이 조금 더 복잡하다 :

}0
^0 ..
=0 -2
{0 >>
.. ~~
.. {0

에서 테스트 한 최하위 비트 ^0가 0이면 0 만 반환합니다 . 1 인 ^0경우을 출력 1합니다. 이것은 평등 테스트에 실패 0 =0하고 오른쪽으로 밀립니다. 우리는 -2255를 얻기 위해 2 를 빼고 >>127을 얻기 위해 왼쪽으로 시프트 하고 ~~128을 얻지 않기 위해 바이너리를 수행합니다 ( ++128을 얻기 위해 하나 를 추가 할 수도 있었지만 그 재미는 어디에 있습니까?)

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