Zegar cyfrowy odpowiada układanki

10

Istnieje wiele zagadek z dopasowaniami, które polegają na dodawaniu, usuwaniu lub przenoszeniu określonej liczby dopasowań w celu utworzenia nowych liczb lub kształtów. Tak jest z zegarem cyfrowym.

Biorąc pod uwagę prawidłowy czas na 12-godzinnym zegarze cyfrowym, wypisz cyfrę, która wymaga przesunięcia jak najmniejszej liczby linii, aby każda widoczna cyfra na zegarze stała się tą cyfrą. Jeśli więcej niż jedna cyfra jest minimum, wypisz je wszystkie. Jeśli nie jest możliwe, aby każda cyfra była taka sama, wartość wyjściowa -1lub wartość fałszowania inna niż 0 (dostaniesz ich dużo).

Cyfry zegara wyglądają tak:

  |
  |
 _
 _|
|_
 _
 _|
 _|

|_|
  |
 _
|_
 _|
 _
|_
|_|
 _
  |
  |    
 _ 
|_|
|_|
 _
|_|
 _|
 _
| |
|_|

Przypadki testowe:

Wejście: 123

Wyświetlanie zegara:

       _   _
  | :  _|  _|
  | : |_   _|

Wynik: 4

Objaśnienie: Wyświetlenie 1:23wymaga narysowania łącznie 12 linii. Dlatego, aby każda cyfra była taka sama, każda cyfra musiałaby mieć 4 linie. Jedyna cyfra zawierająca 4 linie to 4. Dlatego odpowiedź musi być 4.

Wejście: 1212

Wyświetlanie zegara:

     _        _
  |  _| :  |  _|
  | |_  :  | |_

Wynik: -1

Objaśnienie: Wskazanie dla 12:12wymaga 14 linii. 14 podzielone przez 4 nie jest liczbą całkowitą, dlatego niemożliwe jest, aby każda cyfra była taka sama.

Wejście: 654

Wyświetlanie zegara:

 _     _  
|_  : |_  |_|
|_| :  _|   |

Wynik: 5

Objaśnienie: Całkowita liczba linii wynosi 15. 15 podzielone przez 3 to 5, więc każda cyfra musi mieć 5 linii. Jedynymi cyfry, które mają 5 linii są 2, 3i 5. Odpowiedź jest taka, 5że potrzeba tylko 2 ruchów, aby każda cyfra 5. Po prostu przenieś linię w lewym dolnym rogu 6 do dolnej 4, a następnie:

 _     _  
|_  : |_  |_|
 _| :  _|  _|

Następnie, jak widać, wystarczy przesunąć linię w prawym górnym rogu cyfry, która pierwotnie wynosiła 4 na górę, i otrzymujesz 5:55. Aby każda cyfra a 2lub 3wymagała więcej niż 2 ruchów.

Wejście: 609

Wyświetlanie zegara:

 _     _   _
|_  : | | |_|
|_| : |_|  _|

Wyjście: 609( 6,0,9lub [6,0,9]też ok).

Objaśnienie: 6, 0, i 9są tylko cyfry, które mają 6 linii. Jako takie są również jedynymi możliwymi rozwiązaniami. Nietrudno dostrzec, że wykonanie jednego z nich jako jedynej cyfry wymagałoby dwóch ruchów. Dlatego wyprowadzasz wszystkie trzy cyfry.

Uwagi:

  • Chociaż czas wejściowy musi być prawidłowy, czas wyjściowy nie (np. 999Ponieważ wyjście jest OK.)
  • Jestem bardzo elastyczny z wkładem. Możesz wymagać wiodącego 0. Możesz użyć liczby z przecinkiem dziesiętnym. Możesz użyć ciągu. Możesz użyć tablicy. Możesz mieć parametr dla każdej cyfry.
geokavel
źródło
Powiązane: codegolf.stackexchange.com/q/54008/42545
ETHproductions

Odpowiedzi:

1

Julia, 160 157 154

x->(c=count_ones;l=[119;36;93;109;46;107;123;37;127;111];m=l[x+1];n=map(a->c(a)==mean(map(c,m))?sum(map(b->c(a$b),m)):1/0,l);find(n.==minimum(n).!=1/0)-1)

To jest funkcja lambda. Przypisz ją do zmiennej, aby ją wywołać. Akceptuje wektor liczb całkowitych z zakresu 0-9dowolnej długości i zwraca (prawdopodobnie pusty) wektor wyników.

Przypadki testowe

julia> clock = x->(c=co...        # assign function to variable
(anonymous function)

julia> clock([1 2 3])
1-element Array{Int64,1}:
 4

julia> clock([1 2 1 2])
0-element Array{Int64,1}

julia> clock([6 5 4])
1-element Array{Int64,1}:
 5

clock([6 0 9])
3-element Array{Int64,1}:
 0
 6
 9

Wyjaśnienie

Zliczyć siedem segmentów i przedstawić je jako wektor bitowy.

+---+                     +-0-+
|   |      Enumerate      1   2
+---+   >  the seven  >   +-3-+
|   |      segments       4   5
+---+                     +-6-+

Przykład: 1 (włączone segmenty 2 + 5) staje się 36(ustawione bity 2 + 5).
Oto reprezentacje cyfr 0-9.

l=[119;36;93;109;46;107;123;37;127;111];
m=l[x+1];

Możemy użyć cyfry jako indeksu, aby uzyskać reprezentację wektora bitowego. +1z powodu indeksowania 1 w Julii.

Funkcja c=count_ones;zlicza liczbę 1-bitów w liczbie całkowitej. Przypisujemy alias, ponieważ potrzebujemy go częściej.

Pełny program, nieco nie golfowy:

x->(
  c=count_ones;
  l=[119;36;93;109;46;107;123;37;127;111];
  m=l[x+1];
  n=map(a->c(a)==mean(map(c,m))?sum(map(b->c(a$b),m)):1/0,l);
  find(n.==minimum(n).!=1/0)-1
)

Teraz szczegółowo dwa ostatnie wiersze:

mean(map(c,m)) oblicza średnią liczbę wierszy na cyfrę wejściową.

n=map(a->...,l) zapętla reprezentację wektorową wszystkich cyfr.

Jeśli liczba wierszy naszej bieżącej cyfry ajest nierówna w stosunku do średniej liczby wierszy wejścia, zwróć inf.

c(a)==mean(map(c,m))?...:1/0

Jeśli nie, zwróć sumę odległości Hamminga między naszą obecną a wszystkimi cyframi wejściowymi.

sum(map(b->c(a$b),m))

Mamy teraz wektor ndługości 10reprezentujący liczby, 0-9który daje nam całkowitą liczbę dodań / usunięć, które musimy wykonać, aby przekształcić wszystkie cyfry wejściowe na tę liczbę lub inf, jeśli taka transformacja jest niemożliwa bez zmiany liczby linii.

find(n.==minimum(n).!=1/0)-1

Na koniec wypisz położenia (oparte na 0) wszystkich minimów, które nie są inf.

Rainer P.
źródło