바나 흐-타르 스키 역설


16

Banach-Tarski 역설은 3 차원 공간에 공이 주어지면 공을 유한 한 수의 포인트 하위 집합으로 분해 할 수 있다고 말합니다. 그런 다음이 분리 된 지점 세트를 재 조립하여 초기 공의 두 사본을 생성 할 수 있습니다. 그러면 이론적으로 두 개의 동일한 공이 생깁니다.

리 어셈블리 과정은 위에서 언급 한 점 서브 세트를 이동하고 회전하면서 공간적 모양을 변경하지 않는 것으로 구성됩니다. 이 작업은 5 개의 분리 된 하위 집합으로 수행 할 수 있습니다.

분리 세트에는 정의에 따라 공통 요소가 없습니다. 어디 AB초기 공 두 점 집합 사이의 공통 요소 AB빈 집합입니다. 이것은 다음 방정식으로 표시됩니다.

LaTeX 표현

아래의 분리 세트의 경우 공통 멤버는 빈 세트를 형성합니다.

LaTeX 표현


도전

입력 ASCII "ball"을 가져 와서 중복 된 "ball"을 출력 할 수있는 프로그램을 작성하십시오.


입력

입력 공의 예는 다음과 같습니다.

      ##########      
   ###@%$*.&.%%!###   
  ##!$,%&?,?*?.*@!##  
 ##&**!,$%$@@?@*@&&## 
#@&$?@!%$*%,.?@?.@&@,#
#,..,.$&*?!$$@%%,**&&#
 ##.!?@*.%?!*&$!%&?## 
  ##!&?$?&.!,?!&!%##  
   ###,@$*&@*,%*###   
      ##########      

