Giải câu đố Matchstick


17

Trên SE khó hiểu, có những thứ được gọi là "các vấn đề về que diêm" trong đó toán học được viết bằng que diêm và bạn được phép di chuyển một số lượng nhất định để có được một tài sản nhất định.

Trong câu hỏi này, chúng tôi sẽ chỉ xem xét các số nguyên được trình bày theo định dạng hiển thị 7 đoạn. Dưới đây là tất cả 10 chữ số theo định dạng đó:

 __          __   __          __    __    __    __    __
|  |     |   __|  __|  |__|  |__   |__      |  |__|  |__|
|__|     |  |__   __|     |   __|  |__|     |  |__|   __|    

Mỗi phân đoạn của màn hình là một "que diêm" có thể được di chuyển độc lập với phần còn lại của số. Que diêm là không thể chia cắt và không thể phá hủy, không thể bị phá vỡ hoặc loại bỏ bằng bất kỳ phương tiện.

Một câu đố phổ biến là lấy một số đã cho trong cơ sở 10 và cố gắng tạo số lớn nhất có thể trong một số lần di chuyển nhất định. Di chuyển được coi là một chuyển động của que diêm từ bất kỳ vị trí bị chiếm dụng nào sang bất kỳ vị trí không có người khác. Bạn hoàn toàn được phép tạo các chữ số mới ở hai bên của số, ví dụ 0 có thể được thực hiện thành 77 cho 3 di chuyển

 __      __  __      __   __      __   __
|  |    |  |        |  |    |       |    |
|__| ,   __|     ,     |      ,     |    |

Tuy nhiên, bạn không được biến một vị trí thành 2 hoặc tạo các vị trí mới giữa các vị trí hiện có, ví dụ: biến số 4 thành số 11 ở giữa một số hoặc chèn các chữ số mới vào giữa các số hiện có. Mỗi lần di chuyển không cần tạo một số thích hợp nhưng kết quả cuối cùng phải là một số thích hợp trong màn hình 10 phân đoạn cơ sở. Bạn không cần phải sử dụng mọi di chuyển nếu bạn không muốn. Không giống như đánh đố, đây là [thẻ: câu hỏi kết thúc] bạn không được sử dụng bất kỳ toán tử nào (phép nhân, số mũ, v.v.) hoặc hằng số toán học (số Pi, số của Graham, v.v.) trong câu trả lời của bạn.

Bài tập

Viết chương trình hoặc hàm lấy một số và một số lần di chuyển làm đầu vào và trả về số lớn nhất có thể được thực hiện với nhiều lần di chuyển trên số ban đầu.

Đây là một câu hỏi về vì vậy các câu trả lời sẽ được tính theo byte, với ít byte hơn sẽ tốt hơn.

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

n, moves -> max
0, 1     -> 9
0, 3     -> 77
0, 4     -> 111
8, 3     -> 74
220, 1   -> 320
220, 2   -> 520
220, 3   -> 7227
220, 4   -> 22111
220, 5   -> 32111
747, 1   -> 747
747, 2   -> 7171
747, 3   -> 7711

Liên quan


5
Tôi ... thực sự thức khuya đêm qua suy nghĩ về khoảng cách Levenshtein giữa các chữ số que diêm khác nhau ... Thật là một sự trùng hợp kỳ lạ: P
ETHproductions 25/07/17

1
Các khe trống hình thành ở giữa có thể bị bỏ qua ở cuối không? Ví dụ:919, 2 -> 991
DanTheMan


lúa mì phù thủy, lưới nào đang được sử dụng?
tuskiomi

@tuskiomi "Tuy nhiên, bạn không thể biến một vị trí thành 2 hoặc tạo các vị trí mới giữa các vị trí hiện có"
Thuật sĩ lúa mì

Câu trả lời:


7

JavaScript (ES6), 297 286 279 267 byte

Đưa đầu vào theo cú pháp currying (s)(k), trong đó s là một mảng các ký tự chữ số và k là số lần di chuyển (số nguyên).

s=>k=>(B=(n,b=0)=>n?B(n^n&-n,b+1):b,b=[...p='u"[k,iy#}m'].map(c=>c.charCodeAt()+2),r=[],g=(n,d='')=>n?n>0&&b.map((v,i)=>g(n-B(v),d+i)):r.push(d))(s.reduce((s,c)=>s+B(b[c]),M=0))&&b.map((_,j)=>r.map(n=>M=[...n+p].reduce((t,d,i)=>t+B(b[d]^b[s[i-j]]),0)>k*2|+n<M?M:n))|M

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


