Tắt đèn, phiên bản 7 đoạn


14

Đưa ra màn hình 7 đoạn với một số phân đoạn được bật và tắt, hãy tìm một chuỗi các chữ số (0-9), để sau khi bật các phân đoạn tương ứng cho mỗi chữ số, tất cả các phân đoạn đều bị tắt.

Thí dụ

  _
  _    [3] =>     |   [1] =>    [OFF]
  _               |

Số và các phân đoạn tương ứng của chúng:

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

Quy tắc

Codegolf, mục nhập ngắn nhất sẽ thắng.

Đầu vào

Một danh sách không trống các phân đoạn được bật, được đưa ra dưới dạng

  1. Một dãy số. Các phân đoạn được đánh số từ trên xuống dưới, từ trái sang phải; bắt đầu từ 0 hoặc 1. Các số không cần phải theo thứ tự.

  2. Một chữ số 7 bit duy nhất. MSB / LSB không được chỉ định (do đó bạn có thể chọn).

Các ký tự không phải là số giữa các số được cho phép (nhưng không bắt buộc phải được hỗ trợ).

Ví dụ. cho số 7: 136hoặc 1010010hoặc0100101

Đầu ra

Một chuỗi các số được "áp dụng" cho màn hình. Không bị hạn chế dưới bất kỳ hình thức nào, chẳng hạn như thứ tự của các chữ số. Ví dụ. cho trạng thái ban đầu tương ứng với số lượng 1, kết quả đầu ra hợp lệ sẽ 1, 111, 010vv

Một đầu ra thay thế là một chữ số 10 bit (một lần nữa, MSB / LSB là lựa chọn của bạn). Ví dụ. đối 1với đầu vào, đầu ra sẽ là 1000000000hoặc 0000000001.

Một số kết hợp có một số giải pháp không lặp lại, ví dụ. các phân đoạn tương ứng với chữ in hoa Hcó thể được tắt bằng 013, nhưng cũng 4890258.

Nếu không có giải pháp nào tồn tại (mà tôi tin là không thể), thì đầu ra trống rỗng.


2
Điều này cần thêm đặc điểm kỹ thuật. Những phân đoạn nào được bao gồm trong mỗi chữ số (ví dụ: 9 có bao gồm phân đoạn dưới cùng không?) Vui lòng vẽ tất cả các chữ số và cho biết số của các phân đoạn được bao gồm trong mỗi chữ số.
Cấp sông St

Ngoài ra, những định dạng được phép cho đầu vào? Các số phân khúc sẽ được đưa ra theo thứ tự? Chúng ta phải làm gì nếu không có giải pháp?
Cấp sông St

"Một số kết hợp có một số giải pháp không lặp lại" Ngoài ra, bất kỳ hoán vị của một giải pháp là một giải pháp khác, phải không? (thích 301cho H).
Arnauld

1
Bằng chứng là một giải pháp luôn tồn tại: nó đủ để tìm giải pháp cho từng phân khúc riêng lẻ. Giải pháp cho các phân đoạn ngang, từ trên xuống dưới, là 17, 081479. Các giải pháp cho các phân đoạn dọc trên, từ trái sang phải, là 3959. Các giải pháp cho các phân đoạn dọc thấp hơn, từ trái sang phải, là 562389.
Greg Martin

1
@GregMartin 2không phải lúc nào cần thiết, bởi vì bạn có thể thay thế nó với một trong hai 0468, 1358hoặc 1369, tùy thuộc vào việc bạn muốn có một 0, 8hoặc 9trong câu trả lời của bạn, nhưng không có cách nào để loại bỏ 7ở tất cả, và tôi nghĩ rằng bạn phải có ít nhất một của 13.
Neil

Câu trả lời:


4

Thạch , 26 25 byte

