Lampu mati, versi 7-segmen

14

Diberi tampilan 7-segmen dengan beberapa segmen dihidupkan dan beberapa mati, temukan urutan digit (0-9), sehingga setelah mengganti segmen yang sesuai untuk setiap digit, semua segmen dimatikan.

Contoh

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

Angka dan segmennya:

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

Aturan

Codegolf ⊨ entri terpendek menang.

Memasukkan

Daftar segmen yang tidak kosong yang dinyalakan, diberikan sebagai

  1. Urutan angka. Segmen diberi nomor dari atas ke bawah, kiri ke kanan; mulai dari 0 atau 1. Nomor tidak perlu berurutan.

  2. Satu digit 7-bit. MSB / LSB tidak ditentukan (dengan demikian Anda dapat memilih).

Karakter non-numerik antar angka diperbolehkan (tetapi tidak harus didukung).

Misalnya. untuk nomor 7: 136atau 1010010atau0100101

Keluaran

Urutan angka yang akan "diterapkan" ke layar. Tidak dibatasi dengan cara apa pun, seperti urutan angka. Misalnya. untuk keadaan awal sesuai dengan nomor 1, output yang valid akan 1, 111, 010, dll

Output alternatif adalah digit 10-bit (sekali lagi, MSB / LSB adalah pilihan Anda). Misalnya. untuk 1sebagai input, outputnya adalah 1000000000atau 0000000001.

Beberapa kombinasi memiliki beberapa solusi non-berulang, misalnya. segmen yang sesuai dengan huruf besar Hdapat dimatikan 013, tetapi juga 489dan0258 .

Jika tidak ada solusi (yang saya percaya tidak mungkin), hasilnya kosong.

kyrill
sumber
2
Ini membutuhkan lebih banyak spesifikasi. Segmen mana yang termasuk dalam setiap digit (misalnya, apakah 9 termasuk segmen bawah?) Harap gambar semua digit dan tunjukkan jumlah segmen yang termasuk dalam masing-masing.
Level River St
Juga, format apa yang diizinkan untuk input? Apakah nomor segmen akan diberikan secara berurutan? Apa yang kita lakukan jika tidak ada solusi?
Level River St
"Beberapa kombinasi memiliki beberapa solusi non-berulang" Selain itu, permutasi suatu solusi adalah solusi lain, bukan? (seperti 301untuk H).
Arnauld
1
Bukti bahwa solusi selalu ada: cukup untuk menemukan solusi untuk setiap segmen individu. Solusi untuk segmen horisontal, dari atas ke bawah, adalah 17, 08, dan 1479. Solusi untuk segmen vertikal atas, kiri ke kanan, adalah 39dan 59. Solusi untuk segmen vertikal bawah, kiri ke kanan, adalah 56dan 2389.
Greg Martin
1
@GregMartin 2tidak selalu diperlukan, karena Anda bisa menggantinya dengan baik 0468, 1358atau 1369, tergantung pada apakah Anda ingin 0, 8atau 9dalam jawaban Anda, tetapi tidak ada cara untuk menghilangkan 7sama sekali, dan saya pikir Anda harus memiliki setidaknya satu dari 1dan 3.
Neil

Jawaban:

4

Jelly , 26 25 byte

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

Cobalah online!

Mengambil input sebagai bilangan bulat 7-bit. Mengembalikan bentuk biner dari integer 10-bit.

Ini hanya memaksa semua kemungkinan. Hapus untuk mendapatkan semua kemungkinan keluaran atau ganti dengan Xuntuk mendapatkan kemungkinan keluaran acak.

Program Visualisasi Ajaib!

Bagaimana itu bekerja

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
fireflame241
sumber
1
Array angka ( “wØ][:koR¶z‘) mungkin berisi kesalahan. Nomor Anda 9tidak memiliki segmen bawah (bandingkan 9dalam visualisasi Anda dengan yang ada di deskripsi tugas). Kalau tidak sangat bagus, terutama visualisasi!
kyrill
1
@cabut diperbaiki! Hanya diperlukan sedikit perubahan dalam daftar literal.
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)

