バナッハ・タルスキのパラドックス


16

Banach–Tarskiパラドックスは、3次元空間でボールが与えられると、ボールを有限数のポイントサブセットに分解できると述べています。これらのばらばらのポイントのセットは、最初のボールの2つのコピーを作成するために再構築できます。理論的には、2つの同一のボールがあります。

再アセンブリのプロセスは、前述のポイントサブセットを移動して回転させるだけで、空間形状は変更されません。これは、わずか5つの互いに素なサブセットで実行できます。

互いに素な集合には、定義上、共通の要素はありません。ここで、A及びBイニシャルボールの任意の2点のサブセットとの間の共通要素であるAB空集合です。これは次の式で示されます。

LaTeX表現

以下の非結合セットの場合、共通メンバーは空のセットを形成します。

LaTeX表現


チャレンジ

入力ASCII「ボール」を取り、複製「ボール」を出力できるプログラムを作成します。


入力

入力ボールの例を次に示します。

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

各球体はポンド記号(#)で囲まれており、次の文字で満たされています.,?*&$@!%。すべての入力は22x10文字(幅と高さ)です。


複製を作成する

まず、ボール内の各ポイントには、のインデックスに基づいて番号付きのポイントが与えられ.,?*&$@!%ます。番号が付けられた上記の例を次に示します。

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

次に、各ポイントが1つ上にシフトされます(9つが1つに移動します)。

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

最後に、新しいポイント値はそれぞれ対応する文字に変換されます。

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

出力

これらの2つのボールは、この形式で(赤道で4つのスペースで区切られて)並んで出力されます。

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

注:ポイント値とそれ以降の文字のシフトは、ポイントサブセット(文字グループ)を再構築するために実行される回転の象徴です。


隣接している必要がありますか?それらは互いの上に出力できますか?
Mhmd

それらは隣接している必要があります。2つの22x10ブロックは、4つのスペースで水平に区切る必要があります。@Mhmd
ザック・ゲイツ

関数はプログラムで許可されています。ただし、プログラムは(ユーザー入力を使用して)単独で実行する必要があります。@ETHproductions
ザック・ゲイツ

両方のボールを回転させるべきではありませんか?私は定理を理解しているので、オリジナルは残りませんが、2つの新しいボールを取得します。
パエロエベルマン

はい。ただし、その編集を行う機会が得られる前に回答が提出されていたため、ソリューションを無効にしたくありませんでした。@PaŭloEbermann
ザック・ゲイツ

回答:


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は常に2つの文字と見なされますが、これは非常に迷惑であり、改行された(改行された)文字列からマトリックスを作成することはできません。手動で行う必要があります。すべての行の長さがまったく同じなので、少なくともサイズ/パディングを気にする必要はありませんでした。

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

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と同じですが、両方とも入力と出力をインターリーブします。

sPythonの負のインデックス付けを利用するために、シンボル文字列を逆にしました。次に、入力の各行に対して、2つのスペースを出力し、各記号が前の記号で置き換えられた行を出力します。スペースを2つだけ配置したのは、印刷出力にスペースを追加するの,代わりに使用+したためです。これ(,' ',)で1バイト節約できました+' '*4+

7 8バイトを節約してくれたxsot感謝します。スペースとハッシュを入れることができるように変更s.finds.rfindsので、チェックをする必要がなくなりましたy in s。さらに、スペースが節約されました。編集:に戻っs.findたのは、##now の存在により、+1範囲外のインデックスエラーを心配せずにできるためです。


どのようにinput()変化したかを説明してもらえますか?3.43.5のドキュメントの違いを見つけることができません。
ケビン

入力文字列の改行は、いわば入力を「終了」し、入力コードを呼び出します。Python 3.3では、改行はそのまま渡されます。変更は3.3と3.4の間でなければなりません。
エレンディアスターマン

いいえ、3.3のドキュメントも同じです。これは、おそらくバージョンバンプによるreadlineの変更だと思います。readlineなしでコンパイルする場合、違いに気付かないかもしれません。
ケビン

私はIDLEを使用しているため、障害が発生している可能性もあります。ターミナルから実行してみます。
エレンディアスターマン

@ケビン:なんて面白い。コマンドラインからは、入力は出力とインターリーブされますが、3.5では適切に動作します。3.3では、最初の改行の直後に中断します。テキスト全体をコピーアンドペーストしました。
エレンディアスターマン

3

網膜45 39バイト

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

単一のファイルからコードを実行するには、-sフラグを使用します。

最初の段階では、で区切られた各行を複製" ; "して取得します

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

次に、2番目の段階は、の一致で見つかった文字;.*、つまり各行の後半のみに影響します。これらの文字は、次の通信を介して音訳されます

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

最初の9ペアがボールのキャラクターを「インクリメント」し、最後のペアがセミコロンを別のスペースに変えます。


2

Python 2、77バイト

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

2

Perl、59バイト

-pこれをファイルに保存する必要があるため、56バイトのコードと3バイト。

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行であることが保証されています)。
グリムミー

1
@Grimyも追加します。また、幅が26文字であることが保証されている₂jため、これはの優れた(同じバイトですが)代替であることがわかりました。:)
ケビンクルーイッセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.