Paradoks Banacha-Tarskiego stwierdza, że biorąc pod uwagę piłkę w przestrzeni trójwymiarowej, można ją rozłożyć na skończoną liczbę podzbiorów punktowych. Te rozłączne zestawy punktów można następnie ponownie złożyć, aby uzyskać dwie kopie początkowej piłki. Teoretycznie mielibyśmy dwie identyczne piłki.
Proces ponownego montażu polega jedynie na przesunięciu wyżej wymienionych podzestawów punktowych i obróceniu ich, bez zmiany ich kształtu przestrzennego. Można to zrobić za pomocą zaledwie pięciu rozłącznych podzbiorów.
Zestawy rozłączne z definicji nie mają wspólnych elementów. Gdzie A
i gdzie B
są dowolne dwa podzbiory punktowe początkowej piłki, wspólne elementy pomiędzy A
i B
są pustym zbiorem. Pokazano to w poniższym równaniu.
Dla poniższych rozłącznych zestawów członkowie wspólni tworzą pusty zestaw.
Wyzwanie
Napisz program, który może pobrać wejściową „kulkę” ASCII i wypisać zduplikowaną „kulkę”.
Wejście
Oto przykładowa kula wejściowa:
##########
###@%$*.&.%%!###
##!$,%&?,?*?.*@!##
##&**!,$%$@@?@*@&&##
#@&$?@!%$*%,.?@?.@&@,#
#,..,.$&*?!$$@%%,**&&#
##.!?@*.%?!*&$!%&?##
##!&?$?&.!,?!&!%##
###,@$*&@*,%*###
##########
Każda kula jest opisana przez znaki funta ( #
) i wypełnione każdy tez znaków: .,?*&$@!%
. Każde wejście będzie mieć 22x10 znaków (szerokość według wysokości).
Tworzenie duplikatu
Po pierwsze, każdy punkt wewnątrz piłki otrzymuje numerowany punkt na podstawie jego indeksu w .,?*&$@!%
. Oto powyższy przykład, raz ponumerowany:
##########
###7964151998###
##86295323431478##
##5448269677374755##
#75637896492137317572#
#21121654386679924455#
##1837419384568953##
##85363518238589##
###2764574294###
##########
Następnie każdy punkt jest przesuwany w górę o jeden (dziewięć przechodzi do jednego):
##########
###8175262119###
##97316434542589##
##6559371788485866##
#86748917513248428683#
#32232765497781135566#
##2948521495679164##
##96474629349691##
###3875685315###
##########
Na koniec każda nowa wartość punktowa jest konwertowana z powrotem na odpowiadający jej znak:
##########
###!.@&,$,..%###
##%@?.$*?*&*,&!%##
##$&&%?@.@!!*!&!$$##
#!$@*!%.@&.?,*!*,!$!?#
#?,,?,@$&*%@@!..?&&$$#
##,%*!&,.*%&$@%.$*##
##%$*@*$,%?*%$%.##
###?!@&$!&?.&###
##########
Wynik
Te dwie kule są następnie wyprowadzane obok siebie, w tej formie (oddzielone czterema spacjami na równikach):
########## ##########
###@%$*.&.%%!### ###!.@&,$,..%###
##!$,%&?,?*?.*@!## ##%@?.$*?*&*,&!%##
##&**!,$%$@@?@*@&&## ##$&&%?@.@!!*!&!$$##
#@&$?@!%$*%,.?@?.@&@,# #!$@*!%.@&.?,*!*,!$!?#
#,..,.$&*?!$$@%%,**&&# #?,,?,@$&*%@@!..?&&$$#
##.!?@*.%?!*&$!%&?## ##,%*!&,.*%&$@%.$*##
##!&?$?&.!,?!&!%## ##%$*@*$,%?*%$%.##
###,@$*&@*,%*### ###?!@&$!&?.&###
########## ##########
Uwaga: Przesunięcie wartości punktów i późniejszych znaków symbolizuje obroty wykonane w celu ponownego złożenia podzbiorów punktów (grupowania znaków).
Odpowiedzi:
Pyth, 21 bajtów
Wypróbuj online: demonstracja
Wreszcie przypadek użycia dla
.r
.Wyjaśnienie
Pętla nieskończona pęka, gdy nie ma już dostępnego wejścia.
źródło
Ruby, 65
Działa świetnie, gdy dane wejściowe są pobierane z pliku zamiast standardowego wejścia:
Z drugiej strony, jeśli lubisz pisać piłki ręcznie, aby uzyskać standardowe wejście, a chcesz, aby dane wyjściowe były na końcu, wypróbuj tę 67-bajtową wersję:
źródło
Matlab, 120
Matlab nie jest najlepszym językiem do obsługi napisów.
\n
jest zawsze uważany za dwa znaki, co jest dość irytujące i nie można po prostu zrobić macierzy z łańcucha z podziałem linii (linia-linia?), należy to zrobić ręcznie. Przynajmniej nie musiałem dbać o rozmiar / wypełnienie, ponieważ każda linia ma dokładnie taką samą długość.Przykładowe dane wejściowe:
Przykładowe dane wyjściowe:
PS: Jeśli mogę przyjąć dane wejściowe w ten sposób:
Potrzebuję tylko 88 znaków:
źródło
Ruby, 102
Zasadniczo po prostu wywołuje
tr
dane wejścioweźródło
sed (39 bajtów)
źródło
CJam, 28 bajtów
Wypróbuj online
Wyjaśnienie:
źródło
Python 3.5,
968988 bajtówPython 3.3,
1039695 bajtówWyjaśnienie
Python 3.3 i 3.5 są wymienione osobno, ponieważ zmienił się sposób
input()
obsługi znaków nowej linii w IDLE . Zdarzyło się to zaoszczędzić 8 bajtów, co jest fajne.Uwaga dotycząca wykonania: użyj IDLE. Jeśli używasz terminala, to rozwiązanie dla 3.3 jest takie samo jak 3.5, ale oba przeplatają wejście z wyjściem.
Odwróciłem ciąg symboli,
s
aby skorzystać z ujemnego indeksowania Pythona. Następnie dla każdego wiersza na wejściu wyprowadzam go, dwie spacje, a wiersz z każdym symbolem zastępuje się poprzednim symbolem. Powodem, dla którego wstawiłem tylko dwie spacje, jest to, że użyłem,
zamiast tego+
, co dodaje spację do wydruku. To (,' ',
) uratowało mi bajt+' '*4+
.Dzięki xsot za uratowanie mnie
78 bajtów. Zmieniłems.find
na,s.rfind
aby umożliwić mi umieszczanie spacji i skrótóws
, tym samym eliminując potrzebę sprawdzaniay in s
. Dodatkowo zaoszczędzono miejsce. EDYCJA: zmieniono z powrotem na,s.find
ponieważ obecność##
teraz pozwala mi+1
bez martwienia się o błąd indeksu poza zakresem.źródło
input()
zmienił? Nie mogę znaleźć żadnych różnic między wersją 3.4 i 3.5 .Siatkówka ,
4539 bajtówAby uruchomić kod z jednego pliku, użyj
-s
flagi.Pierwszy etap powiela każdą linię oddzieloną
" ; "
, aby uzyskaćNastępnie drugi etap dotyczy tylko znaków znalezionych w dopasowaniach
;.*
, tj. Tylko drugiej połowie każdej linii. Znaki te są następnie transliterowane za pomocą następującej korespondencjiTam, gdzie pierwsze 9 par „zwiększa”, znaki w piłce i ostatnia para zamieniają średnik w inne miejsce.
źródło
Python 2, 77 bajtów
źródło
Perl, 59 bajtów
Kod 56 bajtów plus 3 bajty,
-p
ponieważ należy to zapisać w pliku.Przykładowe użycie:
źródło
05AB1E (starsza wersja) , 21 bajtów
Wykorzystuje starszą wersję 05AB1E, ponieważ możliwe było użycie filtra
ʒ
z niejawnymy
drukiem foreach, podczas gdy w nowej wersji należy użyć rzeczywistej pętli for-expressv
z jawnymy
, która jest dłuższa o 1 bajt.Wypróbuj online.
Wyjaśnienie:
Tutaj wersja, która działa również w nowej wersji 05AB1E (kredyt na @Grimy ):
05AB1E , 21 bajtów
Wypróbuj online.
Wyjaśnienie:
źródło
TFD?4ú".,?*&$@!%"DÀ‡,
(gwarantowane wejście to dokładnie 10 linii).₂j
jest to ładna (choć ten sam bajt) alternatywa dla4ú
, ponieważ szerokość gwarantuje 26 znaków. :)