Dekode tampilan 7-segmen


17

Anda mungkin semua tahu tampilan 7-segmen yang dapat menampilkan antara lain semua digit dari 09 :

Tampilan 7-segmen (wikipedia.org)

Tantangan

Kami hanya mempertimbangkan segmen AG , tugas Anda adalah untuk memecahkan kode satu digit mengingat segmen mana yang dihidupkan.

Ini dapat dikodekan sebagai integer 8-bit, berikut adalah tabel setiap digit dengan representasi binernya dan nilai-nilai little-endian dan big-endian yang sesuai:

Digit.ABCDEFGLittle-endianBig-endian0011111101260x7E1260x7E100110000480x30120x0C2011011011090x6D1820xB63011110011210x791580x9E400110011510x332040xCC501011011910x5B2180xDA601011111950x5F2500xFA7011100001120x70140x0E8011111111270x7F2540xFE9011110111230x7B2220xDE

Aturan & I / O

  • Input akan menjadi salah satu dari
    • bilangan bulat tunggal (seperti pada tabel di atas salah satu dari dua pesanan yang diberikan)
    • daftar / array / .. bit
    • string yang terdiri dari karakter ABCDEFG(Anda dapat menganggap itu diurutkan, sebagai contoh ABCmengkodekan 7 ), case mereka adalah pilihan Anda (bukan case campuran)
  • Output akan menjadi digit yang disandikannya
  • Anda dapat menganggap tidak ada input yang tidak valid (tidak valid berarti tidak ada digit yang sesuai)

Tes

Karena tantangan ini memungkinkan banyak representasi, silakan merujuk ke tabel.



Bisakah kita menerima integer (atau array) dalam bit-order tertentu atau hanya dua yang ditampilkan?
Jonathan Allan

@ JonathanAllan: Saya akan mengklarifikasi, hanya yang sudah ditampilkan.
ბიმო

Ohhh omong kosong, Anda tidak harus menangani semua tipe input? Hanya satu? Whoops ...
Magic Octopus Mm

@MagicOctopusUrn: Ya memang :)
ბიმო

Jawaban:




7

Bahasa Wolfram (Mathematica) , 41 byte

