Işıklar sönük, 7 segmentli versiyon


14

Bazı bölümleri açık ve bazıları kapalı olan 7 segmentli bir ekran verildiğinde, her basamak için karşılık gelen bölümleri değiştirdikten sonra tüm bölümler kapatılacak şekilde bir basamak dizisi (0-9) bulun.

Misal

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

Sayılar ve karşılık gelen segmentleri:

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

kurallar

Codegolf ⊨ en kısa giriş kazanır.

Giriş

Açık olan segmentlerin boş bir listesi,

  1. Bir sayı dizisi. Segmentler yukarıdan aşağıya, soldan sağa doğru numaralandırılmıştır; 0 veya 1'den başlayarak. Sayıların sırayla olması gerekmez.

  2. Tek bir 7 bitlik rakam. MSB / LSB belirtilmedi (böylece seçebilirsiniz).

Sayılar arasında sayısal olmayan karakterlere izin verilir (ancak desteklenmesi gerekmez).

Örneğin. sayı için 7: 136veya 1010010veya0100101

Çıktı

Ekrana "uygulanacak" bir sayı dizisi. Rakamların sırası gibi hiçbir şekilde kısıtlanmamıştır. Örneğin. numaraya karşılık gelen ilk durumu için 1, geçerli bir çıkış olur 1, 111, 010vs.

Alternatif bir çıkış 10 bitlik bir rakamdır (yine, MSB / LSB seçiminizdir). Örneğin. için 1olduğu gibi giriş, çıkış olur 1000000000ya da 0000000001.

Bazı kombinasyonların birkaç tekrarlayıcı olmayan çözümü vardır, örn. büyük harfe karşılık gelen segmentler , ve ile de Hkapatılabilir .0134890258

Hiçbir çözüm yoksa (ki bu mümkün olmadığını düşünüyorum), çıktı boş.


2
Bunun daha fazla spesifikasyona ihtiyacı var. Her basamağa hangi segmentler dahil edilir (örneğin, 9 alt segmenti içerir mi?) Lütfen tüm rakamları çizin ve her birine dahil olan segmentlerin sayısını belirtin.
Level River St

Ayrıca, giriş için hangi biçimlere izin verilir? Segment numaraları sırayla verilecek mi? Çözüm yoksa ne yaparız?
Level River St

"Bazı kombinasyonların birkaç tekrarlanan olmayan çözümü vardır" Ayrıca, herhangi bir çözümün permütasyonu başka bir çözümdür, değil mi? (gibi 301için H).
Arnauld

1
Bir çözümün her zaman var olduğunun kanıtı: her bir segment için çözüm bulmak yeterlidir. Yukarıdan aşağıya doğru yatay segmentler için Çözümler, vardır 17, 08ve 1479. Soldan sağa, üst dikey segmentlerine yönelik çözümler vardır 39ve 59. Soldan sağa doğru alt dikey segmentler için çözümler: 56ve 2389.
Greg Martin

1
@GregMartin 2ya ile değiştirin, çünkü her zaman gerekli değildir 0468, 1358ya da 1369, sen istemenize bir bağlı 0, 8ya 9da cevap ama orada ortadan kaldırmak için bir yol var 7hiç ve senin az birine de olması gerekir düşünüyorum arasında 1ve 3.
Neil

Yanıtlar:


4

Jöle , 26 25 bayt

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

Çevrimiçi deneyin!

Girişi 7 bitlik bir tam sayı olarak alır. 10 bitlik bir tam sayının ikili biçimini döndürür.

Bu sadece bütün olasılıkları zorlar. Mümkün olan tüm çıkışları almak için bu düğmeyi çıkarın veya Xrastgele bir olası çıkış elde etmek için bir ile değiştirin .

Sihirli Görselleştirme Programı!

Nasıl çalışır

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
Sayı dizisi ( “wØ][:koR¶z‘) bir hata içerebilir. Numaranız 9alt segmentten yoksundur ( 9görselleştirmenizde görev açıklamasındaki segmentle karşılaştırın ). Aksi takdirde çok güzel, özellikle görselleştirme!
kyrill