Ini berfungsi karena:

  • Beralih 1 dan 7 hanya mengaktifkan segmen atas
  • Beralih 1, 2 dan 6 hanya mengubah segmen kiri atas
  • Beralih 1, 2, 3, 5, dan 6 hanya mengubah segmen kanan atas
  • Beralih 2, 4 dan 6 hanya mengaktifkan segmen tengah
  • Beralih 5 dan 6 hanya mengubah segmen kiri bawah
  • Beralih 2, 3, 5 dan 6 hanya mengubah segmen kanan bawah
  • Beralih 2, 3, 4, 6 dan 7 hanya mengubah segmen bawah
Neil
sumber
1
Tidak yakin apakah ini harus diterima sebagai pemenang, karena jelas Anda mengambil beberapa inspirasi dari Arnauld. Tapi kemudian, dia juga mengambil beberapa inspirasi dari komentar Anda. Bagaimanapun, jawaban yang bagus, kalian berdua!
kyrill
@kyrill Jawaban saya yang diperbarui juga merupakan saran dari Neil. Tidak ada keraguan bahwa jawabannya menang sejauh ini.
Arnauld
2

JavaScript (ES6), 117 107 101 86 84 byte

Disimpan 15 byte berkat Neil

Mengambil input sebagai bilangan bulat 7-bit, di mana LSB adalah segmen atas. Mengembalikan bilangan bulat 10-bit di mana LSB adalah digit 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

Demo

Arnauld
sumber
1
Rekursi yang lebih pendek: 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. Atau jika Anda menganggap jawaban itu ada 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 Terima kasih! Ya, jawaban selalu ada.
Arnauld
1
Karena selalu memungkinkan untuk membuat jawaban menggunakan digit 1-7, Anda dapat menyimpan 8 byte lebih lanjut dengan menghapus83 dan ,91,75dan menggunakan k+2.
Neil
2

Mathematica, 40 byte

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

(Ini mungkin golf lebih banyak dengan memilih output untuk setiap segmen dengan hati-hati dan beralih antara LSB dan MSB.)

Ambil input sebagai daftar posisi misalnya {2,4,5,7}dan hasilkan angka 10-bit ( 384= 0110000000dalam biner) dalam urutan MSB (0, ..., 9).

Dalam contoh itu sesuai dengan

  |_
  |_

dan output sesuai dengan {7,8}.

Penjelasan:

Angka ajaib (daftar hardcoded) adalah output yang dikembalikan untuk setiap segmen. (dikodekan dalam biner) Dan, jika angka muncul dalam daftar dua kali, efeknya sama dengan tidak muncul, jadi bitor XOR digunakan. Kita hanya perlu XOR output dari kemungkinan nilai segmen dihidupkan.

pengguna202729
sumber
2

Jelly , 12 byte

ị“A#7*06n‘^/

Cobalah online!

Ini tidak kasar, dan itu jauh lebih pendek daripada solusi saya yang lain. Mengambil input sebagai daftar segmen yang dihidupkan, dan output karena LSB adalah segmen teratas.

Keluaran sebagai daftar digit bergerak.

Bagaimana itu bekerja

Ini akan cepat

ị“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
fireflame241
sumber
Tidak bisakah Anda mengambil keuntungan dari kenyataan bahwa solusi berulang diperbolehkan ketika menggunakan algoritma ini, untuk menggantikan pengurangan-XOR dengan sesuatu yang lebih pendek (seperti perataan)? Atau apakah saya melewatkan sesuatu?
Kode seperti yang saya miliki sekarang menghasilkan daftar bilangan bulat 7-bit kira-kira sama dengan 1*use digit 1 + 2*use digit 2 + 4*use digit 3 ... 64*use digit 7, kemudian XOR-menguranginya @ ais523. Meratakan akan berfungsi pada daftar digit yang digunakan yang membutuhkan lebih banyak karakter.
fireflame241