Twoim zadaniem w tym wyzwaniu jest przeanalizowanie danego „Równania zapałki” takiego jak to ...
... i dowiedzieć się, czy można go przekształcić w prawidłowe równanie poprzez zmianę kolejności dopasowań. Jeśli tak, musisz wypisać najmniejszą liczbę ruchów i wynikowe równanie.
Wejście
Dane wejściowe to ciąg znaków, który można odczytać ze STDIN, wziąć jako argument funkcji lub nawet zapisać w pliku. Jest to równanie reprezentujące układ zapałek i można je opisać za pomocą następującego EBNF:
input = term, "=", term ;
term = number | (term, ("+" | "-"), term) ;
number = "0" | (numeralExceptZero , {numeral}) ;
numeralExceptZero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
numeral = "0" | numeralExceptZero ;
Przykładem prawidłowego wejścia może być 3+6-201=0+0+8
.
Zadanie
Rozważ następującą ilustrację, w której do każdej zapałki przypisany jest numer:
Teraz mapujemy każdy symbol wejściowy na odpowiednie pozycje zapałek w następujący sposób:
0 ↦ 1,2,3,4,5,6
1 ↦ 4,5
2 ↦ 2,3,5,6,8
3 ↦ 3,4,5,6,8
4 ↦ 1,4,5,8
5 ↦ 1,3,4,6,8
6 ↦ 1,2,3,4,6,8
7 ↦ 4,5,6
8 ↦ 1,2,3,4,5,6,8
9 ↦ 1,3,4,5,6,8
- ↦ 8
+ ↦ 8,10
= ↦ 7,9
Każdą formułę wejściową można przekształcić w układ zapałek. Na przykład staje się równanie „45 + 6 = 92”
gdzie niewykorzystane zapałki są wyszarzone. Twoim zadaniem jest znalezienie jak najmniejszej liczby zapałek, które należy zmienić, aby równanie było ważne.
Wynik
Rozróżniamy trzy możliwe przypadki:
- Jeśli dane wejściowe są niepoprawne (tzn. Nie spełniają powyższego EBNF), wypisz wszystko, co chcesz.
- W przeciwnym razie, jeśli istnieją sposoby na przekształcenie równania w poprawne poprzez zmianę kolejności zapałek, musisz podać zarówno minimalną liczbę przegrupowań, jak i odpowiednie równanie. Podobnie jak dane wejściowe, wyprowadzone równanie musi również spełniać dane EBNF. W powyższym przykładzie poprawnym wyjściem byłoby
1
i46+6=52
. Jeśli istnieje wiele możliwości wynikowego równania, wypisz dowolną z nich. - W przeciwnym razie (więc jeśli dane wejściowe są prawidłowe, ale nie ma sposobu, aby równanie było prawdziwe), musisz wygenerować dane wyjściowe
-1
.
Detale
- Nie możesz usuwać ani dodawać dopasowań. Oznacza to, że jeśli dane wejściowe są zbudowane z
n
zapałek, dane wyjściowe muszą również składać się z dokładnien
zapałek. - „Puste” bloki zapałek są dozwolone tylko na końcu i na początku równania, a nie w środku. Na przykład zamieniając się
7-1=6
w7 =6-1
po prostu przez usunięcie-1
z lewej strony i dodanie go po prawej stronie, w odległości 3 matchstick rearanżacji jest niedozwolone. Ponieważ tak naprawdę nie postrzegam mapowania liczb na pozycje zapałek jako interesującą część tego wyzwania, dla ponad 20 bajtów możesz albo
- uzyskać dostęp do pliku, w którym mapowanie
(number/operation ↦ matchstick positions)
jest przechowywane w dowolny rozsądny sposób, lub - jeśli Twój język programowania obsługuje
Map
typ danych, załóż, że masz dostęp do mapy, która jest wstępnie zainicjalizowana za pomocą opcji -mapping(number/operation ↦ matchstick positions)
. Ta mapa może na przykład wyglądać tak:{(0,{1,2,3,4,5,6}),(1,{4,5}),(2,{2,3,5,6,8}),(3,{3,4,5,6,8}), ..., (-,{8}),(+,{8,10}),(=,{7,9})}
- uzyskać dostęp do pliku, w którym mapowanie
Przykłady
Wejście: 1+1=3
↦ Wyjście: 1
i1+1=2
Wejście: 15+6=21
↦ Wyjście: 0
i15+6=21
Wejście: 1=7
↦ Wyjście: -1
Wejście: 950-250=750
↦ Wyjście: 2
i990-240=750
Wejście: 1-2=9
↦ Wyjście: 1
i1+2=3
Wejście: 20 + 3=04
↦ Wyjście: cokolwiek
Zwycięzca
To jest golf golfowy , więc wygrywa najkrótsza poprawna odpowiedź (w bajtach). Zwycięzca zostanie wybrany tydzień po opublikowaniu pierwszej poprawnej odpowiedzi.
0: 1, 2, 3, 4, 5, 6
dla zachowania spójności=
(2 zapałek) i-
(1 zapałkę) i pozostawić wszystkie cyfry tam, gdzie są. Gdyby jednak 2 musiały zostać przesunięte w lewo, należy również policzyć wymagane ruchy.1+1+2=3-6+10
? I to samo pytanie o wynik.Odpowiedzi:
JavaScript, 1069 bajtów
Testowałem go z kilkoma równaniami testowymi i wydaje się, że teraz działa cały czas ...
Cóż, to pierwszy raz, kiedy przesyłam odpowiedź, więc nie widzę, że wygrywam. Jest to w zasadzie metoda brutalnej siły, aby znaleźć wszystkie odpowiedzi, a następnie pobiera i zwraca najmniejsze z tablicy. pierwszy argument jest długością, a drugi tablicą z danymi wyjściowymi.
jeśli wejście to „1-2 = 9”, wyjście to [1, [„1 + 2 = 3”, „7-2 = 5”]]
a oto nieskompresowany kod:
Ostrzeżenie: nie rób równań takich jak 950-250 = 750, używa ~ 45 Matchsticks, a ponieważ ten kod używa brutalnej siły, spowoduje zawieszenie się javascript.
źródło
var k
w pętlach, jako nieużywane parametry funkcji, oszczędzając 3 bajty dla każdej deklaracji.08=8
dla80=8
jest niepoprawne.Perl, 334
Dość szybko, o ile rozwiązanie jest osiągalne w 1 lub 2 ruchach. Gdy nie ma rozwiązania, czeka cię długie oczekiwanie, nawet w najmniejszym przypadku
1=7
.Przykład:
Nie znajdzie to rozwiązań zmieniających długość równania, takich jak
11=4
->2 11=11
, ale nie jestem pewien, czy byłoby to dozwolone.źródło