Парадокс Банаха – Тарського


16

Парадокс Банаха-Тарського стверджує, що, даючи кульку в тривимірному просторі, можна розкласти кулю на кінцеве число підмножин точок. Ці роз'єднані набори точок можуть бути потім зібрані для отримання двох примірників початкового кулі. Тоді ви б теоретично мали два однакові кулі.

Процес повторної збірки складається лише з переміщення вищезазначених підмножин та обертання їх, не змінюючи при цьому їх просторової форми. Це можна зробити за допомогою лише п’яти суміжних підмножин.

Набори диз'юнкту не мають загальних елементів за визначенням. Де Aі Bє будь-які дві підмножини початкового кулі, загальні елементи між Aі Bє порожнім набором. Це показано в наступному рівнянні.

Представлення LaTeX

Для розрізнених множин нижче, загальні члени утворюють порожній набір.

Представлення LaTeX


Змагання

Напишіть програму, яка може приймати вхідний ASCII «м'яч» і виводити дублікат «кулька».


Вхідні дані

Ось приклад кулі введення:

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

Кожна сфера окреслена знаками фунта ( #) і заповнена будь-який з тез символів: .,?*&$@!%. Кожен вхід буде розміром 22х10 символів (ширина по висоті).


Створення дубліката

По-перше, кожній точці всередині кулі надається нумерована точка на основі її індексу в .,?*&$@!%. Ось наведений вище приклад, колись пронумерований:

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

Потім кожна точка зміщується на одну (дев'ять йде в одну):

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

Нарешті, кожне нове значення точки перетворюється назад у відповідний символ:

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

Вихідні дані

Ці два кулі потім виводяться поруч у такому вигляді (розділені чотирма пробілами на екваторах):

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

Примітка. Зсув значень точок та пізніших символів символізує обертання, виконані для повторного збирання підмножини точок (угруповання символів).


Чи повинен він бути сусіднім? чи можна їх випередити один над одним?
Mhmd

Вони повинні бути сусідніми. Два блоки розміром 22х10 повинні бути горизонтально розділені на 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

Матлаб, 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

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. Крім того, було збережено простір. EDIT: повернено до того, s.findщо ##тепер наявність мені дозволяє +1не турбуватися про помилку індексу поза межами.


Ви б не хотіли пояснити, як input()змінилося? Я не можу знайти різниць між документацією 3.4 та 3.5 .
Кевін

Нові рядки у рядку введення "завершують" введення, так би мовити, і повторно називають ваш вхідний код. У Python 3.3 нові рядки передаються неушкодженими. Зміна повинна бути від 3,3 до 3,4.
El'endia Starman

Ні, 3,3 документа теж теж. Я здогадуюсь, що це зміна читання, ймовірно, від удару версії. Якщо ви збираєтеся без рядка читання, можливо, ви не помітите різниці.
Кевін

Я використовую IDLE, тому він також може бути винним. Спробую запустити його з терміналу.
El'endia Starman

@Kevin: Як цікаво. З командного рядка він працює належним чином у 3.5, хоча введення перемежоване з вихідним. Для 3,3 вона розбивається одразу після першого нового рядка. Я копіюю текст вклеюючи цілим.
El'endia Starman

3

Сітківка , 45 39 байт

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

Щоб запустити код з одного файлу, використовуйте -sпрапор.

Перший етап дублює кожен рядок, розділений на " ; ", щоб отримати

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

Тоді другий етап впливає лише на символи, які знаходяться у збігах ;.*, тобто лише на другій половині кожного рядка. Потім ці символи транслітеруються за допомогою наступного листування

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

Там, де перші 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в якості передбачення, тоді як для нової версії слід використовувати фактичний цикл для кожного 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 символів. :)
Кевін Кройсейсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.