Istnieją dwa kawałki drewna. Oba składają się z prostego korpusu i kilku dodatkowych bloków poniżej korpusu. Przykładowy kawałek z dodatkowymi blokami w pozycjach (0-indeksowanych) 0,4,7,9,10:
XXXXXXXXXXX
X X X XX
Kawałek może być reprezentowany jako 01
sekwencja binarna ze i
znakiem th pokazującym, czy w i
pozycji th znajduje się blok . Górny przykład można przedstawić jako 10001001011
.
Możemy złożyć dwa elementy, obracając drugi pionowo (i być może również poziomo). Po odwróceniu (ach) możemy znaleźć wyrównanie, w którym dwa elementy mogą być złożone, aby mieć wysokość 3.
Two example pieces:
XXXXXXXXXXX XXXXXXXX
X X X XX XXX
Second piece flipped vertically and horizontally:
XXXXXXXXXXX
X X X XX
XXX
XXXXXXXX
Pieces put together:
XXXXXXXXXXX
XXXXX X XX
XXXXXXXX
W wyniku uzyskano całkowitą szerokość 12 bloków.
Powinieneś napisać program lub funkcję, która odbiera dwa ciągi jako dane wejściowe reprezentujące dwa kawałki i wyprowadza liczbę całkowitą o minimalnej możliwej do osiągnięcia szerokości o wysokości 3.
Wejście
- Dwa ciągi znaków złożone z znaków
0
i1
. - Oba ciągi zawierają co najmniej jeden znak.
- Możesz wybrać otrzymanie dwóch ciągów jako jednego połączonego pojedynczym odstępem.
Wynik
- Pojedyncza dodatnia liczba całkowita, minimalna możliwa do osiągnięcia szerokość całkowita.
Przykłady
0 0 => 1
1 0 => 1
1 1 => 2
11 111 => 5
010 0110 => 5
0010 111 => 5
00010 11011 => 6
01010 10101 => 5
1001 100001 => 6
1110001100001 1100100101 => 14
001101010000101 100010110000 => 16
0010110111100 001011010101001000000 => 21
0010110111100 001011010101001001100 => 28
100010100100111101 11100101100010100100000001 => 27
0010 10111 => 5
0100 10111 => 5
0010 11101 => 5
0100 11101 => 5
10111 0010 => 5
10111 0100 => 5
11101 0010 => 5
11101 0100 => 5
To jest golf golfowy, więc wygrywa najkrótszy wpis.
Odpowiedzi:
Pyth,
3735343231 bajtówOddziela wprowadzany znak nowej linii.
Demonstracja , uprząż testowa .
Wyjaśnienie:
Na wysokim poziomie, dla każdej kombinacji normalnych i odwróconych łańcuchów, przesuwamy drugi łańcuch w lewo o określoną liczbę pozycji i sprawdzamy, czy pierwszy łańcuch się pokrywa. Jest to powtarzane do momentu znalezienia wielkości przesunięcia bez nakładania się. Ta wartość przesunięcia jest dodawana do długości pierwszego łańcucha, a wynik jest porównywany z długością drugiego łańcucha. Drukowana jest wyższa wartość.
źródło
Pip ,
727048 bajtówTraktuje dwa ciągi jako argumenty wiersza poleceń. Sformatowane, z komentarzami:
Obliczamy tylko zakładki, w których dolna część wystaje w lewo, więc musimy spróbować z odwróconą górną i dolną częścią. Za każdym razem przez wewnętrzną pętlę, jeśli w sumie nie ma 2, jest to dopasowanie; następnie przyczepiamy kolejne zero na końcu dolnej części i próbujemy ponownie.
Aby znaleźć całkowitą szerokość, podzieliliśmy elementy
p
na listy znaków i sumę. Operacje na listach o nierównych długościach zachowują długość dłuższej, więc długość tej sumy jest dokładnie tym, czego potrzebujemy. (Podział jest konieczny, ponieważ zwykłe sumowanie jako liczby wyeliminuje wiodące zera:,$+[0101 10] = 111
ale$+^[0101 10] = [0 1 1 1]
.)źródło
Ruby 127
130To okazało się tak długie ... :(
Testy: http://ideone.com/te8XWk
Czytelny Rubin:
źródło
[[m,n],[m,n.reverse],[n,m],[n,m.reverse]]
Część może być nieprawidłowe. (Nie jestem pewien, ale popełniłem podobny błąd).[n.reverse,m]
zamiast tego będziesz potrzebować,[n,m.reverse]
ale nie znam Ruby.'0010110111100', '001011010101001001100'
: Oczekiwany: 28, Rzeczywisty: 30 . Wszystkie pozostałe testy przeszły pomyślnie. Więc dobrze wykonałeś testowanie narożnych skrzynek. :)JavaScript ( ES6 ) 160
Nie można skrócić ...
źródło