Digitaluhr passt Puzzle

10

Es gibt viele Rätsel mit Übereinstimmungen , bei denen eine bestimmte Anzahl von Übereinstimmungen hinzugefügt, entfernt oder verschoben wird, um neue Zahlen oder Formen zu erstellen. Das ist bei einer Digitaluhr so.

Geben Sie bei einer gültigen Zeit auf einer 12-Stunden-Digitaluhr die Ziffer aus, für die die wenigsten Zeilen verschoben werden müssen, damit jede sichtbare Ziffer auf der Uhr zu dieser Ziffer wird. Wenn mehr als eine Ziffer das Minimum ist, geben Sie alle aus. Wenn es nicht möglich ist, jede Ziffer gleich zu machen, wird eine Ausgabe -1oder ein anderer falscher Wert als 0 ausgegeben (viele davon erhalten Sie).

Die Ziffern der Uhr sehen folgendermaßen aus:

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

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

Testfälle:

Eingang: 123

Uhranzeige:

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

Ausgabe: 4

Erläuterung: Für die Anzeige für 1:23müssen insgesamt 12 Linien gezeichnet werden. Damit jede Ziffer gleich ist, müsste jede Ziffer 4 Zeilen haben. Die einzige Ziffer mit 4 Zeilen ist 4. Daher muss die Antwort sein 4.

Eingang: 1212

Uhranzeige:

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

Ausgabe: -1

Erläuterung: Die Anzeige für 12:12erfordert 14 Zeilen. 14 geteilt durch 4 ist keine ganze Zahl, daher ist es unmöglich, dass jede Ziffer gleich ist.

Eingang: 654

Uhranzeige:

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

Ausgabe: 5

Erläuterung: Die Gesamtzahl der Zeilen beträgt 15. 15 geteilt durch 3 ist 5, daher muss jede Ziffer 5 Zeilen haben. Die einzigen Stellen , die 5 Linien sind 2, 3und 5. Die Antwort ist, 5weil es nur 2 Züge erfordert, um jede Ziffer 5 zu machen. Verschieben Sie einfach die Linie unten links von der 6 nach unten zur 4, dann haben Sie:

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

Wie Sie sehen, müssen Sie dann nur noch die Linie oben rechts von der Ziffer, die ursprünglich 4 war, nach oben verschieben, und Sie erhalten 5:55. Um jede Ziffer zu einem 2oder zu machen, 3wären mehr als 2 Züge erforderlich.

Eingang: 609

Uhranzeige:

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

Ausgabe: 609( 6,0,9oder [6,0,9]auch ok).

Erläuterung: 6, 0, und 9sind die einzigen Stellen , die 6 Zeilen haben. Als solche sind sie auch die einzig möglichen Lösungen. Es ist nicht schwer zu erkennen, dass zwei Schritte erforderlich sind, um eine dieser Ziffern zur einzigen zu machen. Daher geben Sie alle drei Ziffern aus.

Anmerkungen:

  • Obwohl die Eingabezeit gültig sein muss, gilt dies nicht für die Ausgabezeit (z. B. 999da eine Ausgabe in Ordnung ist).
  • Ich bin sehr flexibel mit Input. Sie können eine führende 0 benötigen. Sie können eine Zahl mit einem Dezimalpunkt verwenden. Sie können eine Zeichenfolge verwenden. Sie können ein Array verwenden. Sie können für jede Ziffer einen Parameter festlegen.
Geokavel
quelle
Siehe auch
ETHproductions

Antworten:

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)

Dies ist eine Lambda-Funktion. Weisen Sie es einer Variablen zu, um es aufzurufen. Akzeptiert einen Vektor von Ganzzahlen im Bereich 0-9beliebiger Länge und gibt einen (möglicherweise leeren) Ergebnisvektor zurück.

Testfälle

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

Erläuterung

Zählen Sie die sieben Segmente auf und stellen Sie sie als Bitvektor dar.

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

Beispiel: 1 (Segmente 2 + 5 aktiviert) wird 36(Bits 2 + 5 gesetzt).
Hier sind die Darstellungen für Ziffern 0-9.

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

Wir können die Ziffer als Index verwenden, um die Bitvektordarstellung zu erhalten. +1wegen 1-basierter indizierung in julia.

Die Funktion c=count_ones;zählt die Anzahl der 1-Bits in einer Ganzzahl. Wir weisen einen Alias ​​zu, weil wir ihn häufiger benötigen.

Das vollständige Programm, etwas ungolfed:

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
)

Nun die letzten beiden Zeilen im Detail:

mean(map(c,m)) berechnet die durchschnittliche Anzahl von Zeilen pro Eingangsziffer.

n=map(a->...,l) Schleifen über die Vektordarstellung aller Ziffern.

Wenn die Anzahl der Zeilen unserer aktuellen Ziffer nicht ader durchschnittlichen Zeilenanzahl der Eingabe entspricht, geben Sie zurück inf.

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

Wenn nicht, geben Sie die Summe der Hamming-Entfernungen zwischen unserer aktuellen und allen Eingangsziffern zurück.

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

Wir haben jetzt einen Vektor nder Länge, 10der die Zahlen darstellt 0-9, die uns die Gesamtzahl der Hinzufügungen / Löschungen geben, die wir durchführen müssen, um alle Eingangsziffern in diese Zahl umzuwandeln, oder infwenn eine solche Transformation unmöglich ist, ohne die Anzahl der Zeilen zu ändern.

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

Geben Sie abschließend die Positionen (0-basiert) aller Minima aus, die nicht vorhanden sind inf.

Rainer P.
quelle