Wyłączony, wersja 7-segmentowa

14

Biorąc pod uwagę 7-segmentowy wyświetlacz z niektórymi segmentami włączonymi, a niektórymi wyłączonymi, znajdź sekwencję cyfr (0-9), tak że po przełączeniu odpowiednich segmentów dla każdej cyfry wszystkie segmenty zostaną wyłączone.

Przykład

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

Liczby i odpowiadające im segmenty:

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

Zasady

Codegolf ⊨ wygrywa najkrótszy wpis.

Wejście

Niepusta lista segmentów, które są włączone, podana jako

  1. Sekwencja liczb. Segmenty są ponumerowane od góry do dołu, od lewej do prawej; zaczynając od 0 lub 1. Liczby nie muszą być uporządkowane.

  2. Pojedyncza 7-bitowa cyfra. MSB / LSB nie określono (dlatego możesz wybrać).

Znaki nieliczbowe między liczbami są dozwolone (ale nie muszą być obsługiwane).

Na przykład. dla numeru 7: 136lub 1010010lub0100101

Wynik

Sekwencja liczb do „zastosowania” na wyświetlaczu. Nie podlega żadnym ograniczeniom, takim jak kolejność cyfr. Na przykład. w stan początkowy odpowiadające liczbie 1, ważne wyjścia będzie 1, 111, 010itp

Alternatywnym wyjściem jest 10-bitowa cyfra (ponownie, MSB / LSB jest twoim wyborem). Na przykład. dla 1jako danych wejściowych wyjściem byłoby 1000000000lub 0000000001.

Niektóre kombinacje mają kilka niepowtarzalnych rozwiązań, np. segmenty odpowiadające dużej literze Hmożna wyłączyć 013, ale także 489i 0258.

Jeśli nie ma rozwiązania (które moim zdaniem nie jest możliwe), dane wyjściowe są puste.

kyrill
źródło
2
Wymaga to większej specyfikacji. Które segmenty są zawarte w każdej cyfrze (na przykład, czy 9 ​​zawiera dolny segment?) Proszę narysować wszystkie cyfry i wskazać numery segmentów zawartych w każdej z nich.
Level River St
Jakie formaty są dozwolone do wprowadzania? Czy numery segmentów zostaną podane w kolejności? Co robimy, jeśli nie ma rozwiązania?
Level River St
„Niektóre kombinacje mają kilka nie powtarzających się rozwiązań”. Również permutacja rozwiązania jest innym rozwiązaniem, prawda? (jak 301dla H).
Arnauld
1
Dowód, że rozwiązanie zawsze istnieje: wystarczy znaleźć rozwiązania dla każdego segmentu. Rozwiązania dla segmentów poziomych, od góry do dołu, są 17, 08i 1479. Rozwiązania dla górnych segmentów pionowych, od lewej do prawej, to 39i 59. Rozwiązania dla dolnych segmentów pionowych, od lewej do prawej, to 56i 2389.
Greg Martin
1
@GregMartin 2nie zawsze jest konieczne, ponieważ możesz go zastąpić albo 0468, 1358albo 1369, w zależności od tego, czy chcesz 0, 8lub 9w swojej odpowiedzi, ale nie ma możliwości całkowitego wyeliminowania 7i myślę, że musisz mieć co najmniej jeden z 1i 3.
Neil

Odpowiedzi:

4

Galaretka , 26 25 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako 7-bitową liczbę całkowitą. Zwraca binarną postać 10-bitowej liczby całkowitej.

To brutalne zmusza wszystkie możliwości. Usuń, aby uzyskać wszystkie możliwe dane wyjściowe, lub zastąp je, Xaby uzyskać losową możliwą wartość wyjściową.

Program magicznej wizualizacji!

Jak to działa

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
źródło
1
Tablica liczb ( “wØ][:koR¶z‘) może zawierać błąd. W twoim numerze 9brakuje dolnego segmentu (porównaj 9w wizualizacji z tym w opisie zadania). W przeciwnym razie bardzo ładne, szczególnie wizualizacja!
kyrill
1
@kyrill Naprawiono! Wymagała tylko niewielkiej zmiany literału listy.
fireflame241
2

