Đồng hồ kỹ thuật số phù hợp với câu đố


10

Có rất nhiều câu đố với các trận đấu liên quan đến việc thêm, xóa hoặc di chuyển một số lượng trận đấu nhất định để tạo ra số hoặc hình dạng mới. Điều này là như thế với một chiếc đồng hồ kỹ thuật số.

Cho thời gian hợp lệ trên đồng hồ kỹ thuật số 12 giờ, xuất ra chữ số yêu cầu di chuyển ít dòng nhất để làm cho nó để mọi chữ số hiển thị trên đồng hồ trở thành chữ số đó. Nếu nhiều hơn một chữ số là tối thiểu, hãy xuất tất cả chúng. Nếu không thể làm cho mọi chữ số giống nhau, đầu ra -1hoặc giá trị sai lệch khác 0 (bạn sẽ nhận được rất nhiều trong số này).

Các chữ số đồng hồ trông như thế này:

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

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

Các trường hợp thử nghiệm:

Đầu vào: 123

Hiển thị đồng hồ:

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

Đầu ra: 4

Giải thích: Màn hình hiển thị 1:23yêu cầu tổng cộng 12 dòng được vẽ. Do đó, để mỗi chữ số giống nhau, mỗi chữ số sẽ phải có 4 dòng. Chữ số duy nhất có 4 dòng là 4. Do đó, câu trả lời phải được 4.

Đầu vào: 1212

Hiển thị đồng hồ:

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

Đầu ra: -1

Giải thích: Màn hình hiển thị 12:12yêu cầu 14 dòng. 14 chia cho 4 không phải là một số nguyên, do đó không thể có mọi chữ số giống nhau.

Đầu vào: 654

Hiển thị đồng hồ:

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

Đầu ra: 5

Giải thích: Tổng số dòng là 15. 15 chia cho 3 là 5, vì vậy mỗi chữ số phải có 5 dòng. Các chữ số chỉ có 5 dòng là 2, 3, và 5. Câu trả lời là 5bởi vì nó chỉ cần 2 lần di chuyển để thực hiện mỗi chữ số 5. ​​Chỉ cần di chuyển dòng ở dưới cùng bên trái của số 6 xuống dưới cùng của số 4, sau đó bạn có:

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

Sau đó, như bạn có thể thấy, tất cả những gì bạn cần làm là di chuyển dòng ở phía trên bên phải của chữ số ban đầu là 4 lên trên cùng và bạn nhận được 5:55. Để làm cho mỗi chữ số a 2hoặc 3sẽ cần nhiều hơn 2 lần di chuyển.

Đầu vào: 609

Hiển thị đồng hồ:

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

Đầu ra: 609( 6,0,9hoặc [6,0,9]cũng ok).

Giải thích : 6, 09là các chữ số duy nhất có 6 dòng. Như vậy, chúng cũng là giải pháp khả thi duy nhất. Không khó để thấy rằng sẽ phải mất hai động tác để biến bất kỳ trong số này thành chữ số duy nhất. Do đó, bạn xuất cả ba chữ số.

Ghi chú:

  • Mặc dù thời gian đầu vào phải hợp lệ, thời gian đầu ra không (ví dụ 999như đầu ra là OK.)
  • Tôi rất linh hoạt với đầu vào. Bạn có thể yêu cầu số 0. Bạn có thể sử dụng số có dấu thập phân. Bạn có thể sử dụng một chuỗi. Bạn có thể sử dụng một mảng. Bạn có thể có một tham số cho mỗi chữ số.

Câu trả lời:


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)

Đây là một chức năng lambda. Chỉ định nó cho một biến để gọi nó. Chấp nhận một vectơ số nguyên trong phạm vi 0-9có độ dài bất kỳ và trả về một vectơ kết quả (có thể trống).

Các trường hợp thử nghiệm

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

Giải trình

Liệt kê bảy phân đoạn và biểu diễn chúng dưới dạng một vectơ bit.

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

Ví dụ: 1 (bật phân đoạn 2 + 5) 36(bit 2 + 5 được đặt).
Dưới đây là các đại diện cho chữ số 0-9.

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

Chúng ta có thể sử dụng chữ số làm chỉ mục để có được biểu diễn vectơ bit. +1bởi vì lập chỉ mục dựa trên 1 trong julia.

Hàm c=count_ones;đếm số lượng 1 bit trong một số nguyên. Chúng tôi gán một bí danh vì chúng tôi cần nó thường xuyên hơn.

Các chương trình đầy đủ, hơi vô căn cứ:

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
)

Bây giờ, hai dòng cuối cùng chi tiết:

mean(map(c,m)) tính toán số dòng trung bình trên mỗi chữ số đầu vào.

n=map(a->...,l) các vòng lặp trên biểu diễn vector của tất cả các chữ số.

Nếu số dòng của chữ số hiện tại của chúng tôi akhông bằng với dòng trung bình của đầu vào, hãy trả về inf.

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

Nếu không, trả về tổng Khoảng cách Hamming giữa hiện tại và tất cả các chữ số đầu vào của chúng tôi.

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

Bây giờ chúng ta có một vectơ nđộ dài 10biểu thị các số 0-9cho chúng ta tổng số lần thêm / xóa mà chúng ta phải thực hiện để chuyển đổi tất cả các chữ số đầu vào thành số đó, hoặc inf, nếu không thể thay đổi số lượng dòng đó.

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

Cuối cùng, xuất các vị trí (dựa trên 0) của tất cả các cực tiểu không inf.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.