2ṗ⁵’µ×“wØ][:koR¶{‘^/=µÐfḢ

Hãy thử trực tuyến!

Lấy đầu vào dưới dạng số nguyên 7 bit. Trả về dạng nhị phân của số nguyên 10 bit.

Đây chỉ là vũ phu tất cả các khả năng. Loại bỏ để có được tất cả các đầu ra có thể hoặc thay thế nó bằng một Xđể có được một đầu ra ngẫu nhiên có thể.

Chương trình ảo thuật trực quan!

Làm thế nào nó hoạt động

2ṗ⁵’µ×“wØ][:koR¶{‘^/=µÐfḢ  - main link, takes one integer
2ṗ⁵’                       - generate all length-10 binary arrays
    µ                µÐf   - now we find those arrays which correspond to digit-
                              sequences which work to switch off all segments:
                              Filter (keep) those arrays which:
     ×                      - multiplied by 
      “wØ][:koR¶{‘          - [119, 18, 93, 91, 58, 107, 111, 82, 127, 123] 
                               (encoding for turned-on segments given number)
                  ^/        - reduced by XOR
                    =      - are equal to (implicit) the program's input
                        Ḣ  - output the first of these valid arrays

1
Mảng số ( “wØ][:koR¶z‘) có thể chứa lỗi. Số của bạn 9thiếu phân đoạn dưới cùng (so sánh 9trong trực quan hóa của bạn với phân đoạn trong mô tả nhiệm vụ). Nếu không thì rất đẹp, đặc biệt là sự trực quan!
kyrill

1
@kyrill Đã sửa! Chỉ cần một sự thay đổi nhỏ trong danh sách theo nghĩa đen.
fireflame241

2

JavaScript (ES6), 60 byte

n=>[65,35,55,42,48,54,110].reduce((r,v,i)=>r^=n>>i&1&&v+v,0)

Điều này hoạt động vì:

  • Toggling 1 và 7 chỉ bật phân khúc hàng đầu
  • Toggling 1, 2 và 6 chỉ bật phân đoạn trên cùng bên trái
  • Toggling 1, 2, 3, 5 và 6 chỉ bật phân khúc trên cùng bên phải
  • Toggling 2, 4 và 6 chỉ bật phân khúc trung tâm
  • Toggling 5 và 6 chỉ bật đoạn dưới cùng bên trái
  • Toggling 2, 3, 5 và 6 chỉ bật phân khúc dưới cùng bên phải
  • Toggling 2, 3, 4, 6 và 7 chỉ bật phân khúc dưới cùng

1
Không chắc chắn liệu điều này có nên được chấp nhận như một người chiến thắng hay không, bởi vì rõ ràng bạn đã lấy một số cảm hứng từ Arnauld. Nhưng sau đó, anh ấy cũng lấy một số cảm hứng từ bình luận của bạn. Dù sao, câu trả lời tốt đẹp, cả hai bạn!
kyrill

@kyrill Câu trả lời cập nhật của tôi cũng là một gợi ý từ Neil. Không có nghi ngờ rằng câu trả lời của ông chiến thắng cho đến nay.
Arnauld

2

JavaScript (ES6), 117 107 101 86 84 byte

Đã lưu 15 byte nhờ Neil

Lấy đầu vào là số nguyên 7 bit, trong đó LSB là phân đoạn trên. Trả về số nguyên 10 bit trong đó LSB là chữ số 0.

f=(n,k)=>[83,0,57,73,10,71,87,1,91,75].reduce((n,v,i)=>n^=k>>i&1&&v+36,n)?f(n,-~k):k

Bản giới thiệu


1
Đệ quy ngắn hơn : f=(n,k=1023)=>[83,0,57,73,10,71,87,1,91,75].reduce((n,v,i)=>n^=k>>i&1&&v+36,n)?k--&&f(n,k):k. Hoặc nếu bạn giả sử một câu trả lời tồn tại , f=(n,k=0)=>[83,0,57,73,10,71,87,1,91,75].reduce((n,v,i)=>n^=k>>i&1&&v+36,n)?f(n,k+1):k.
Neil

1
@Neil Cảm ơn! Vâng, một câu trả lời luôn tồn tại.
Arnauld

1
Vì nó là luôn luôn có thể tạo ra một câu trả lời bằng cách sử dụng chữ số 1-7, bạn có thể tiết kiệm thêm 8 byte bằng cách loại bỏ 83,91,75và sử dụng k+2.
Neil

2

Toán học, 40 byte

BitXor@@{260,802,10,514,3,266,293}[[#]]&

(Nó có thể được đánh gôn nhiều hơn bằng cách chọn đầu ra cho từng phân khúc một cách cẩn thận và chuyển đổi giữa LSB và MSB.)

Lấy đầu vào làm danh sách các vị trí chẳng hạn {2,4,5,7}và xuất số 10 bit ( 384= 0110000000ở dạng nhị phân) theo thứ tự MSB (0, ..., 9).

Trong ví dụ này tương ứng với

  |_
  |_

và đầu ra tương ứng với {7,8}.

Giải trình:

Các số ma thuật (danh sách mã hóa cứng) là đầu ra được trả về cho mỗi phân đoạn. (được mã hóa dưới dạng nhị phân) Và, nếu một số xuất hiện trong danh sách hai lần, hiệu ứng tương tự như nó không xuất hiện, do đó, XOR bitwise được sử dụng. Chúng ta chỉ cần XOR đầu ra của giá trị có thể của các phân đoạn được bật.


2

Thạch , 12 byte

ị“A#7*06n‘^/

Hãy thử trực tuyến!

Đây không phải là sức mạnh vũ phu, và nó ngắn hơn đáng kể so với giải pháp khác của tôi. Lấy đầu vào dưới dạng danh sách các phân đoạn bật và đầu ra là LSB là phân khúc hàng đầu.

Đầu ra là danh sách các chữ số di chuyển.

Làm thế nào nó hoạt động

Điều này sẽ được nhanh chóng

ị“A#7*06n‘^/ - main link, takes input as a list of turned-on segments (eg. [1,3,6])
 “A#7*06n‘   - list literal [65,35,55,42,48,54,110] where each element is a 7-bit
                 integer, where each integer corresponds to how to turn off
                 a segment (eg. turn off the first segment with 7 and 1 =>2^7+2^1=>64)
ị            - get the elements in the list corresponding to the input indices
          ^/ - XOR reduce these elements to get a single 7-bit integer

Bạn không thể tận dụng thực tế là các giải pháp lặp đi lặp lại được phép khi sử dụng thuật toán này, để thay thế XOR-less bằng một cái gì đó ngắn hơn (chẳng hạn như làm phẳng)? Hay tôi đang thiếu một cái gì đó?

Mã như tôi có bây giờ tạo ra một danh sách các số nguyên 7 bit xấp xỉ bằng 1*use digit 1 + 2*use digit 2 + 4*use digit 3 ... 64*use digit 7, sau đó XOR giảm chúng @ ais523. Làm phẳng sẽ làm việc trên một danh sách các chữ số được sử dụng có nhiều ký tự hơn.
fireflame241
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.