1
@kyrill Düzeltildi! Sadece liste değişmezinde küçük bir değişiklik gerekiyordu.
fireflame241

2

JavaScript (ES6), 60 bayt

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

Bu çalışır çünkü:

  • 1 ve 7 arasında geçiş yapmak yalnızca üst segmenti değiştirir
  • 1, 2 ve 6 arasında geçiş yapmak yalnızca sol üst segmenti değiştirir
  • 1, 2, 3, 5 ve 6 arasında geçiş yapmak yalnızca sağ üst segmenti değiştirir
  • 2, 4 ve 6 arasında geçiş yapmak yalnızca orta segmenti değiştirir
  • 5 ve 6 arasında geçiş yapmak yalnızca sol alt segmenti değiştirir
  • 2, 3, 5 ve 6 arasında geçiş yapmak yalnızca sağ alt segmenti değiştirir
  • 2, 3, 4, 6 ve 7 arasında geçiş yapmak yalnızca alt segmenti değiştirir

1
Bunun kazanan olarak kabul edilip edilmeyeceğinden emin değilim, çünkü açıkça Arnauld'dan ilham aldınız. Ama sonra, yorumundan da ilham aldı. Her neyse, güzel cevap, ikiniz de!
kyrill

@kyrill Güncellenmiş cevabım Neil tarafından da önerildi. Cevabının şimdiye kadar kazandığına şüphe yok.
Arnauld

2

JavaScript (ES6), 117 107 101 86 84 bayt

Neil sayesinde 15 bayt kurtardı

Girişi 7 bitlik bir tamsayı olarak alır, burada LSB üst segmenttir. LSB'nin basamak olduğu 10 bitlik bir tam sayı döndürür 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

gösteri


1
Özyineleme kısadır: 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. Veya bir cevap olduğunu varsayarsanız 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 Teşekkürler! Evet, her zaman bir cevap vardır.
Arnauld

1
O rakamları kullanarak bir cevap oluşturmak için her zaman mümkündür olarak 1-7, sen kaldırarak daha 8 bayt kaydedebilir 83ve ,91,75ve kullanma k+2.
Neil

2

Mathematica, 40 bayt

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

(Her segment için çıktıyı dikkatle seçerek ve LSB ile MSB arasında geçiş yaparak daha fazla golf oynayabilir.)

Örneğin, konumların bir listesi olarak girdiyi alın {2,4,5,7}ve MSB sırasında (0, ..., 9) 10 bitlik bir sayı ( 384= 0110000000ikili olarak) çıkın .

Örnekte buna karşılık gelir

  |_
  |_

ve çıktı karşılık gelir {7,8}.

Açıklama:

Sihirli sayılar (sabit kodlu liste) her bölüm için döndürülen çıktıdır. (ikili olarak kodlanır) Ve listede bir sayı iki kez görünürse, efekt görünmemesi ile aynıdır, bu nedenle bitsel XOR kullanılır. Sadece bölümlerin olası değerinin çıkışını XOR yapmamız gerekiyor.


2

Jöle , 12 bayt

ị“A#7*06n‘^/

Çevrimiçi deneyin!

Bu kaba kuvvet yapmaz ve diğer çözümümden çok daha kısadır. Girişi açık segmentlerin listesi olarak alır ve LSB üst segment olduğu için çıkışlar.

Rakam hareketlerinin listesi olarak çıktı.

Nasıl çalışır

Bu hızlı olacak

ị“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

Bu algoritmayı kullanırken, XOR-indirgeme işlevini daha kısa bir şeyle (düzleştirme gibi) değiştirmek için tekrarlanan çözümlere izin verildiğinden yararlanamaz mısınız? Yoksa bir şey mi kaçırıyorum?

Sahip olduğum kod şimdi yaklaşık olarak eşit 7 bit tamsayıların bir listesini oluşturur 1*use digit 1 + 2*use digit 2 + 4*use digit 3 ... 64*use digit 7, sonra XOR @ ais523 onları azaltır. Düzleştirme, daha fazla karakter gerektiren basamakların bir listesi üzerinde çalışır.
fireflame241
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.