각 구는 파운드 기호 ( #)로 표시되며 다음 문자로 채워집니다 .,?*&$@!%. 모든 입력은 22x10 문자입니다 (높이 별 너비).


복제물 만들기

먼저, 볼 내부의 각 포인트에는의 인덱스를 기준으로 번호가 매겨진 포인트가 부여됩니다 .,?*&$@!%. 위의 예는 번호가 매겨진 예입니다.

      ##########      
   ###7964151998###   
  ##86295323431478##  
 ##5448269677374755## 
#75637896492137317572#
#21121654386679924455#
 ##1837419384568953## 
  ##85363518238589##  
   ###2764574294###   
      ##########      

그런 다음 각 점이 1 위로 이동합니다 (9는 1로 이동).

      ##########      
   ###8175262119###   
  ##97316434542589##  
 ##6559371788485866## 
#86748917513248428683#
#32232765497781135566#
 ##2948521495679164## 
  ##96474629349691##  
   ###3875685315###   
      ##########      

마지막으로, 각각의 새로운 포인트 값은 해당 문자로 다시 변환됩니다.

      ##########      
   ###!.@&,$,..%###   
  ##%@?.$*?*&*,&!%##  
 ##$&&%?@.@!!*!&!$$## 
#!$@*!%.@&.?,*!*,!$!?#
#?,,?,@$&*%@@!..?&&$$#
 ##,%*!&,.*%&$@%.$*## 
  ##%$*@*$,%?*%$%.##  
   ###?!@&$!&?.&###   
      ##########      

산출

그런 다음이 두 볼은이 형식으로 나란히 출력됩니다 (방정식에서 4 개의 공백으로 구분).

      ##########                ##########      
   ###@%$*.&.%%!###          ###!.@&,$,..%###   
  ##!$,%&?,?*?.*@!##        ##%@?.$*?*&*,&!%##  
 ##&**!,$%$@@?@*@&&##      ##$&&%?@.@!!*!&!$$## 
#@&$?@!%$*%,.?@?.@&@,#    #!$@*!%.@&.?,*!*,!$!?#
#,..,.$&*?!$$@%%,**&&#    #?,,?,@$&*%@@!..?&&$$#
 ##.!?@*.%?!*&$!%&?##      ##,%*!&,.*%&$@%.$*## 
  ##!&?$?&.!,?!&!%##        ##%$*@*$,%?*%$%.##  
   ###,@$*&@*,%*###          ###?!@&$!&?.&###   
      ##########                ##########      

참고 : 포인트 값 및 이후 문자 이동은 포인트 하위 집합 (문자 그룹화)을 재 조립하기 위해 수행 된 회전을 상징합니다.


인접해야합니까? 그들은 서로 위에 출력 될 수 있습니까?
Mhmd

인접 해 있어야합니다. 22x10 블록 2 개는 수평으로 4 칸 분리해야합니다. @Mhmd
Zach Gates

프로그램에서 기능이 허용됩니다. 그러나 프로그램은 (사용자 입력으로) 자체적으로 실행되어야합니다. @ETHproductions
Zach Gates

두 볼을 모두 회전 시켜서는 안됩니까? 정리를 이해하면 원본은 그대로 유지되지만 새 공이 두 개 생깁니다.
Paŭlo Ebermann

예, 그러나 편집을 할 수 있기 전에 답변이 제출되었으며 솔루션을 무효화하고 싶지 않았습니다. @ PaŭloEbermann
Zach Gates

답변:


7

Pyth, 21 바이트

#++Jw*4d.rJ".,?*&$@!%

온라인으로 사용해보십시오 : 데모

마지막으로의 유스 케이스입니다 .r.

설명

#++Jw*4d.rJ".,?*&$@!%
#                       infinite loop
   Jw                   read a string from input and store it in J
     *4d                4 spaces
        .rJ".,?*&$@!%   rotate the chars of J using this char order
 ++                     combine the 3 strings (J, spaces, rotated) and print

사용 가능한 입력이 더 이상 없으면 무한 루프가 끊어집니다.


7

루비, 65

10.times{b=gets;puts b.chop.tr(',?*&$@!%.','.,?*&$@!%')+'    '+b}

stdin 대신 파일에서 입력을 가져올 때 효과적입니다.

ruby banach.rb < ball.txt

반면에 수동으로 공을 입력하고 마지막에 출력을 원한다면이 67 바이트 버전을 사용해보십시오.

puts (0..9).map{b=gets;b.chop.tr(',?*&$@!%.','.,?*&$@!%')+'    '+b}

6

MATLAB, 120

Matlab은 문자열 처리에 가장 적합한 언어는 아닙니다. \n는 항상 두 문자로 간주되며 상당히 성가 시며 줄 바꿈 (줄 바꿈) 문자열에서 행렬을 만들 수는 없으며 수동으로해야합니다. 모든 줄의 길이가 똑같기 때문에 적어도 크기 / 패딩에 신경 쓰지 않아도됩니다.

a='.,?*&$@!%.';b=input('');b(b>90)=[];b=reshape(b',22,10)';c=b;for k=1:9;c(b==a(k))=a(k+1);end;disp([b,ones(10,4)*32,c])

입력 예 :

'      ##########      \n   ###@%$*.&.%%!###   \n  ##!$,%&?,?*?.*@!##  \n ##&**!,$%$@@?@*@&&## \n#@&$?@!%$*%,.?@?.@&@,#\n#,..,.$&*?!$$@%%,**&&#\n ##.!?@*.%?!*&$!%&?## \n  ##!&?$?&.!,?!&!%##  \n   ###,@$*&@*,%*###   \n      ##########      '

출력 예 :

      ##########                ##########      
   ###@%$*.&.%%!###          ###!.@&,$,..%###   
  ##!$,%&?,?*?.*@!##        ##%@?.$*?*&*,&!%##  
 ##&**!,$%$@@?@*@&&##      ##$&&%?@.@!!*!&!$$## 
#@&$?@!%$*%,.?@?.@&@,#    #!$@*!%.@&.?,*!*,!$!?#
#,..,.$&*?!$$@%%,**&&#    #?,,?,@$&*%@@!..?&&$$#
 ##.!?@*.%?!*&$!%&?##      ##,%*!&,.*%&$@%.$*## 
  ##!&?$?&.!,?!&!%##        ##%$*@*$,%?*%$%.##  
   ###,@$*&@*,%*###          ###?!@&$!&?.&###   
      ##########                ##########      

추신 : 내가 이런 식으로 입력을 가정 할 수 있다면 :

['      ##########      ','   ###@%$*.&.%%!###   ','  ##!$,%&?,?*?.*@!##  ',' ##&**!,$%$@@?@*@&&## \n#@&$?@!%$*%,.?@?.@&@,#','#,..,.$&*?!$$@%%,**&&#',' ##.!?@*.%?!*&$!%&?## ','  ##!&?$?&.!,?!&!%##  ','   ###,@$*&@*,%*###   ','      ##########      ']

88 자만 있으면됩니다.

a='.,?*&$@!%.';b=input('');c=b;for k=1:9;c(b==a(k))=a(k+1);end;disp([b,ones(10,4)*32,c])

4

루비, 102

IO.readlines(?a).map(&:chomp).each{|x|puts"#{x+' '*x.count(' ')+?\s*4+x.tr('.,?*&$@!%',',?*&$@!%.')}"}

기본적으로 tr입력 만 호출


4

sed (39 바이트)

h;y/.,?*&$@!%/,?*&$@!%./;H;x;s/\n/    /

4

CJam, 28 바이트

qN/{_".,?*&$@!%"_(+erS4*\N}%

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

설명:

qN/     Get input and split into lines.
{       Start loop over lines.
  _       Copy, since we need to output original.
  ".,?*&$@!%"
          List of characters, in order.
  _       Copy list of characters.
  (+      Rotate the list by popping first character and appending it.
  er      Transliterate.
  S4*     Create 4 spaces.
  \       Swap spaces between original and transliteration.
  N       Add newline.
}%      End of loop over lines.

4

파이썬 3.5, 96 89 88 바이트

s='.,?*&$@!%.  ##';i=1
while i:i=input();print(i,'  ',''.join(s[s.find(y)+1]for y in i))

파이썬 3.3, 103 96 95 바이트

s='.,?*&$@!%.  ##'
for i in input().split('\n'):print(i,'  ',''.join(s[s.find(y)+1]for y in i))

설명

IDLE에서 줄input() 바꿈 처리 하는 방식 이 변경 되었으므로 Python 3.3과 3.5는 별도로 나열됩니다 . 이것은 8 바이트를 절약하기 위해 발생했습니다.

실행시 참고 사항 : IDLE을 사용하십시오. 터미널을 사용하는 경우 3.3에 대한 솔루션은 3.5와 동일하지만 둘 다 입력과 출력을 인터리브합니다.

s파이썬의 음수 인덱싱을 이용하기 위해 기호 문자열 을 뒤집 었습니다 . 그런 다음 입력의 각 줄에 대해 두 개의 공백을 출력하고 각 기호가있는 줄은 이전 기호로 바꿨습니다. 두 개의 공백 만 넣는 이유는 ,대신 대신 사용했기 때문에 +인쇄 된 출력에 공백이 추가되기 때문입니다. 이것은 ,' ',나를 바이트 이상 절약했다 +' '*4+.

7 8 바이트 를 절약 해 준 xsot 에게 감사 합니다. 나는 바꿨다s.find 하는 s.rfind나에게로 공간과 해시를 넣을 수 있도록 s하여에 대한 검사를 할 필요성을 제거 y in s. 또한 공간이 절약되었습니다. 편집 : 지금 s.find존재 ##하면 +1범위 초과 오류에 대해 걱정하지 않아도됩니다.


어떻게 input()바뀌 었는지 설명해 주시겠습니까 ? 3.43.5 설명서의 차이점을 찾을 수 없습니다 .
케빈

입력 문자열의 줄 바꿈은 입력을 "종료"하여 입력 코드를 다시 호출합니다. Python 3.3에서는 줄 바꿈이 그대로 전달됩니다. 변경 사항은 3.3과 3.4 사이 여야합니다.
El'endia Starman

아니요, 3.3 문서 도 동일합니다. 이것은 아마도 버전 범프에서 readline 변경이라고 생각합니다. readline없이 컴파일하면 차이가 없을 수도 있습니다.
Kevin

유휴를 사용하므로 오류가있을 수 있습니다. 터미널에서 실행 해 보겠습니다.
El'endia Starman

@ 케빈 : 얼마나 흥미 롭습니다. 입력이 출력에 인터리브 되지만 명령 행에서 3.5에서 올바르게 작동 합니다. 3.3의 경우 첫 번째 줄 바꿈 직후에 중단됩니다. 텍스트 전체를 복사하여 붙여 넣었습니다.
El'endia Starman

3

망막 , 45 39 바이트

.+
$0  ; $0
T`.,?*&$@!%;`,?*&$@!%. `;.*

단일 파일에서 코드를 실행하려면 -s플래그를 사용하십시오 .

첫 번째 단계는으로 구분 된 각 줄을 복제 " ; "하여

      ##########        ;       ##########
   ###@%$*.&.%%!###     ;    ###@%$*.&.%%!###
  ##!$,%&?,?*?.*@!##    ;   ##!$,%&?,?*?.*@!##
 ##&**!,$%$@@?@*@&&##   ;  ##&**!,$%$@@?@*@&&##
#@&$?@!%$*%,.?@?.@&@,#  ; #@&$?@!%$*%,.?@?.@&@,#
#,..,.$&*?!$$@%%,**&&#  ; #,..,.$&*?!$$@%%,**&&#
 ##.!?@*.%?!*&$!%&?##   ;  ##.!?@*.%?!*&$!%&?##
  ##!&?$?&.!,?!&!%##    ;   ##!&?$?&.!,?!&!%##
   ###,@$*&@*,%*###     ;    ###,@$*&@*,%*###
      ##########        ;       ##########

그런 다음 두 번째 단계는와 일치하는 문자 ;.*, 즉 각 줄의 두 번째 절반 에만 영향을주는 문자에만 영향을줍니다 . 그런 다음 해당 문자는 다음과 같은 통신을 통해 음역됩니다.

.,?*&$@!%;
,?*&$@!%. 

처음 9 쌍이 공의 문자를 "증가"시키고 마지막 쌍이 세미콜론을 다른 공간으로 바꿉니다.


2

파이썬 2, 77 바이트

while 1:r=raw_input();print r,'  ',r.translate(' % #@.$   & ? , '*3+'!*'*104)

2

펄, 59 바이트

56 바이트 코드 + 3 바이트 ( -p파일에 저장해야 함).

chop($s=$_);$l=',?*&$@!%';eval"y/.$l/$l./";$_="$s    $_"

사용법 예 :

$perl -p ball.pl <<< '      ##########      
>    ###@%$*.&.%%!###   
>   ##!$,%&?,?*?.*@!##  
>  ##&**!,$%$@@?@*@&&## 
> #@&$?@!%$*%,.?@?.@&@,#
> #,..,.$&*?!$$@%%,**&&#
>  ##.!?@*.%?!*&$!%&?## 
>   ##!&?$?&.!,?!&!%##  
>    ###,@$*&@*,%*###   
>       ##########      
> '
      ##########                ##########      
   ###@%$*.&.%%!###          ###!.@&,$,..%###   
  ##!$,%&?,?*?.*@!##        ##%@?.$*?*&*,&!%##  
 ##&**!,$%$@@?@*@&&##      ##$&&%?@.@!!*!&!$$## 
#@&$?@!%$*%,.?@?.@&@,#    #!$@*!%.@&.?,*!*,!$!?#
#,..,.$&*?!$$@%%,**&&#    #?,,?,@$&*%@@!..?&&$$#
 ##.!?@*.%?!*&$!%&?##      ##,%*!&,.*%&$@%.$*## 
  ##!&?$?&.!,?!&!%##        ##%$*@*$,%?*%$%.##  
   ###,@$*&@*,%*###          ###?!@&$!&?.&###   
      ##########                ##########      

1

05AB1E (레거시) , 21 바이트

|ʒD4ú".,?*&$@!%"DÀ‡«,

레거시 버전 05AB1E를 사용합니다. 필터 ʒ를 암시 적 y으로 foreach로 사용하여 인쇄 할 수 있었지만 새 버전에서는 v명시 적으로y 사용해야합니다 (1 바이트 더 .

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

설명:

|                      # Get the input-lines as list
 ʒ                     # For-each over the lines to print using the filter-builtin:
  D                    #  Duplicate the current line
   4ú                  #  Prepend 4 spaces to this copy
     ".,?*&$@!%"       #  Push this string
                DÀ     #  Duplicate it, and rotate its copy once towards the left
                      #  Transliterate the space-prepended string with these two strings
                   «   #  Append it to the original duplicated line
                    ,  #  And print with trailing newlines

도에 05AB1E (신용의 새 버전에서 작동 다음 버전 @Grimy ) :

05AB1E , 21 바이트

TFD?4ú".,?*&$@!%"DÀ‡,

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

설명:

TF                     # Loop 10 times:
  D                    #  Duplicate the (implicit) input-line
   ?                   #  Pop and print the copy without trailing newline
    4ú                 #  Prepend 4 spaces to the input-line
      ".,?*&$@!%"      #  Push this string
                 DÀ    #  Duplicate it, and rotate its copy once towards the left
                      #  Transliterate the space-prepended string with these two strings
                    ,  #  And print with trailing newlines

1
비 레거시 21 : TFD?4ú".,?*&$@!%"DÀ‡,(입력은 정확히 10 줄이어야합니다).
그리미

1
@ 그림은 그것을 추가합니다. 또한 너비가 26 자임을 보장하기 때문에 ₂j(같은 바이트이지만) 좋은 대안입니다 . :)
Kevin Cruijssen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.