Ceglana ściana to prostokąt wykonany z poziomych cegieł 1 na n, ułożonych w rzędy. Oto ściana o wysokości 4 i szerokości 8, z rozmiarami cegieł pokazanymi po prawej stronie.
[______][______] 4 4
[__][____][__][] 2 3 2 1
[][______][____] 1 4 3
[____][______][] 3 4 1
Ta ściana jest niestabilna, ponieważ ma wadę , miejsce, w którym dwa pionowe pęknięcia między cegłami ustawiają się w linii, pokazane poniżej z parenami w otaczających cegłach.
[______][______]
[__][____)(__][]
[][______)(____]
[____][______][]
Ale pęknięcia graniczące z cegłami rozmiaru 1 po prawej stronie nie stanowią usterki, ponieważ są one oddzielone rzędem.
Napisz kod, który znajdzie i wyświetli stabilną ścianę zbudowaną z cegieł o określonych rozmiarach. Wygrywa najmniej bajtów.
Wejście
Niepusta lista rozmiarów cegieł (liczby dodatnie) i wysokości co najmniej 2. Ta lista może być sortowana, jeśli chcesz. Alternatywnie możesz wziąć liczbę cegieł każdego rozmiaru.
Wydajność
Zdjęcie stałej prostokątnej ściany o wymaganej wysokości, w której wykorzystano wszystkie podane cegły. Wydrukuj lub zwróć jako ciąg z nowymi liniami.
Narysuj cegłę o rozmiarze n jako 2n znaków, podkreślenia otoczone nawiasami.
1: []
2: [__]
3: [____]
4: [______]
...
Gwarantujemy, że dane wejściowe mają co najmniej jedno rozwiązanie. Jeśli jest ich wiele, nadal powinieneś narysować tylko jedną ścianę.
Nie ma ograniczeń czasowych; używaj tyle brutalnej siły, ile chcesz. Twój algorytm powinien teoretycznie działać na wejściach dowolnej wielkości.
Przypadki testowe:
Istnieje wiele rozwiązań, więc wyniki mogą być inne.
>> [1, 1, 2, 2], 2
[][__]
[__][]
>> [1, 1, 1, 2, 2, 2, 2, 3], 2
[__][____][__]
[][__][][__][]
>> [1, 1, 2, 2, 3, 3, 3, 3], 3
[][__][____]
[__][____][]
[____][____]
>> [1, 2, 3, 4, 5, 6, 7, 8, 9], 5
[][______________]
[__][____________]
[________________]
[____][__________]
[______][________]
>> [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 5
[][__][__]
[__][__][]
[][__][__]
[__][__][]
[][__][__]
n>1
i nie podobało mi się, jak ograniczało to przypadki testowe. Ponadto najwyraźniej istnieje precedens .Odpowiedzi:
Perl, 166
170 194Idealne zadanie dla języka stworzonego przez Larry'ego Walla.
Brutalna siła, ale dość szybko na testach (<1s). Stosowanie:
Przetestuj mnie .
źródło
CJam,
94 9282 bajtówTo jest wersja 92 bajtów. Następuje wersja 82-bajtowa.
To dzieli cegły na wszystkie możliwe sposoby i bierze tylko ten, który jest ważny. Jak na razie dość brutalna siła, ale nadal wykonuje ostatni test w około 10 sekundach na Java Interpreter na moim komputerze.
Objaśnienie :
Kod jest podzielony na 5 części:
1) Biorąc pod uwagę tablicę długości
L
, w jaki sposób możemy podzielić ją naH
części.Następnie mamy wszystkie możliwe sposoby podziału naszej tablicy wejściowej na warstwy cegieł H.
2) Uzyskaj wszystkie permutacje tablicy wejściowej, a następnie uzyskaj wszystkie partycje dla wszystkich permutacji
Następnie mamy wszystkie możliwe układy cegieł wejściowych w
H
ceglany mur warstwowy.3) Filtruj tylko te układy, których długości cegieł są takie same
Po zakończeniu tego filtra wszystkie pozostałe układy byłyby idealnymi prostokątami.
4) Wyjmij pierwszy układ klocków, który spełnia kryteria stabilności
Po tym kroku musimy po prostu wydrukować układ
5) Wydrukuj układ
Wypróbuj online tutaj
82 bajty
Jest to prawie podobne do wersji 92-bajtowej, z tym wyjątkiem, że ma odrobinę losowości. Jeśli przeczytałeś wyjaśnienie dla wersji 92-bajtowej, to w wersji 82-bajtowej części 3, 4 i 5 są dokładnie takie same, a zamiast iteracji po wszystkich permutacjach z części 1 i 2, ta wersja po prostu losowo generuje jeden z permutacja na raz, testuje ją za pomocą części 3 i 4, a następnie ponownie uruchamia proces, jeśli testy części 3 i 4 nie powiodą się.
To bardzo szybko drukuje wyniki dla pierwszych 3 przypadków testowych. Przypadek testowy wysokość = 5 nie ma jeszcze danych wyjściowych na moim komputerze.
Wyjaśnienie różnicy
Pomysł na tę wersję został podany przez randomra (rozumiesz?)
Wypróbuj ten online
źródło
Python 2,
680670660 bajtówNie wiem, dlaczego nalegam na te długie golfa ... ale tak czy inaczej, proszę bardzo.
Wymaga to wyjścia w posortowanej kolejności rosnącej i jest wywoływane przez
b(brick_sizes, height)
.Przypadki testowe:
Działa to w następujący sposób:
źródło
continue
z końca. Niereturn(N,N)
będzie też potrzebny nawias.continue
to relikt z wcześniejszej wersji.W
i dostajeszT
dodatkowy argument.Haskell, 262 bajty
Przykładowe użycie:
Jak to działa: główna funkcja
#
pobiera listęl
(listę cegieł) i liczbęh
(wysokość) i dzieli wszystkie permutacjel
nah
listy podrzędne we wszystkich możliwych pozycjach (za pomocą funkcji%
, np.2%[1,2,3,4]
->[ [[1],[2,3]] , [[1,2],[3]] , [[1,2,3],[]] ]
). Utrzymuje te, w których dwa kolejne elementy mają tę samą sumę (tj. Taką samą długość w cegłach), a listy sum częściowych nie mają wspólnych elementów (tj. Pęknięcia nie ustawiają się w linii, funkcjav
). Weź pierwszą pasującą listę i zbuduj ciąg cegieł.źródło
Python 2,
528,417,393, 381Bardzo długie, brutalne rozwiązanie. Działa, ale o to chodzi, wszechświat może się skończyć, zanim otrzyma wynik dla ostatniego przypadku testowego.
a jest główną funkcją:
źródło
from itertools import*
i usuwającitertools.
zpermutations
połączenia. Ponadto,if
s na końcu można zmienić naif all(x==w[0] for x in w)and~-f(o):return
..., aby zapisać 13 bajtów.f
zawsze powraca przy pierwszej iteracji? To wygląda dziwnie. To albo błąd, albo ogromna szansa na golfa.t=0
dwa razyr()
; możesz przekształcić tę funkcję wmap(sum,[x[:i] for i in range(len(x))])
jedną linijkę (jeśli chcesz, nadaje się do lambda). Użycie isdisjoint i zestawówf()
znacznie go zmniejszy (f()
obecnie również powraca po tylko jednym teście, niezależnie od tego, czy znaleziono błąd, czy nie). Osobiście przepisałbymf()
jakoreturn not all(map(isdisjoint,map(set,map(r,w[:-1])),map(set,map(r,w[1:]))))
lub coś podobnego.JavaScript (ES6) 222
232 265 279 319Nadal do gry w golfa.Ten znajduje wszystkie rozwiązania, wyświetla tylko ostatnie znalezione i jest dość szybki.Uruchom snippet w przeglądarce Firefox, aby przetestować
Niegolfowany i wyjaśniony
źródło
Python 2, metoda grid (290 znaków)
Metoda jest tu Państwo transpozycji siatkę i szukać
[[
albo]]
gdziekolwiek w kolumnach. Testujesz również, czy wszystkie cegły po lewej i prawej stronie ściany są ustawione w linii: urocze jest sprawdzenie, czy wszystkie elementy sznurka są takie same:'[[[[[['.strip('[')==''
mini wersja powyższego:
Prawdopodobnie można to zrobić łatwiej w języku manipulacji matrycą.
... lub nadużywanie wyrażeń regularnych, co pozwala nam łączyć warunek „blokuj wyrównanie na końcach” z warunkiem „brak pęknięć”:
Powiedzmy, że szerokość ściany wynosiła w = 6. Lokalizacje podłańcucha „[..... [” i „] .....]” muszą być dokładnie ustawione {0, w-1, w, 2w-1,2w, 3w-1 ,. ..}. Nieistnienie w tych punktach oznacza „okładzinę” cegieł w taki sposób:
Istnienie NIE w tych punktach oznacza niestabilną „szczelinę” w ścianie:
Dlatego ograniczamy problem do ustawiania równoważności, gdzie zestawy w pytaniach są wskaźnikami dopasowania wyrażenia regularnego.
Python, metoda regexp (304 znaki):
źródło
x,h=input()
.Matlab (359)
Wejście
wektor liczb całkowitych, przykład: p ([1 1 2 2 3])
Wydajność
schemat przykładu ściany:
źródło