7 segmentli bir ekranın kodunu çözme


17

Muhtemelen hepiniz 0 9 arasındaki tüm rakamları görüntüleyebilen 7 segmentli ekranı biliyorsunuzdur :09

7 segmentli ekran (wikipedia.org)

Meydan okuma

Sadece AG segmentlerini düşünüyoruzAG göreviniz hangi segmentlerin açık olduğu göz önüne alındığında tek bir rakamın kodunu çözmek.

Bu, 8 bitlik bir tamsayı olarak kodlanabilir, burada ikili gösterimleri ve karşılık gelen küçük endian ve big-endian değerleri ile her bir rakamın tablosu:

Digit.ABCDEFGLittle-endianBig-endian0011111101260x7E1260x7E100110000480x30120x0C2011011011090x6D1820xB63011110011210x791580x9E400110011510x332040xCC501011011910x5B2180xDA601011111950x5F2500xFA7011100001120x70140x0E8011111111270x7F2540xFE9011110111230x7B2220xDE

Kurallar ve G / Ç

  • Girdi şunlardan biri olacak
    • tek tamsayı (verilen iki emirden birinin üzerindeki tabloda olduğu gibi)
    • bitlerin bir listesi / dizisi / ..
    • karakterlerden oluşan bir dize ABCDEFG( 7'yiABC kodlayan bir örnek olarak sıralandığını varsayabilirsiniz ), durumları sizin seçiminizdir (karışık durum değil)7
  • Çıktı kodladığı basamak olacaktır
  • Geçersiz giriş olmadığını varsayabilirsiniz (geçersiz, karşılık gelen rakam olmadığı anlamına gelir)

Testler

Bu zorluk birden fazla temsile izin verdiğinden, lütfen tabloya bakın.



Belirtilen bit sıralamasında veya yalnızca gösterilen ikisinde bir tamsayıyı (veya diziyi) kabul edebilir miyiz?
Jonathan Allan

@JonathanAllan: Açıklığa kavuşacağım, sadece zaten gösterilenler.
ბიმო

Ohhh bok, tüm girdi türlerini idare etmek zorunda değil misin? Sadece bir? Hata!
Sihirli Ahtapot Urn

@MagicOctopusUrn: Evet gerçekten :)
ბიმო

Yanıtlar:




7

Wolfram Dili (Mathematica) , 41 bayt

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

Çevrimiçi deneyin!

Küçük endian tam sayı sütununu girdi olarak kullanır. Sözdizimi uyarısını yok sayın.

Bir X girişi için, önce X mod 41'i ve sonra sonuç mod 11'i alıyoruz. Sonuçlar farklı mod 11'dir, böylece bunları bir tablodan çıkarabiliriz. Örneğin, 126 mod 41 mod 11 3'tür, bu nedenle konum 3'ü 0'a eşit yaparsak, 126 girişi için doğru cevabı alırız.

Tablo 9[,6,0,8,2,3,1,7,5,4]. Bölüm 0, başıdır 9. Bölüm 1 eksiktir, bu yüzden Nullbir bayt kaydetmek için: asla bölüm 1'e katılmamız gerekmiyor. Sonra bölüm 2 6, bölüm 3 0, ve her zamanki gibi.


Jonathan Allan'ın cevabı bize veriyor 1[4,9,8,6,2,0,5,3,7][[384~Mod~#~Mod~13]]&. Bu daha kısa değildir, ancak sözdizimi uyarısından kaçınır!


Wolfram Dili (Mathematica) , 27 25 bayt

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

(Burada pek görünmeyen bir karakter var, üzgünüm. Aşağıdaki bağlantıya tıklayın ve göreceksiniz.)

Çevrimiçi deneyin!

Bu, kaba dizinin içeri girmesi için kaba-zorlama ile ilgilidir, Hashböylece hashler doğru değerler mod 11'e sahip olur.


Mathematica'yı tanımayan biri için bu cevabı biraz açıklayabilir misiniz?
jrook

Herkes için okunabilir olacağını düşündüm, ama tamam, bir açıklamada düzenleyeceğim.
Misha Lavrov

Tebrikler; 41 baytlık çözüm Mathematica kompresörümü kırdı.
lirtosiast





3

Boşluk , 152 bayt

Zorunlu "S'ler, T'ler ve L'ler gerçekten orada değil, sadece komutların görünür temsilleri".

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	

Çevrimiçi deneyin!

Bir hatayla biter.

Eşdeğer montaj benzeri sözdizimi:

	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

3 bayt kaydetmek için üç sondaki yeni satırı kaldırabilirsiniz. STDERR'de bir hata veriyor, ancak program hala çalışıyor ve meta kurallar tarafından izin verildi .
Kevin Cruijssen

3

brainfuck , 474 176 154 151 149 137 bayt

Bir giriş dizesi Alır sekiz 0 ve 1ilk dahil 0ondalık noktası için.

(yazıdaki tablonun ikinci sütununda olduğu gibi)

0'dan 9'a kadar olan rakamları çıktılar.

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

Çevrimiçi deneyin!

Algoritma

Belirli bir segmentin durumunu gözlemleyerek, bir dizi olası haneyi daha küçük alt kümelere bölebiliriz. Kodumda kullanılan statik ikili arama ağacı. Sol alt ağaç segment AÇIK durumuna, sağ alt segment KAPALI durumuna karşılık gelir.

                                         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

