Banach – Tarski Paradox


16

Banach – Tarski บุคคลที่ผิดธรรมดากล่าวว่าได้รับลูกบอลในพื้นที่ 3 มิติคุณสามารถย่อยสลายลูกบอลเป็นจำนวนจุดย่อยที่แน่นอน ชุดจุดที่แยกออกจากกันเหล่านี้สามารถประกอบขึ้นใหม่เพื่อผลิตลูกบอลเริ่มต้นสองชุด ในทางทฤษฎีแล้วคุณมีลูกบอลสองลูกที่เหมือนกัน

กระบวนการประกอบใหม่ประกอบด้วยการเคลื่อนย้ายเซ็ตย่อยของจุดดังกล่าวและหมุนมันในขณะที่ไม่เปลี่ยนรูปร่างพิเศษ ซึ่งสามารถทำได้ด้วยชุดย่อยที่แยกออกเพียงห้าชุด

ชุดที่แยกจากกันไม่มีองค์ประกอบทั่วไปตามคำนิยาม ที่ใดAและBเป็นสองจุดย่อยของลูกบอลเริ่มต้นองค์ประกอบทั่วไประหว่างAและBเป็นชุดที่ว่างเปล่า นี่แสดงในสมการต่อไปนี้

การเป็นตัวแทนของ LaTeX

สำหรับชุดที่แยกออกจากกันด้านล่างสมาชิกทั่วไปจะสร้างชุดว่าง

การเป็นตัวแทนของ LaTeX


ความท้าทาย

เขียนโปรแกรมที่สามารถรับ ASCII "บอล" และส่งออก "บอล" ซ้ำ


อินพุต

นี่คือตัวอย่างอินพุตบอล:

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

