Dijital Saat Maç Bulmaca


10

Yeni sayılar veya şekiller oluşturmak için belirli sayıda eşleşme eklemeyi, kaldırmayı veya taşımayı içeren eşleşmeleri olan birçok bulmaca vardır . Bu dijital bir saatte böyledir.

12 saatlik bir dijital saatte geçerli bir zaman verildiğinde, saatteki her görünür basamağın o basamak haline gelmesi için en az satırın hareket ettirilmesini gerektiren basamağın çıktısını alın. Birden fazla basamak minimumsa, bunların tümünü çıktılayın. Her basamağı aynı yapmak mümkün değilse, çıktı -1veya 0 dışında bir falsy değeri (bunlardan çok şey alırsınız).

Saat haneleri şöyle görünür:

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

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

Test Durumları:

Giriş: 123

Saat ekranı:

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

Çıktı: 4

Açıklama: için ekran 1:23toplam 12 satır çizilmesini gerektirir. Bu nedenle, her rakamın aynı olması için her rakamın 4 satırı olmalıdır. 4 satırlı tek rakam 4. Bu nedenle cevap olmalı 4.

Giriş: 1212

Saat ekranı:

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

Çıktı: -1

Açıklama: için ekran 12:1214 satır gerektirir. 14 bölü 4 tamsayı değildir, bu nedenle her basamağın aynı olması imkansızdır.

Giriş: 654

Saat ekranı:

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

Çıktı: 5

Açıklama: Toplam satır sayısı 15'tir. 15 bölü 3'tür, bu nedenle her basamağın 5 satırı olmalıdır. 5 hatları tek basamak vardır 2, 3ve 5. Cevap, 5her basamağı 5 yapmak için sadece 2 hareket gerektirmesidir.

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

Gördüğünüz gibi yapmanız gereken tek şey, başlangıçta 4 olan basamağın sağ üstündeki çizgiyi yukarı taşımaktır ve elde edersiniz 5:55. Her basamağı yapmak için a 2veya 32'den fazla hareket gerekir.

Giriş: 609

Saat ekranı:

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

Çıktı: 609( 6,0,9veya [6,0,9]ayrıca tamam).

Açıklama: 6,, 0ve 96 satırı olan tek basamaktır. Bu nedenle, onlar da tek olası çözümlerdir. Bunlardan herhangi birini tek basamak haline getirmenin iki hareket gerektireceğini görmek zor değil. Bu nedenle, üç basamağın tümünü çıkarırsınız.

Notlar:

  • Giriş süresi geçerli olmakla birlikte, çıkış süresi geçerli değildir (örneğin 999, bir çıkış iyi olduğu için).
  • Girdi konusunda çok esnekim. Satır başına 0 girmeniz gerekebilir. Ondalık virgül içeren bir sayı kullanabilirsiniz. Bir dize kullanabilirsiniz. Bir dizi kullanabilirsiniz. Her basamak için bir parametreniz olabilir.

Yanıtlar:


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)

Bu bir lambda fonksiyonudur. Bunu çağırmak için bir değişkene atayın. 0-9Herhangi bir uzunluktaki bir tamsayılar vektörünü kabul eder ve sonuçların (muhtemelen boş) bir vektörünü döndürür.

Test senaryoları

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

açıklama

Yedi segmenti numaralandırın ve bunları bit vektörü olarak temsil edin.

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

Örnek: 1 (segment 2 + 5 etkin) olur 36(bit 2 + 5 seti).
İşte rakamların gösterimleri 0-9.

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

Parçayı bit vektörü temsilini almak için dizin olarak kullanabiliriz. +1çünkü Julia'da 1 tabanlı indeksleme.

İşlev c=count_ones;, bir tamsayıdaki 1 bit sayısını sayar. Bir takma ad atarız çünkü daha sık ihtiyacımız vardır.

Tam program, biraz 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
)

Şimdi, son iki satır ayrıntılı olarak:

mean(map(c,m)) Girdi basamağı başına ortalama satır sayısını hesaplar.

n=map(a->...,l) tüm basamakların vektör temsili üzerinden döner.

Mevcut arakamımızın satır sayısı girişin ortalama satır sayısına eşit değilse , geri dönün inf.

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

Değilse, mevcut ve tüm giriş basamaklarımız arasındaki Hamming Mesafelerinin toplamını döndürün .

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

Şimdi, tüm giriş basamaklarını bu sayıya dönüştürmek için gerçekleştirmemiz gereken toplam ekleme / silme sayısını veren sayıları temsil eden bir nuzunluk vektörünüz var veya satır sayısını değiştirmeden böyle bir dönüşüm mümkün değilse.100-9inf

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

Son olarak, olmayan tüm minimaların konumlarını (0 tabanlı) çıktılayın inf.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.