JavaScript (ES6), 60 bajtów

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

Działa to, ponieważ:

  • Przełączanie 1 i 7 przełącza tylko górny segment
  • Przełączanie 1, 2 i 6 przełącza tylko lewy górny segment
  • Przełączanie 1, 2, 3, 5 i 6 przełącza tylko prawy górny segment
  • Przełączanie 2, 4 i 6 przełącza tylko środkowy segment
  • Przełączanie 5 i 6 przełącza tylko lewy dolny segment
  • Przełączanie 2, 3, 5 i 6 przełącza tylko prawy dolny segment
  • Przełączanie 2, 3, 4, 6 i 7 przełącza tylko dolny segment
Neil
źródło
1
Nie jestem pewien, czy należy to uznać za zwycięzcę, ponieważ oczywiście czerpałeś inspirację od Arnaulda. Ale potem czerpał inspirację z twojego komentarza. W każdym razie, ładna odpowiedź, oboje!
kyrill
@kyrill Moja zaktualizowana odpowiedź była również sugestią Neila. Nie ma wątpliwości, że jego odpowiedź jak dotąd wygrywa.
Arnauld
2

JavaScript (ES6), 117 107 101 86 84 bajtów

Zaoszczędzono 15 bajtów dzięki Neilowi

Pobiera dane wejściowe jako 7-bitową liczbę całkowitą, gdzie LSB jest górnym segmentem. Zwraca 10-bitową liczbę całkowitą, w której LSB jest cyfrą 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

Próbny

Arnauld
źródło
1
Rekurencja jest krótszy: 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. Lub jeśli zakładamy odpowiedź istnieje 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 Thanks! Tak, odpowiedź zawsze istnieje.
Arnauld
1
Ponieważ zawsze można utworzyć odpowiedź za pomocą cyfr 1-7, możesz zapisać kolejne 8 bajtów, usuwając znaki 83i ,91,75i k+2.
Neil
2

Mathematica, 40 bajtów

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

(Można bardziej grać w golfa, wybierając ostrożnie dane wyjściowe dla każdego segmentu i przełączając między LSB i MSB.)

Weźmy na przykład dane wejściowe jako listę pozycji {2,4,5,7}i wyprowadzamy 10-bitową liczbę ( 384= 0110000000binarnie) w kolejności MSB (0, ..., 9).

W tym przykładzie odpowiada

  |_
  |_

a dane wyjściowe odpowiadają {7,8}.

Wyjaśnienie:

Liczby magiczne (lista zakodowana na stałe) to dane wyjściowe zwracane dla każdego segmentu. (zakodowany w formacie binarnym) A jeśli liczba pojawi się na liście dwa razy, efekt jest taki sam, że nie pojawia się, więc używany jest bitowy XOR. Musimy tylko XOR wyprowadzić możliwą wartość włączonych segmentów.

użytkownik202729
źródło
2

Galaretka , 12 bajtów

ị“A#7*06n‘^/

Wypróbuj online!

To nie jest brutalna siła i jest znacznie krótsza niż moje inne rozwiązanie. Pobiera dane wejściowe jako listę włączonych segmentów i wysyła dane, ponieważ LSB jest segmentem górnym.

Wyjście jako lista ruchów cyfr.

Jak to działa

To będzie szybkie

ị“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
źródło
Czy nie możesz skorzystać z faktu, że podczas używania tego algorytmu dozwolone są powtarzalne rozwiązania, aby zastąpić redukcję XOR czymś krótszym (np. Spłaszczeniem)? A może coś mi brakuje?
Kod, jaki mam, generuje teraz listę 7-bitowych liczb całkowitych w przybliżeniu równych 1*use digit 1 + 2*use digit 2 + 4*use digit 3 ... 64*use digit 7, a następnie XOR zmniejsza je @ ais523. Spłaszczanie działałoby na liście użytych cyfr, które wymagają więcej znaków.
fireflame241