Cel
Mam ładne zdjęcie, które chcę zawiesić na ścianie. I chcę, żeby wisiał tam w spektakularny sposób, więc postanowiłem powiesić go na n
paznokciach, gdzie n
jest jakakolwiek dodatnia liczba całkowita.
Ale jestem też niezdecydowany, więc jeśli zmienię zdanie, nie chcę mieć problemów z usunięciem zdjęcia. Dlatego usunięcie jednego z n
paznokci powinno spowodować, że obraz spadnie. Czy wspomniałem, że w moim domu nie ma tarcia?
Możesz mi pomóc?
Zasady
- Twój program musi odczytać liczbę
n
ze standardowego wejścia i wydrukować na standardowe wyjście (lub odpowiedniki w Twoim języku). - Dane wyjściowe muszą być rozwiązaniem zgodnym ze specyfikacją danych wyjściowych bez żadnych znaków końcowych lub wiodących. Jednak końcowe białe znaki i / lub znaki nowej linii są dopuszczalne.
- Musisz użyć dokładnie
n
gwoździ. - Zakładając, że świat jest pozbawiony tarcia, Twoje rozwiązanie musi spełniać następujące warunki:
- Wisząc obraz zgodnie z opisem rozwiązania, obraz nie może spaść.
- Jeśli którykolwiek z paznokci zostanie usunięty, zdjęcie musi spaść.
- Obowiązują standardowe luki. W szczególności nie możesz składać próśb o np. Program weryfikacji rozwiązań brutalnej siły.
Zauważ, że 4.2 już oznacza, że wszystkie n
paznokcie muszą być w to zaangażowane.
Specyfikacja wyjściowa
- Wszystkie gwoździe są nazywane od lewej do prawej w pozycji, w której się znajdują, zaczynając od
1
. - Istnieją dwa podstawowe sposoby na owinięcie sznurka wokół gwoździa: zgodnie z ruchem wskazówek zegara i przeciwnie do ruchu wskazówek zegara. Oznaczamy krok w prawo za pomocą
>
i krok w lewo za pomocą<
. - Za każdym razem, gdy sznurek zostanie owinięty wokół gwoździa, wychodzi na gwoździe, więc pominięcie gwoździ oznacza, że sznurek przejdzie przez górną część gwoździ pośrednich.
- Każde rozwiązanie musi zaczynać się od paznokcia,
1
a kończyć na paznokciun
. - Wynik musi składać się z sekwencji etapów, w których krok jest kombinacją nazwy gwoździa i kierunku, w którym należy go owinąć.
Przykładowy wynik
Oto przykładowy wynik dla n=5
i n=3
:
1>4<3<2>4>5< # n=5, incorrect solution
1>2<1<2>3<2<1>2>1<3> # n=3, correct solution
A oto wizualna reprezentacja nieprawidłowego rozwiązania dla n=5
(awsumz gimp skillz)
Prawidłowe rozwiązanie n=1
to po prostu 1>
lub 1<
. W przypadku wielu gwoździ mogą istnieć różne rozwiązania. Musisz wydać tylko jeden, ponieważ jest to część twojego wyniku.
Weryfikacja
Możesz sprawdzić, czy rozwiązanie jest poprawne tutaj: www.airblader.de/verify.php .
Wykorzystuje żądanie GET, więc możesz zadzwonić bezpośrednio, jeśli chcesz. Na przykład, jeśli foo
plik zawiera rozwiązanie w każdej linii, możesz użyć
cat foo | while read line; do echo `wget -qO- "www.airblader.de/verify.php?solution=$line" | grep "Passed" | wc -l`; done
Jeśli uważasz, że rozwiązanie jest poprawne, ale weryfikator oznaczy je jako nieprawidłowe, daj mi znać!
Edycja: A jeśli twój wynik jest tak długi, że żądanie GET go nie wycofa, daj mi znać, a utworzę wersję żądania POST. :)
Punktacja
To jest golf golfowy. Wynik to liczba bajtów kodu źródłowego w kodowaniu UTF-8, np. Użyj tego narzędzia . Istnieje jednak potencjalna premia za każde przesłanie:
Uruchom swój program dla wszystkich n
w zakresie [1..20]
i dodaj długość wszystkich wyjść, aby określić wynik wyjściowy . Odejmij swój wynik wyjściowy, 6291370
aby uzyskać liczbę punktów bonusowych, które możesz odjąć od liczby bajtów, aby uzyskać ogólny wynik . Nie ma kary, jeśli wynik końcowy jest wyższy niż ta liczba.
Zgłoszenie z najniższą ogólną liczbą punktów wygrywa. W mało prawdopodobnym przypadku remisu przerywniki remisów są w tej kolejności: wyższe punkty bonusowe, mniejsza liczba bajtów, wcześniejsza data zgłoszenia.
Proszę zamieścić zarówno poszczególne części (liczbę bajtów, punkty bonusowe) wyniku, jak i wynik końcowy, np. „ LOLCODE (44 - 5 = 39)
”.
1>
rysuje się na zdjęciu). I nie ma miejsca, wn
którym niemożliwe jest rozwiązanie. Prawidłowe rozwiązanien=2
jest1>2<1<2>
.Odpowiedzi:
GolfScript (
5167 bajtów + (73107150 - 6 291 370) = -6 284,153)Jest to oparte na rekurencyjnej konstrukcji komutatora Chrisa Lusby'ego Taylora * , lepiej wyjaśnionej w Picture-Hanging Puzzles , Demaine i wsp., Theory of Computing Systems 54 (4): 531-550 (2014).
Wyjścia dla pierwszych 20 wejść:
Uwaga: Wydaje mi się, że dłuższe odpowiedzi nie przejdą testu online, ponieważ używa
GET
raczej niż,POST
a adresy URL nie są obsługiwane poprawnie, jeśli są dłuższe niż 255 znaków.Istnieją dwie poprawki w standardowej konstrukcji:
[x_1, x_2^-1]
zamiast komutatora tworzę komutator[x_1, x_2]
.* Bez relacji, o ile mi wiadomo.
** Cóż, w ramach tego samego rekurencyjnego podejścia komutatora. Nie twierdzę, że rozwiązałem otwarty problem udowodnienia, że jest optymalny.
źródło
Python 2 (208 bajtów + (7230 - 6 291 370) = -6 283 932)
Funkcja
f
rekurencyjnie daje odpowiedź, łącząc pół-rozwiązania jako A ^ {- 1} * B ^ {- 1} * A * B, reprezentuje odwrotność przez negację.f(a,b)
jest rozwiązaniem dla liczb w półotwartym przedziale[a,b)
.Edycja: Aby spełnić wymóg rozpoczynania
1
i kończenian
, zmieniłem kolejność, aby zawsze kończyć przyn
użyciu odwróconych interwałów i po prostu dołączyć"1<1>"
na początku.Edycja : Zapisano 136 symboli na wyjściu, zaokrąglając w drugą stronę w przedziałach zbierania, powodując, że przedziały z większymi liczbami (a więc prawdopodobnie dwie cyfry) są krótsze.
Edycja : Zapisano 100 symboli, dzieląc interwały nierównomiernie, aby ten z większą liczbą był krótszy. Nie wydłuża to liczby operacji, o ile długości nigdy nie przekraczają potęg 2.
Edycja : Przywrócono korzystne zaokrąglanie, -50 symboli, 2+ znaki kodu.
Wyjścia dla 1 do 20:
źródło
n>n<
wtedy ślad .n=1
teraz dla twojego rozwiązania. Pracuje nad nim)C - (199 bajtów - 0) = 199
Z podziałami linii:
Prawdopodobnie dość naiwny algorytm, biorąc pod uwagę, że niewiele wiem o teorii węzłów. Zasadniczo dodaje kolejny wyższy numer, a następnie odwraca cały zestaw instrukcji, aby go rozwinąć. Prawdopodobnie byłoby to bardziej zwięzłe w języku, który lepiej radzi sobie z zestawami ...
Całkowita długość wyjściowa dla
n
tego zakresu[1..20]
wynosiła 6 291 370 bajtów danych wyjściowych (3 145 685 instrukcji). To było na tyle duże, że zamieściłem tylko próbki wyjściowe dlan
tego zakresu[1..10]
.źródło
6,291,370
jest dokładnie poprawną liczbą, którą chciałem opublikować. Przypadkowo podałem tylko numern=20
, a nie sumę wszystkich. Będę musiał go podkręcić[1..10]
.199 + 0 = 199
.