9[,6,0,8,2,3,1,7,5,4][[#~Mod~41~Mod~11]]&

Cobalah online!

Menggunakan kolom bilangan bulat kecil-endian sebagai input. Abaikan peringatan sintaksis.

Untuk input X, pertama-tama kita ambil X mod 41 dan kemudian ambil hasilnya mod 11. Hasilnya berbeda mod 11, jadi kita bisa mengekstraknya dari sebuah tabel. Misalnya, 126 mod 41 mod 11 adalah 3, jadi jika kita membuat posisi 3 sama dengan 0, maka kita mendapatkan jawaban yang benar untuk input 126.

Tabelnya adalah 9[,6,0,8,2,3,1,7,5,4]. Bagian 0 adalah kepala, yaitu 9. Bagian 1 hilang, jadi itu Null, untuk menyelamatkan byte: kita tidak perlu mengambil bagian 1. Kemudian bagian 2 adalah 6, bagian 3 adalah 0, dan seterusnya, seperti biasa.


Jawaban Jonathan Allan memberi kita 1[4,9,8,6,2,0,5,3,7][[384~Mod~#~Mod~13]]&. Ini tidak lebih pendek, tetapi menghindari peringatan sintaksis!


Bahasa Wolfram (Mathematica) , 27 25 byte

Mod[Hash[")dD}"#]+2,11]&

(Ada beberapa karakter di sini yang tidak muncul, maaf. Klik tautan di bawah dan Anda akan melihatnya.)

Cobalah online!

Ini semua tentang memaksa brute beberapa string untuk masuk ke dalam Hashsehingga hash akhirnya memiliki nilai yang tepat mod 11. Lebih memaksa brute mungkin bisa membawa kita ke solusi yang lebih pendek.


Bisakah Anda jelaskan jawaban ini sedikit, untuk seseorang yang tidak tahu Mathematica?
jrook

Saya pikir itu akan bisa dibaca oleh siapa saja, tapi oke, saya akan mengedit penjelasan.
Misha Lavrov

Selamat; solusi 41 byte memecahkan kompresor Mathematica saya.
lirtosiast





3

Spasi , 152 byte

Wajib "S, T, dan L tidak benar-benar ada, mereka hanya merupakan representasi perintah yang terlihat".

S S S T	S S L
S S S T	S T	L
S S S T	T	T	L
S S S T	L
S S S T	T	L
S S S T	S L
S S S T	S S S L
S S S L
S S S T	T	S L
S S S L
S S S T	S S T	L
S S S L
S L
S T	L
T	T	T	T	T	S S S T	S T	S S T	L
T	S T	T	S S S T	S T	T	L
T	S T	T	L
S S L
S L
S L
T	S S L
S T	L
S T	L
S S S T	L
T	S S T	L
S L
L
L
S S S L
S L
L
T	L
S T	

Cobalah online!

Berakhir dalam kesalahan.

Sintaks yang mirip perakitan:

	push 4
	push 5
	push 7
	push 1
	push 3
	push 2
	push 8
	push 0
	push 6
	push 0
	push 9
	push 0
	dup
	readi
	retrieve
	push 41
	mod
	push 11
	mod
slideLoop:
	dup
	jz .slideLoop
	slide 1
	push 1
	sub
	jmp slideLoop
.slideLoop:
	drop
	printi

Anda dapat menghapus tiga baris tambahan untuk menghemat 3 byte. Ini memberikan kesalahan dalam STDERR, tetapi program masih berfungsi, dan diizinkan oleh meta-rules .
Kevin Cruijssen

3

brainfuck , 474 176 154 151 149 137 byte

Mengambil string input delapan 0 dan 1termasuk yang pertama 0untuk titik desimal.

(seperti pada kolom kedua dari tabel di pos)

Menghasilkan digit dari 0 hingga 9.

,>,>,>,,,>,>,>+[[->]<++<<<<<<]>[>[>[>[->[>++++++<-<]>[--<]<]>>.>>]<[>
>[>->++<<-]>-[+>++++<]>+.>]]>[>>>+<<<-]>[>>+++.>]]>[>>>[>+++<-]>-.>]

Cobalah online!

Algoritma

Dengan mengamati keadaan segmen tertentu kita dapat membagi satu set digit yang mungkin menjadi himpunan bagian yang lebih kecil. Di bawah ini adalah pohon pencarian biner statis yang digunakan dalam kode saya. Subtree kiri sesuai dengan status segmen ON, kanan sesuai dengan status segmen OFF.

                                         0,1,2,3,4,5,6,7,8,9
                                                  |    
                                         /-------[A]-------------------------\
                                 0,2,3,5,6,7,8,9                             1,4
                                        |                                     |
                         /-------------[B]----------------\             /----[G]----\
                   0,2,3,7,8,9                            5,6          4             1   
                        |                                  |
              /--------[E]--------\                  /----[E]----\    
            0,2,8                3,7,9              6             5
              |                    |
        /----[F]----\        /----[F]----\
      0,8            2      9            3,7   
       |                                  |
 /----[G]----\                      /----[G]----\
8             0                    3             7

Beberapa pengamatan bermanfaat untuk bermain golf

  1. Bit C dan D berlebihan dan dapat diabaikan.
  2. Leading nol (bit untuk titik desimal) dapat (ab) digunakan sebagai nilai 48, penting baik untuk mengurai input dan menyiapkan output.
  3. Ketika daun tercapai dan angka dicetak, kita hanya perlu melewati semua kondisi lebih lanjut. Ini bisa dilakukan dengan memindahkan pointer data cukup jauh ke area nol sehingga tidak bisa kembali.
  4. Untuk kompatibilitas, lebih baik menggunakan nol di sebelah kanan, karena beberapa implementasi BF tidak mendukung pointer data negatif.
  5. Oleh karena itu lebih baik untuk menyimpan nilai output di sel paling kanan, sehingga kita dapat dengan mudah mencapai area nol di sebelah kanan.
  6. Oleh karena itu lebih baik untuk memeriksa bit dari kiri ke kanan: A, B, E, F, G sehingga kita dapat mencapai sel output lebih mudah.
  7. Digit yang berbeda dapat membagikan kode output. Misalnya, 5 dan 6 berada di subtree yang sama. Kami dapat melakukan +++++untuk kedua nilai dan kemudian +hanya untuk enam.
  8. Kami dapat mengurangi jumlah +perintah jika kami menambahkan 2 ke nilai output terlebih dahulu. Dalam hal ini kita perlu menguranginya untuk 0dan 1hanya dan mendapatkan keuntungan untuk digit lainnya.

2

Retina , 96 byte

^(A)?(B)?C?(D|())(E|())(F)?(G)?
$.($.5*$.8*$(6*$7$2$2)$#6*$.3*$($.2*$(___$7)5*$7)$#4*$(6*$1_3*$8

Cobalah online! Mungkin bukan cara terbaik, tapi ini cara pemrograman yang menarik di Retina. Penjelasan:

^(A)?(B)?C?(D|())(E|())(F)?(G)?

Mencoba menangkap kasus-kasus menarik. Capture positif hanya menangkap surat itu jika ada. Karenanya panjang tangkapan adalah 1 jika ada dan 0 jika tidak ada. Kasing khusus adalah tangkapan 4 dan 6 yang hanya ada jika D atau E tidak ada. Ini hanya dapat dinyatakan dalam desimal sebagai $#4dan $#6tetapi hanya itu yang kita butuhkan di sini. Tangkapan tersebut kemudian dibangun menjadi string yang panjangnya adalah angka yang diinginkan. Sebagai contoh, jika kita menulis 6*$1maka string ini memiliki panjang 6 jika A ada dan 0 jika tidak ada. Untuk memilih antara ekspresi yang berbeda, kami menggunakan $.(untuk tangkapan positif) atau $#(untuk tangkapan negatif) yang dievaluasi menjadi 0 atau 1 dan ini kemudian dapat dikalikan dengan string sejauh ini.

$.5*$.8*$(6*$7$2$2)

Fdiulang 6 kali dan Bdua kali (oleh penggabungan karena itu golfier). Namun, hasilnya diabaikan kecuali keduanya Edan Gada. Ini menangani kasus 2, 6dan 8.

$#6*$.3*$($.2*$(___$7)5*$7)

Fdiulang 5 kali, dan jika Bada, itu ditambahkan keenam kali ditambah 3 tambahan (diwakili oleh string konstan panjang 3). Namun, hasilnya diabaikan kecuali Dada dan Etidak ada. Ini menangani kasus 3, 5dan 9.

$#4*$(6*$1_3*$8

Adiulang 6 kali, dan Gdiulang 3 kali, dan tambahan 1ditambahkan (diwakili oleh karakter konstan antara keduanya karena golfier). Namun hasilnya diabaikan kecuali Dtidak ada. Ini menangani kasus 1, 4dan 7.

$.(

Senar di atas kemudian digabungkan dan panjangnya diambil. jika tidak ada yang di atas berlaku, tidak ada string yang dihasilkan, dan panjangnya karenanya 0.

String yang dihasilkan (sebelum panjang diambil) adalah sebagai berikut:

1   _
2   BB
3   ___
4   _GGG
5   FFFFF
6   FFFFFF
7   AAAAAA_
8   FFFFFFBB
9   ___FFFFFF

2

MATL , 14 byte

'/lx2Z^o~z'Q&m

Input adalah angka yang mewakili segmen dalam format little-endian.

Cobalah online!

Penjelasan

'/lx2Z^o~z'  % Push this string
Q            % Add 1 to the codepoint of each char. This gives the array
             % [48 109 ... 123], corresponding to numbers 1 2 ... 9. Note that
             % 0 is missing
&m           % Implicit input. Call ismember function with second output. This
             % gives the 1-based index in the array for the input, or 0 if the
             % input is not present in the array.
             % Implicit display



1

Japt, 15 byte

Mengambil nilai big-endian sebagai input.

"~¶ÌÚúþÞ"bUd

Cobalah


Penjelasan

String berisi karakter pada masing-masing codepoint nilai big-endian; Udmendapatkan karakter di codepoint input dan bmenemukan indeks itu dalam string.


1

Neim , 15 byte

&bᚫJ𝕂𝕨O𝐖𝐞ℤ£ᛖ𝕪)𝕀

Penjelasan:

&bᚫJ𝕂𝕨O𝐖𝐞ℤ£ᛖ𝕪)      create list [126 48 109 121 51 91 95 112 127 123]
                 𝕀     index of

Cobalah online!



1

TI-BASIC (TI-83 + / 84 + series), 15 byte

int(10fPart(194909642ln(Ans

Menggunakan input little-endian. Hash cukup umum di TI-BASIC, jadi saya menulis fungsi hash brute-forcer untuk kasus seperti ini.

Kami mendapat sedikit keberuntungan di sini, karena pengganda 9 digit lebih panjang daripada yang diharapkan 10.

      fPart(194909642ln(Ans   hash function mapping onto [0,1)
int(10                        take first digit after decimal point

1

05AB1E , 17 16 15 12 byte

•NŽyf¯•I41%è

-1 byte terima kasih kepada @ErikTheOutgolfer .
-1 byte dengan membuat port jawaban Mathematica dari @MishaLavrov .
-3 byte terima kasih kepada @Grimy .

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

NŽyf¯•       # Push compressed integer 99608231754
       I41%   # Push the input modulo-41
           è  # Index this into the integer (with automatic wraparound)
              # (and output the result implicitly)

Lihat ini 05AB1E ujung tambang (bagian Cara kompres bilangan bulat besar? ) Untuk memahami mengapa •NŽyf¯•adalah 99608231754.



@EriktheOutgolfer Ah, tentu saja .. Kebetulan itu 128в. Lupa ada builtin untuk dibelah 128dua 256. Terima kasih!
Kevin Cruijssen

Saya mencoba beberapa hal aneh juga tidak bisa di bawah 15. Upaya paling aneh: ¦C•26¤æÈÛµÀš•2ô₂+sk(19).
Magic Gurita Guci

1
@ Terima kasih kotor! Sekarang saya melihatnya jelas, karena bilangan bulat yang dikompresi adalah ukuran 11 dan wraparound masuk.
Kevin Cruijssen

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.