Na łamigłówce SE występują tak zwane „problemy z zapałkami”, w których matematyka zapisywana jest w zapałkach i możesz przesuwać określoną liczbę z nich, aby uzyskać określoną właściwość.
W tym pytaniu rozważymy tylko liczby całkowite reprezentowane w 7-segmentowym formacie wyświetlania. Oto wszystkie 10 cyfr w tym formacie:
__ __ __ __ __ __ __ __
| | | __| __| |__| |__ |__ | |__| |__|
|__| | |__ __| | __| |__| | |__| __|
Każdy segment wyświetlacza to jeden „zapałka”, który można przesuwać niezależnie od reszty numeru. Zapałki są niepodzielne i niezniszczalne, nie można ich w żaden sposób złamać ani usunąć.
Powszechną łamigłówką jest pobranie liczby podanej w bazie 10 i próba uzyskania jak największej liczby w danej liczbie ruchów. Ruch uważa się za jeden ruch zapałki z dowolnego zajętego pola do dowolnego innego niezajętego pola. Zezwala się na tworzenie nowych cyfr po obu stronach numeru, na przykład 0 można przekształcić w 77, co daje 3 ruchy
__ __ __ __ __ __ __
| | | | | | | | |
|__| , __| , | , | |
Jednak nie możesz zamienić jednego pola na 2 ani tworzyć nowych pól między istniejącymi, na przykład zamieniając 4 na 11 w środku liczby lub wstawiając nowe cyfry między istniejącymi. Każdy ruch nie musi zawierać poprawnej liczby, ale końcowy wynik powinien być poprawną liczbą na podstawowym wyświetlaczu siedmiosegmentowym. Nie musisz używać każdego ruchu, jeśli nie chcesz. W przeciwieństwie do łamigłówek, jest to [tag: zamknięte pytanie], w odpowiedziach nie można używać żadnych operatorów (mnożenie, potęgowanie itp.) Ani stałych matematycznych (Pi, liczba Grahama itp.).
Zadanie
Napisz program lub funkcję, która pobiera liczbę i liczbę ruchów jako dane wejściowe i zwraca największą liczbę, jaką można wykonać przy tylu ruchach na pierwotnej liczbie.
To jest pytanie w golfa kodu, więc odpowiedzi będą liczone w bajtach, przy czym mniej bajtów będzie lepszych.
Przypadki testowe
n, moves -> max
0, 1 -> 9
0, 3 -> 77
0, 4 -> 111
8, 3 -> 74
220, 1 -> 320
220, 2 -> 520
220, 3 -> 7227
220, 4 -> 22111
220, 5 -> 32111
747, 1 -> 747
747, 2 -> 7171
747, 3 -> 7711
źródło
919, 2 -> 991
Odpowiedzi:
JavaScript (ES6),
297286279267 bajtówPobiera dane wejściowe w składni curry
(s)(k)
, gdzie s to tablica cyfr, a k to liczba ruchów (liczba całkowita).Przypadki testowe
Pokaż fragment kodu
W jaki sposób?
Dane kształtu i funkcja pomocnicza
Tablica b opisuje kształty cyfr jako 7-bitowe liczby całkowite, gdzie każdy bit jest segmentem:
Na przykład kształt „7” to 0b0100101 = 37.
Funkcja pomocnicza B () zwraca liczbę 1 w reprezentacji binarnej podanej liczby:
Krok 1
Najpierw liczymy liczbę zapałek użytych w numerze wejściowym:
Krok 2
Przekazujemy tę wartość do funkcji rekurencyjnej g () , która zapełnia listę r wszystkimi liczbami, które można zbudować z dokładnie taką liczbą zapałek:
Na przykład g (5) załaduje się
[ '17', '2', '3', '5', '71' ]
do r .Krok 3
Mamy teraz do wyboru największą liczbą M w R , który w rzeczywistości może być uzyskany z liczby wejściowej, w dozwolonym liczbie ruchów k .
Ponieważ każda liczba n w r zastosowań dokładnie tyle zapałek jako numer wejście s , liczba ruchów wymagane do przekształcenia s do n równa połowie liczby różnic między każdym z segmentów swoich cyfr.
Liczba różnic pomiędzy dwoma segmentami cyfr x i y jest przez liczbę 1 IN binarnej reprezentacji B [x] XOR b [t] .
Na koniec należy zauważyć, że musimy wypróbować kilka możliwych wyrównań cyfr, ponieważ pierwsza cyfra s niekoniecznie jest odwzorowana na pierwszą cyfrę n . Przesunięcie między cyframi daje zmienna j w kodzie.
źródło
Mathematica, 188
197200203170174bajtyUWAGA: Kod nadal jest trochę błędny. Pracuję nad tym.
+30 bajtów na błąd
Znak pomiędzy
%
io
powinien być,0x7F
ale SE na to nie pozwoli. Możesz kliknąć link pastebin, aby skopiować oryginalny kod.Kod zajmuje dużo czasu, gdy jest więcej niż 6-7 drążków. (Możesz zmodyfikować wartość początkową
i
do mniejszej liczby, aby ją przetestować)Wyjaśnienie
g
to funkcja pomocnicza konwertująca cyfry na listę reprezentacji drążka (zgodnie z tutaj ), na przykład{1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1}
dla220
.h
jest funkcją pomocniczą do radzenia sobie z lewą i lewą wyściółką między dwiema liczbami.f
iteruje od10^Tr@g@#
(górnego limitu), aby1
szukać liczby całkowitej, której reprezentacja sztyftu ma taką samą ilość1 -> 0
i jest0 -> 1
porównywana z liczbą oryginalną, a ilość ta jest mniejsza lub równa niż drugi argument.źródło