Làm sao?

Dữ liệu hình dạng và chức năng trợ giúp

  • Mảng b mô tả hình dạng của các chữ số là số nguyên 7 bit, trong đó mỗi bit là một đoạn:

    7 đoạn

    Chẳng hạn, hình dạng của "7" là 0b0100101 = 37.

  • Hàm trợ giúp B () trả về số 1 trong biểu diễn nhị phân của một số đã cho:

    B = (n, b = 0) => n ? B(n ^ n & -n, b + 1) : b

Bước 1

Trước tiên chúng tôi đếm số lượng que diêm được sử dụng trong số đầu vào:

s.reduce((s, c) => s + B(b[c]), 0)

Bước 2

Chúng tôi chuyển giá trị này cho hàm đệ quy g () , điền vào danh sách r với tất cả các số có thể được xây dựng với chính xác số que diêm này:

g = (n, d = '') =>
  n ?
    n > 0 &&
    b.map((v, i) => g(n - B(v), d + i))
  :
    r.push(d)

Chẳng hạn, g (5) sẽ tải [ '17', '2', '3', '5', '71' ]vào r .

Bước 3

Bây giờ chúng ta phải chọn số M cao nhất trong r mà thực tế có thể lấy được từ số đầu vào, trong số lượng di chuyển được phép k .

Bởi vì mỗi số n trong r sử dụng chính xác số lượng que diêm như số đầu vào s , nên số lần di chuyển cần thiết để chuyển đổi s thành n bằng một nửa số lượng chênh lệch phân đoạn giữa mỗi chữ số của chúng.

Số lượng chênh lệch phân đoạn giữa hai chữ số xy được cho bởi số 1 trong biểu diễn nhị phân của b [x] XOR b [y] .

Cuối cùng, điều quan trọng cần lưu ý là chúng ta cần thử một số cách sắp xếp chữ số có thể, bởi vì chữ số đầu tiên của s không nhất thiết phải được ánh xạ đến chữ số đầu tiên của n . Sự thay đổi giữa các chữ số được cho bởi biến j trong mã.


1

Toán học, 188 197 200 203 170 174 byte

LƯU Ý: Mã vẫn là loại lỗi. Tôi đang giải quyết nó.

+30 byte cho lỗi

(p=PadLeft;q=IntegerDigits;g=Join@@(#~q~2~p~7&/@ToCharacterCode["w$]m.k{% o"][[1+q@#]])&;h=(v=g@#2~#~96-g@i~#~96;Tr@v==0&&Tr@Abs@v<=2#3)&;For[i=10^Tr@g@#,!h[p,##]&&!h[PadRight,##],--i];i)&

Nhân vật giữa %onên 0x7Fnhưng SE sẽ không cho phép. Bạn có thể nhấp vào liên kết pastebin để sao chép mã gốc.

Mã này mất rất nhiều thời gian khi có hơn 6-7 gậy. (Bạn có thể sửa đổi giá trị bắt đầu của imột số nhỏ hơn để kiểm tra nó)

Giải trình

glà một hàm trợ giúp chuyển đổi các chữ số thành một danh sách biểu diễn thanh (theo đây ), chẳng hạn như {1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1}cho 220.

h là một hàm trợ giúp để đối phó với phần đệm bên trái và phần đệm bên phải giữa hai số.

flặp từ 10^Tr@g@#(giới hạn trên) để 1tìm một số nguyên có biểu diễn thanh có cùng số lượng 1 -> 00 -> 1so với số ban đầu và đại lượng nhỏ hơn hoặc bằng số đối số thứ hai.


Tôi đã cho bạn +1 vì tôi chưa bao giờ thấy câu trả lời chiến thắng có điểm thấp hơn câu trả lời khác. Tôi cho rằng đó là vì nó thiếu các tùy chọn kiểm tra trực tuyến. Có lẽ một số người có Mathicala có thể đến và kiểm tra nó và xác minh rằng nó hoạt động tốt, vì vậy bạn có thể nhận được một số upvote hơn. Hoặc có lẽ ai đó có thể chuyển đổi nó thành Octave nếu có thể.
geokavel
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.