Wprowadzenie
Arytmetyczny Gaol to specjalny obiekt, w którym uwięzione są liczby całkowite dodatnie. Jednak ostatnio dodatnie liczby całkowite próbują uciec. Dlatego strażnicy postanowili wyeliminować niektóre dodatnie liczby całkowite, aby wysłać wiadomość do innych liczb całkowitych. Zatrudnili inżyniera oprogramowania, aby napisał program, aby dowiedzieć się, które liczby całkowite wyeliminować w celu uzyskania maksymalnego efektu.
Opis wejścia
Dane wejściowe są podawane za pomocą STDIN, argumentów wiersza poleceń lub funkcji wprowadzania danych przez użytkownika (np. raw_input
). Nie możesz mieć go jako argumentu funkcji lub wstępnie zainicjowanej zmiennej (np. Ten program oczekuje danych wejściowych w zmiennej x
).
Pierwszy wiersz danych wejściowych zawiera jedną dodatnią liczbę całkowitą, n
gdzie 8 >= n >= 3
. Poniżej znajdują się n
wiersze zawierające n
znaki ze zbioru [1,2,3,4,5,6,7,8,9]
. Oto przykładowe dane wejściowe:
5
22332
46351
65455
24463
65652
Opis wyjścia
Strażnicy chcieliby wyeliminować liczby, aby spełnione były następujące warunki:
- W każdym wierszu i kolumnie wynikowej siatki żadna liczba nie pojawi się dwukrotnie;
- Żadne dwie wyeliminowane liczby nie mogą przylegać poziomo ani pionowo;
- Liczby, które przeżyły, muszą tworzyć ortogonalnie ciągłą grupę - możliwe będzie podróżowanie z dowolnej liczby, która przeżyła, na dowolną inną liczbę, która przeżyje, poruszając się tylko poziomo i pionowo i nigdy nie przekraczając żadnej liczby wyeliminowanej.
Wyjście wejściowe (minus pierwszy wiersz), z wyeliminowanymi liczbami zastąpionymi przez #
.
Może być więcej niż jedno rozwiązanie. W takim przypadku możesz wypisać dowolne rozwiązanie.
Może również nie być rozwiązania. W takim przypadku wypisz ciąg znaków no answer
.
Oto możliwe dane wyjściowe dla przykładowego wejścia:
#2#3#
46351
6#4#5
24#63
#56#2
Przykładowe wejścia i wyjścia
Istnieje wiele wyjść dla każdego wejścia, więc są to tylko przykłady.
Wkład:
5
46551
51565
32654
14423
43244
Wydajność:
46#51
#156#
326#4
1#423
#324#
Wkład:
7
7183625
1681563
5238564
8786268
1545382
3814756
5325345
Wydajność:
71#362#
#6815#3
5238#64
#7#62#8
154#382
3814756
#325#4#
Wkład:
8
21534768
75196287
68392184
96244853
44865912
76516647
89751326
43698979
Wydajność:
21#34768
#5196287
683#21#4
9#24#853
#4865912
7#51#64#
89751326
436#8#7#
Wkład:
4
2222
2331
3112
1322
Wydajność:
no answer
prompt
nie pozwala na wprowadzanie wielu wierszy.Odpowiedzi:
Rubinowy,
346344329316 bajtów, sl∞∞∞∞∞∞wTo jest golfowy kod, nie szybki kod, więc ...
Używaj go jak:
Flaga
-W0
nie jest konieczna, ale sugeruję dodanie jej w celu wyłączenia ostrzeżeń lub przekierowaniestderr
...Powiedz mi, czy masz dość cierpliwości, aby uruchomić ją na przykładach dla n = 6,7,8
Dziennik zmian
each
⇨map
dzięki @NotThatCharlesregexp
s, podobnie jak sugerował @NotThatCharlesźródło
\d
jest krótszy niż[^#]
w przedostatniej linii;M.times.to_a
jest dłuższy niż(0..M-1).to_a
M.times.to_a
jest o 1 bajt krótszy niż(0..M-1).to_a
;)(0...M).to_a
też działa i ma taką samą długość.Ruby -
541 ...,394Podstawowym algorytmem jest rekurencyjne przeszukiwanie w pierwszej kolejności duplikatów w celu wybrania twierdzącego, przeglądanie wiersza 1, następnie kolumny 1, następnie wiersza 2 itd. I sprawdzanie, czy dwóch sąsiadów nie zostało zabitych i czy sieć jest podłączona (to jest
break if
klauzula w tam i kawałek, który jest przed nim).Kilka ciekawych sztuczek:
if w[1]
jest znacznie krótszy niżif !w.one?
i jeśli wiesz, że jest co najmniej jeden członek, to ten sam wynik.Podobnie
[0]
jest krótszy niż,any?
jeśli nie ma bloku, is[j]
jest uroczym skrótem doj<s.size
(technicznie bardziej przypominaj.abs<s.size
)I
y%N+(y/N).i
jest znacznie krótszy niżComplex(y%N,y/N)
Ponadto, gdy istnieją dwa skomplikowane warunki generowania ciągów, może to być krótsze
[cond1?str1a:str1b,cond2?str2a:str2b]*''
niż dodanie wszystkich parens lub#{}
s.Wykluczenie i objaśnienie:
(Jest to wersja 531 bajtów. Wprowadziłem zmiany. Co najważniejsze, od tego czasu wyeliminowałem wezwanie do produktu - po prostu rozwiązuj jedną cyfrę na wiersz / kolumnę na raz, a J jest teraz tylko tablicą indeksowaną według liczby całkowite. Wszystkie współrzędne są tylko liczbami całkowitymi.)
H
oblicza sąsiadówN
to rozmiar siatkiK
są kluczami do mapy (liczby zespolone)J
to mapa wejściowa (więzienie)k
są nie zabitymi kluczamiQ
jest główną metodą rekurencyjnąKod jest wykonywany za pomocą:
Dziennik zmian
394 dodał poniżej sugestię @ blutorange i wyciągnął znacznie więcej manipulacji
408 raz jeszcze poprawiono wydajność. Użyj także
.min
zamiast,.inject(:+)
ponieważ i tak biorę tylko jeden wiersz.417 krótsze obliczenia wydajności
421 upuściło liczby zespolone. Po prostu użyj liczb całkowitych. Zapisz pakiet
450 więcej ulepszeń wejściowych
Ulepszenia wprowadzania 456
462 przyrostowe ulepszenia - szczególnie.
find
, nieselect
475 upuścił
u
i zmiażdżył konstruktora wierszy / kol. Dupe503 rozwiązuje tylko jedną zduplikowaną cyfrę na wiersz / kolumnę na raz.
530 użyć
map &:pop
zamiastvalues
531 wyciągnij lambda, która tworzy tablicę duplikatów
552 ups! brakowało wymagania
536 nieznacznie poprawiona populacja tablicy duplikatów (poprzednio
d
)541 inicjał
źródło
break
zamiast tego można użyćreturn
, może zaoszczędzić jeszcze jeden bajt. Naprawdę lubię ten, wiele sztuczek i znacznie szybciej.a
jest używana tylko raz, możesz to zrobićJ=gets(p).split*''
. Próbowałeś argumentów cli, widzisz moją odpowiedź?HTML + JavaScript ( ES6 ) 459
Korzystanie z obszaru tekstowego HTML w celu uzyskania wprowadzania wielowierszowego.
Aby przetestować, uruchom fragment w przeglądarce Firefox. Jeśli chcesz, powiększ obszar tekstowy, wklej tekst wewnątrz obszaru tekstowego (uwaga: dokładne wprowadzanie, bez dodatkowych spacji w dowolnym wierszu) i tabulator. Wynik jest dołączany.
Metoda: rekursywna pierwsza głębokość Serarch. Znajduje nieoptymalne rozwiązania dla wszystkich przypadków testowych w kilka sekund (to gra w golfa, ale ważna odpowiedź powinna zakończyć się w przypadku typowych przypadków testowych)
Pierwsza próba
Metoda: Głębokie pierwsze Serarch, nierekurencyjne, przy użyciu stosu użytkowników.
Funkcja może być łatwo przekształcony w przeszukiwanie wszerz, chaging
l.pop
sięl.shift
, więc za pomocą kolejki zamiast stosu, ale to jest zbyt powolny i nie jestem pewien, może on znaleźć rozwiązanie optymalne i tak.Pokaż fragment kodu
źródło