Banach-Tarski悖论


16

Banach-Tarski悖论指出,给定3维空间中的球,您可以将球分解为有限数量的点子集。然后可以将这些不相交的点集重新组合以产生两个初始球副本。从理论上讲,您将拥有两个相同的球。

重新组装的过程仅包括移动上述点子集并旋转它们,而不改变其空间形状。只需五个不相交的子集即可完成此操作。

根据定义,不相交集没有公共元素。其中AB是初始球的任意两个点子集,而A和之间的公共元素B是一个空集。在以下等式中显示。

LaTeX表示

对于下面的不交集,公共成员形成一个空集。

LaTeX表示


挑战

编写一个程序,该程序可以输入ASCII“ ball”,并输出重复的“ ball”。


输入值

这是输入球示例:

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

每个球体均以井号(#)勾勒,并填充以下任意字符:.,?*&$@!%。每个输入将为22x10字符(宽度乘高度)。


创建重复项

首先,根据其在中的索引为球内的每个点赋予一个编号的点.,?*&$@!%。这是上面的示例,曾经编号:

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

然后,将每个点上移一个(九个变为一):

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

最后,每个新的点值都将转换回其相应的字符:

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

输出量

这两个球然后以这种形式并排输出(在赤道处用四个空格隔开):

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

注意:移动点值和后面的字符是重新组合点子集(字符分组)所执行的旋转的象征。


它必须相邻吗?可以将它们输出到彼此之上吗?
Mhmd 2015年

它们必须相邻。两个22x10块应水平隔开4个空格。@Mhmd
Zach Gates

程序中允许使用功能。但是,该程序必须自己执行(使用用户输入)。@ETHproductions
Zach Gates

两个球都不应该旋转吗?据我了解,该定理并没有消失,但是您得到了两个新球。
圣保罗Ebermann

是的,但是在我有机会进行编辑之前已经提交了答案,并且我不想使任何解决方案无效。@PaŭloEbermann–
Zach Gates

Answers:


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

Ruby,65岁

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

从文件而不是标准输入中获取输入时效果很好:

ruby banach.rb < ball.txt

另一方面,如果您希望手动输入ball以输入stdin,并希望在最后输出,请尝试以下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      ##########      '

输出示例:

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

PS:如果我可以这样假设输入:

['      ##########      ','   ###@%$*.&.%%!###   ','  ##!$,%&?,?*?.*@!##  ',' ##&**!,$%$@@?@*@&&## \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

Python 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))

说明

分别列出了Python 3.3和3.5,因为更改了IDLE中input()换行的方式。这恰好节省了8个字节,这很酷。

执行注意事项:使用IDLE。如果使用端子,则3.3的解决方案与3.5相同,但是两者均使输入与输出交织。

我反转了符号字符串s以利用Python的负索引。然后,对于输入中的每一行,我将其输出两个空格,并将每个符号的行替换为其前一个符号。我只放置两个空格的原因是我使用,而不是+,这为打印输出添加了一个空格。这,' ',节省了我一个字节+' '*4+

感谢xsot为我节省了7 8个字节。我更改s.finds.rfind允许在其中放入空格和散列s,从而无需检查y in s。另外,节省了空间。编辑:更改为s.find因为##now 的存在使我+1不必担心索引越界错误。


您介意说明input()更改方式吗?我找不到3.43.5文档之间的任何区别。
凯文(Kevin)

可以这么说,输入字符串中的换行符“终止”了输入,并重新调用了输入代码。在Python 3.3中,换行符原样传递。更改必须在3.3和3.4之间。
El'endia Starman

不,3.3文档也一样。我猜想这是一个readline更改,可能来自版本颠簸。如果您在不使用readline的情况下进行编译,则可能不会注意到任何区别。
凯文

我使用IDLE,所以它也可能有问题。我将尝试从终端运行它。
El'endia Starman 2015年

@Kevin:多么有趣。在命令行中,尽管输入与输出交错,但它在3.5中仍可以正常工作。对于3.3,它在第一个换行符后立即中断。我复制粘贴了整个文本。
El'endia Starman 2015年

3

视网膜45 39字节

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

要从单个文件运行代码,请使用该-s标志。

第一阶段复制每行,用分隔" ; ",得到

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

然后,第二阶段仅影响在以下匹配项中找到的字符 ;.*,即仅每行的后半部分。然后通过以下对应关系将那些字符音译

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

前9对“增加”球中的字符,最后9对将分号转换为另一个空格。


2

Python 2,77个字节

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

2

Perl,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带有显式的实际for-each循环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行)。
Grimmy

1
@Grimy也将添加它。还发现这₂j是不错的选择(尽管是相同的字节),因为保证了宽度为26个字符。:)
凯文·克鲁伊森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.