แต่ละทรงกลมที่ระบุไว้โดยสัญญาณปอนด์ ( #) และเต็มไปด้วยตัวอักษรใด ๆ .,?*&$@!%วิทยานิพนธ์: ทุกอินพุตจะเป็นอักขระ 22x10 (ความกว้างความสูง)


การสร้างซ้ำ

.,?*&$@!%ครั้งแรกจุดภายในลูกแต่ละคนจะได้รับจุดเลขบนพื้นฐานของดัชนีใน นี่คือตัวอย่างข้างต้นเมื่อได้หมายเลขแล้ว:

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

จากนั้นแต่ละจุดจะเลื่อนขึ้นหนึ่ง (เก้าไปเป็นหนึ่ง):

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

ในที่สุดค่าจุดใหม่แต่ละค่าจะถูกแปลงกลับไปเป็นอักขระที่เกี่ยวข้อง:

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

เอาท์พุต

ลูกบอลสองลูกนี้จะถูกเอาท์พุทแบบเคียงข้างกันในรูปแบบนี้ (คั่นด้วยช่องว่างสี่จุดที่เส้นศูนย์สูตร):

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

หมายเหตุ: การเลื่อนค่าจุดและอักขระในภายหลังเป็นสัญลักษณ์ของการหมุนที่ดำเนินการเพื่อประกอบชุดย่อยของจุดอีกครั้ง (การจัดกลุ่มอักขระ)


มันจะต้องอยู่ติดกัน? พวกเขาสามารถถูกส่งออกเหนือแต่ละอื่น ๆ ?
Mhmd

พวกเขาจะต้องอยู่ติดกัน บล็อก 22x10 สองบล็อกควรคั่นในแนวนอนด้วยช่องว่าง 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

ในทางกลับกันหากคุณต้องการพิมพ์ลูกเพื่อ stdin ด้วยตนเองและต้องการเอาท์พุทในตอนท้ายลองรุ่น 67- ไบต์นี้:

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

6

Matlab, 120

Matlab ไม่ใช่ภาษาที่ยิ่งใหญ่ที่สุดสำหรับการจัดการสตริง \nถูกพิจารณาว่าเป็นตัวละครสองตัวเสมอซึ่งค่อนข้างน่ารำคาญและคุณไม่สามารถสร้างเมทริกซ์จากสตริงที่แบ่งบรรทัด (line-broken)? คุณต้องทำมันเอง อย่างน้อยฉันก็ไม่ต้องสนใจเรื่องขนาด / การขยายเนื่องจากทุกบรรทัดมีความยาวเท่ากัน

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

Python 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 แสดงรายการแยกต่างหากเนื่องจากวิธีการขึ้นinput()บรรทัดใหม่ใน IDLEเปลี่ยนไป เรื่องนี้เกิดขึ้นเพื่อประหยัด 8 ไบต์ซึ่งเจ๋งมาก

หมายเหตุเกี่ยวกับการดำเนินการ: ใช้ IDLE หากคุณใช้เทอร์มินัลโซลูชันสำหรับ 3.3 จะเหมือนกับ 3.5 แต่ทั้งคู่สอดแทรกอินพุตด้วยเอาต์พุต

ฉันสลับสตริงสัญลักษณ์sเพื่อใช้ประโยชน์จากการจัดทำดัชนีเชิงลบของ Python จากนั้นสำหรับแต่ละบรรทัดในอินพุตฉันเอาท์พุทสองช่องว่างและบรรทัดที่มีสัญลักษณ์แต่ละอันถูกแทนที่ด้วยสัญลักษณ์ก่อนหน้า เหตุผลที่ฉันใส่เพียงสองช่องว่างคือฉันใช้,แทน+ซึ่งเพิ่มช่องว่างให้กับงานพิมพ์ นี้ ( ,' ',) +' '*4+บันทึกฉันไบต์มากกว่า

ขอบคุณ xsotสำหรับการบันทึกฉัน7 8 ไบต์ ผมเปลี่ยนs.findไปs.rfindเพื่อให้ฉันไปใส่ช่องว่างและแฮชเข้าจึงไม่จำเป็นต้องที่จะทำเช็คs y in sนอกจากนี้ยังมีการบันทึกพื้นที่ แก้ไข: เปลี่ยนกลับเป็นs.findเพราะการปรากฏตัวของ##ตอนนี้ช่วยให้ฉัน+1โดยไม่ต้องกังวลเกี่ยวกับข้อผิดพลาดดัชนีออกนอกขอบเขต


คุณจะอธิบายความinput()เปลี่ยนแปลงได้อย่างไร? ฉันไม่สามารถพบความแตกต่างใด ๆ ระหว่าง3.4และ3.5เอกสาร
เควิน

ขึ้นบรรทัดใหม่ในสตริงอินพุต "ยุติ" อินพุตดังนั้นเพื่อพูดและเรียกรหัสอินพุตของคุณอีกครั้ง ใน Python 3.3 บรรทัดใหม่จะถูกส่งผ่านเหมือนเดิม การเปลี่ยนแปลงจะต้องอยู่ระหว่าง 3.3 ถึง 3.4
El'endia Starman

ไม่เลย, 3.3 เอกสารก็เหมือนกัน ฉันเดาว่านี่เป็นการเปลี่ยนแปลง readline ซึ่งอาจมาจากการชนของเวอร์ชัน หากคุณคอมไพล์โดยไม่มี readline คุณอาจไม่เห็นความแตกต่าง
เควิน

ฉันใช้ IDLE ดังนั้นอาจผิดพลาดได้ ฉันจะลองเรียกใช้จากเทอร์มินัล
El'endia Starman

@ เควิน: น่าสนใจแค่ไหน จากบรรทัดคำสั่งจะทำงานได้อย่างถูกต้องใน 3.5 แม้ว่าอินพุตจะถูกอินเตอร์ลีฟกับเอาต์พุต สำหรับ 3.3 มันจะหยุดทันทีหลังจากขึ้นบรรทัดใหม่ครั้งแรก ฉันคัดลอกข้อความทั้งหมด
El'endia Starman

3

เรติน่า45 45ไบต์

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

ในการเรียกใช้รหัสจากไฟล์เดียวให้ใช้การ-sตั้งค่าสถานะ

ขั้นตอนแรกทำซ้ำแต่ละบรรทัดคั่นด้วย" ; "เพื่อรับ

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

จากนั้นสเตจที่สองจะมีผลกับตัวละครที่พบในการแข่งขัน;.*เท่านั้นคือครึ่งหลังของแต่ละบรรทัด อักขระเหล่านั้นจะถูกทับศัพท์ผ่านการโต้ตอบดังต่อไปนี้

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

ที่ 9 คู่แรก "เพิ่ม" ตัวละครในลูกบอลและคู่สุดท้ายเปลี่ยนเซมิโคลอนไปยังพื้นที่อื่น



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มีความชัดเจน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 อักขระ :)
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.