Golf için yararlı bazı gözlemler

  1. C ve D bitleri gereksizdir ve yok sayılabilir.
  2. Baştaki sıfır (ondalık nokta için bit) (ab) değer 48 olarak kullanılabilir, bu hem girdi ayrıştırmak hem de çıktı hazırlamak için önemlidir.
  3. Yaprak ulaşıldığında ve rakam basıldığında, diğer tüm koşulları atlamamız yeterlidir. Veri işaretçisini sıfırlar alanına yeterince geri hareket ettirerek yapılabilir, böylece geri gelemez.
  4. Uyumluluk için sağda sıfır kullanmak daha iyidir, çünkü bazı BF uygulamaları negatif veri işaretleyicilerini desteklemez.
  5. Bu nedenle, çıktı değerini en sağdaki hücrede saklamak daha iyidir, böylece sıfırın sağındaki alana kolayca erişebiliriz.
  6. Bu nedenle bitleri soldan sağa kontrol etmek daha iyidir: A, B, E, F, G, böylece çıkış hücresine daha kolay ulaşabiliriz.
  7. Farklı rakamlar çıkış kodunu paylaşabilir. Örneğin, 5 ve 6 aynı alt ağaçtadır. Her +++++iki değer için ve sonra +sadece altı için yapabiliriz.
  8. +Önceden çıkış değerine 2 eklersek komut sayısını azaltabiliriz . Bu durumda 0, 1sadece ve sadece azaltmak ve diğer basamaklar için avantaj elde etmek gerekir .

2

Retina , 96 bayt

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

Çevrimiçi deneyin! En iyi yol olmayabilir, ancak Retina'da ilginç bir programlama yöntemi. Açıklama:

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

İlginç vakaları yakalamaya çalışır. Pozitif yakalamalar varsa mektubu yakalar. Bu nedenle yakalamanın uzunluğu mevcutsa 1, yoksa 0'dır. Özel durumlar, sadece D veya E yoksa sırasıyla mevcut olan 4 ve 6 yakalamalardır. Bunlar yalnızca ondalık olarak ifade edilebilir $#4ve $#6burada ihtiyacımız olan tek şey budur. Yakalamalar daha sonra uzunluğu istenen sayı olan bir dizgiye oluşturulur. Örneğin, yazarsak, 6*$1bu dize A varsa 6 uzunluğu ve yoksa 0 uzunluğu vardır. Farklı ifadeler arasında seçim yapmak için ya 0 ya da 1 olarak değerlendirilen ( $.pozitif yakalamalar için) ya da $#(negatif yakalamalar için) kullanırız ve bu şimdiye kadar dize ile çarpılabilir.

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

F6 kez ve Biki kez tekrarlanır (golfçü olarak birleştirme ile). Ancak sonuç her iki sürece göz ardı edilir Eve Gbulunur. Bu durumlarını ele 2, 6ve 8.

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

F5 kez tekrarlanır ve eğer Bmevcutsa, altıncı kez artı bir 3 (uzunluk 3 sabit bir dize ile temsil edilir) eklenir. Ancak, Dmevcut ve mevcut olmadığı sürece sonuç göz ardı edilir E. Bu durumlarını ele 3, 5ve 9.

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

A6 kez tekrarlanır ve G3 kez tekrarlanır ve fazladan 1eklenir (golfçü olduğu için ikisi arasında sabit bir karakterle gösterilir). Ancak, sonuç olmadığı sürece sonuç dikkate alınmaz D. Bu durumlarını ele 1, 4ve 7.

$.(

Yukarıdaki dizeler daha sonra birleştirilir ve uzunluk alınır. yukarıdakilerin hiçbiri geçerli değilse, hiçbir dize üretilmez ve bu nedenle uzunluğu0 .

Elde edilen dizeler (uzunluk alınmadan önce) aşağıdaki gibidir:

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

2

MATL , 14 bayt

'/lx2Z^o~z'Q&m

Girdi, küçük endian biçimindeki segmentleri temsil eden bir sayıdır.

Çevrimiçi deneyin!

açıklama

'/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 bayt

Big-endian değerini girdi olarak alır.

"~¶ÌÚúþÞ"bUd

Dene


açıklama

Dize, big-endian değerlerinin kod noktalarının her birindeki karakterleri içerir; Udkarakteri girişin kod noktasında alır ve bdizede dizinin dizinini bulur.


1

Neim , 15 bayt

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

Açıklama:

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

Çevrimiçi deneyin!



1

TI-BASIC (TI-83 + / 84 + serisi), 15 bayt

int(10fPart(194909642ln(Ans

Küçük endian girişi kullanır. Hashler TI-BASIC'te oldukça yaygındır, bu yüzden bir hash fonksiyonu brute-forcer yazdım böyle durumlar için .

Burada biraz şanslıyız, çünkü çarpan beklenen 10 yerine 9 basamak uzunluğunda.

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

1

05AB1E , 17 16 15 12 bayt

•NŽyf¯•I41%è

@ErikTheOutgolfer sayesinde -1 bayt .
-1 Byte @MishaLavrov 'un Mathematica cevap portu oluşturarak . @Grimy
sayesinde -3 bayt .

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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)

Neden •NŽyf¯•olduğunu anlamak için bu 05AB1E ucuma bakın ( Büyük tamsayılar nasıl sıkıştırılır? Bölümü )99608231754 .



@EriktheOutgolfer Ah, elbette .. Tesadüfen öyle 128в. İçin bir yerleşik olduğu Unuttum 128halve olmak 256. Teşekkürler!
Kevin Cruijssen

Bazı garip şeyleri de denedim. 15 yaşından küçük olamazdı ¦C•26¤æÈÛµÀš•2ô₂+sk. (19).
Sihirli Ahtapot Urn

1
@Grimy Teşekkürler! Şimdi görüyorum ki, sıkıştırılmış tamsayı boyut 11 olduğundan ve sarma başladı.
Kevin Cruijssen

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.