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


16

Парадокс Банаха – Тарского гласит, что, имея шар в трехмерном пространстве, вы можете разложить шар на конечное число точечных подмножеств. Эти непересекающиеся наборы точек могут затем быть повторно собраны, чтобы произвести две копии исходного шара. Тогда теоретически у вас будет два одинаковых шара.

Процесс повторной сборки состоит только в перемещении вышеупомянутых точечных подмножеств и их вращении без изменения их пространственной формы. Это можно сделать всего с пятью непересекающимися подмножествами.

Непересекающиеся множества не имеют общих элементов по определению. Где Aи B- любые два точечных подмножества исходного шара, общие элементы между 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

Они должны быть смежными. Два блока 22x10 должны быть горизонтально разделены 4 пробелами. @Mhmd
— Зак Гейтс

Функции разрешены в вашей программе. Однако программа должна выполняться сама по себе (с пользовательским вводом). @ETHproductions
— Зак Гейтс,

Разве оба шара не должны вращаться? Как я понимаю из теоремы, оригинал не остается, но вы получаете два новых шара.
— Паŭло Эберманн

Да, но ответ был отправлен до того, как я получил возможность внести это изменение, и я не хотел лишать законной силы какие-либо решения. @ 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}

Прекрасно работает, когда ввод берется из файла вместо стандартного ввода:

ruby banach.rb < ball.txt

С другой стороны, если вам нравится вводить шарики в stdin вручную, и вы хотите получить вывод в конце, попробуйте эту 67-байтовую версию:

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

6

Матлаб, 120

Matlab - не самый лучший язык для обработки строк. \nвсегда рассматривается как два символа, что довольно раздражает, и вы не можете просто сделать матрицу из строки с переносом строки (line-break?), вы должны сделать это вручную. По крайней мере, мне не нужно было заботиться о размере / заполнении, поскольку каждая строка имеет одинаковую длину.

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

@Kevin: как интересно. Из командной строки он работает правильно в 3.5, хотя вход чередуется с выходом. Для 3.3 он ломается сразу после первой новой строки. Я скопировал и вставил текст целиком.
— El'endia Starman

3

Retina , 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в качестве foreach для печати, тогда как в новой версии действительный цикл for-each 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
Non-legacy 21: TFD?4ú".,?*&$@!%"DÀ‡,(ввод гарантированно будет ровно 10 строк).
— Grimmy

1
@Grimy Добавлю это также. Также обнаружено, что ₂jэто хорошая (хотя и тот же байт) альтернатива для 4ú, так как ширина гарантированно будет 26 символов. :)
— Кевин Круйссен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.