Jam Digital Puzzle Teka-Teki

10

Ada banyak teka - teki dengan kecocokan yang melibatkan menambah, menghapus, atau memindahkan sejumlah kecocokan untuk membuat angka atau bentuk baru. Ini seperti itu dengan jam digital.

Diberi waktu yang valid pada jam digital 12 jam, mengeluarkan angka yang mengharuskan pemindahan garis paling sedikit untuk membuatnya sehingga setiap angka yang terlihat pada jam menjadi angka itu. Jika lebih dari satu digit adalah minimum, hasilkan semuanya. Jika tidak mungkin untuk membuat setiap digit sama, output -1atau nilai falsy selain 0 (Anda akan mendapatkan banyak dari ini).

Digit jam terlihat seperti ini:

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

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

Kasus uji:

Memasukkan: 123

Tampilan Jam:

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

Keluaran: 4

Penjelasan: Tampilan untuk 1:23membutuhkan total 12 garis harus ditarik. Oleh karena itu, agar setiap digit sama, setiap digit harus memiliki 4 baris. Satu-satunya digit yang memiliki 4 baris adalah 4. Karena itu, jawabannya harus 4.

Memasukkan: 1212

Tampilan Jam:

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

Keluaran: -1

Penjelasan: Tampilan untuk 12:12membutuhkan 14 baris. 14 dibagi 4 bukanlah bilangan bulat, oleh karena itu tidak mungkin setiap digit sama.

Memasukkan: 654

Tampilan Jam:

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

Keluaran: 5

Penjelasan: Jumlah total baris adalah 15. 15 dibagi 3 adalah 5, sehingga setiap digit harus memiliki 5 baris. Satu-satunya angka yang memiliki 5 garis 2, 3dan 5. Jawabannya adalah 5karena hanya membutuhkan 2 gerakan untuk membuat setiap digit 5. Cukup pindahkan garis di kiri bawah 6 ke bawah 4, maka Anda harus:

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

Kemudian, seperti yang Anda lihat, yang perlu Anda lakukan adalah memindahkan garis di kanan atas digit yang semula 4 ke atas, dan Anda dapatkan 5:55. Untuk membuat setiap digit a 2atau 3membutuhkan lebih dari 2 gerakan.

Memasukkan: 609

Tampilan Jam:

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

Output: 609( 6,0,9atau [6,0,9]juga ok).

Penjelasan: 6,, 0dan 9satu-satunya digit yang memiliki 6 garis. Karena itu, mereka juga satu-satunya solusi yang mungkin. Tidak sulit untuk melihat bahwa perlu dua langkah untuk menjadikan semua ini satu-satunya digit. Karena itu, Anda mengeluarkan ketiga digit tersebut.

Catatan:

  • Meskipun waktu input harus valid, waktu output tidak (mis. 999Sebagai output OK.)
  • Saya sangat fleksibel dengan input. Anda dapat meminta angka 0. Anda dapat menggunakan angka dengan titik desimal. Anda bisa menggunakan string. Anda bisa menggunakan array. Anda dapat memiliki parameter untuk setiap digit.
geokavel
sumber

Jawaban:

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)

Ini adalah fungsi lambda. Tetapkan ke variabel untuk memanggilnya. Menerima vektor bilangan bulat dalam rentang 0-9panjang berapa pun dan mengembalikan vektor hasil (mungkin kosong).

Uji kasus

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

Penjelasan

Hitung tujuh segmen dan wakili sebagai bit vektor.

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

Contoh: 1 (segmen 2 + 5 diaktifkan) menjadi 36(bit 2 + 5 diatur).
Berikut adalah representasi untuk digit 0-9.

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

Kita dapat menggunakan digit sebagai indeks untuk mendapatkan representasi bit vektor. +1karena pengindeksan 1 berbasis di julia.

Fungsi c=count_ones;menghitung jumlah 1-bit dalam bilangan bulat. Kami menetapkan alias karena kami lebih sering membutuhkannya.

Program lengkapnya, agak tidak digubah:

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
)

Sekarang, dua baris terakhir secara terperinci:

mean(map(c,m)) menghitung jumlah rata-rata garis per digit input.

n=map(a->...,l) loop representasi vektor semua digit.

Jika jumlah baris digit kami saat aini tidak sama dengan jumlah rata-rata input, kembalilah inf.

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

Jika tidak, kembalikan jumlah Jarak Hamming antara digit kami saat ini dan semua input.

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

Kami sekarang memiliki vektor npanjang yang 10mewakili angka-angka 0-9yang memberi kami jumlah total penambahan / penghapusan yang harus kami lakukan untuk mengubah semua digit input ke angka itu, atau inf, jika transformasi seperti itu tidak mungkin dilakukan tanpa mengubah jumlah garis.

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

Akhirnya, keluarkan lokasi (berbasis-0) dari semua minimum yang tidak inf.

Rainer P.
sumber