Orologio digitale abbina puzzle


10

Esistono molti enigmi con partite che prevedono l'aggiunta, la rimozione o lo spostamento di un certo numero di partite per creare nuovi numeri o forme. È così con un orologio digitale.

Dato un tempo valido su un orologio digitale di 12 ore, emetti la cifra che richiede di spostare il minor numero di linee per renderla tale che ogni cifra visibile sull'orologio diventa quella cifra. Se più di una cifra è il minimo, emetterle tutte. Se è impossibile rendere ogni cifra uguale, l'output -1o un valore errato diverso da 0 (ne otterrai molti).

Le cifre dell'orologio assomigliano a questo:

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

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

Casi test:

Ingresso: 123

Visualizzazione dell'orologio:

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

Produzione: 4

Spiegazione: Il display per 1:23richiede un totale di 12 linee da disegnare. Pertanto, affinché ogni cifra sia la stessa, ogni cifra dovrebbe avere 4 righe. L'unica cifra che ha 4 righe è 4. Pertanto, la risposta deve essere 4.

Ingresso: 1212

Visualizzazione dell'orologio:

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

Produzione: -1

Spiegazione: Il display per 12:12richiede 14 righe. 14 diviso 4 non è un numero intero, pertanto è impossibile che ogni cifra sia la stessa.

Ingresso: 654

Visualizzazione dell'orologio:

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

Produzione: 5

Spiegazione: Il numero totale di righe è 15. 15 diviso 3 è 5, quindi ogni cifra deve avere 5 righe. Le uniche cifre che hanno 5 linee sono 2, 3e 5. La risposta è 5perché sono necessarie solo 2 mosse per effettuare ogni cifra 5. Basta spostare la linea in basso a sinistra del 6 in fondo al 4, quindi hai:

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

Quindi, come puoi vedere, tutto ciò che devi fare è spostare la linea in alto a destra della cifra che originariamente era 4 in alto e ottieni 5:55. Per rendere ogni cifra una 2o 3richiederebbe più di 2 mosse.

Ingresso: 609

Visualizzazione dell'orologio:

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

Uscita: 609( 6,0,9o [6,0,9]anche ok).

Spiegazione: 6, 0, e 9sono le uniche cifre che hanno 6 linee. Come tali, sono anche le uniche soluzioni possibili. Non è difficile vedere che sarebbero necessarie due mosse per rendere una di queste cifre l'unica cifra. Pertanto, vengono emesse tutte e tre le cifre.

Appunti:

  • Sebbene il tempo di input debba essere valido, il tempo di output no (ad es. 999Poiché un output è OK).
  • Sono molto flessibile con l'input. È possibile richiedere un 0. iniziale È possibile utilizzare un numero con un punto decimale. Puoi usare una stringa. È possibile utilizzare un array. Puoi avere un parametro per ogni cifra.

Risposte:


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)

Questa è una funzione lambda. Assegnalo a una variabile per chiamarlo. Accetta un vettore di numeri interi nell'intervallo 0-9di qualsiasi lunghezza e restituisce un vettore (possibilmente vuoto) di risultati.

Casi test

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

Spiegazione

Enumera i sette segmenti e li rappresenta come un vettore bit.

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

Esempio: 1 (segmenti 2 + 5 abilitati) diventa 36(bit 2 + 5 impostati).
Ecco le rappresentazioni per le cifre 0-9.

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

Possiamo usare la cifra come indice per ottenere la sua rappresentazione vettoriale bit. +1a causa dell'indicizzazione basata su 1 in julia.

La funzione c=count_ones;conta il numero di 1 bit in un numero intero. Assegniamo un alias perché ne abbiamo bisogno più spesso.

Il programma completo, un po 'non soddisfatto:

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
)

Ora, le ultime due righe in dettaglio:

mean(map(c,m)) calcola il numero medio di righe per cifra di input.

n=map(a->...,l) scorre sopra la rappresentazione vettoriale di tutte le cifre.

Se il numero di righe della nostra cifra corrente aè diverso dal conteggio medio dell'input, restituire inf.

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

In caso contrario, restituisce la somma delle distanze di Hamming tra la nostra attuale e tutte le cifre di input.

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

Ora abbiamo un vettore ndi lunghezza che 10rappresenta i numeri 0-9che ci fornisce il numero totale di aggiunte / eliminazioni che dobbiamo eseguire per trasformare tutte le cifre di input in quel numero o inf, se tale trasformazione è impossibile senza cambiare il numero di linee.

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

Infine, visualizza le posizioni (basate su 0) di tutti i minimi che non lo sono inf.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.