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


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это хорошая (хотя и тот же байт) альтернатива для , так как ширина гарантированно будет 26 символов. :)
Кевин Круйссен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.