Licht aus, 7-Segment-Version

14

Suchen Sie bei einer 7-Segment-Anzeige mit einigen eingeschalteten und einigen ausgeschalteten Segmenten eine Ziffernfolge (0-9), sodass nach dem Umschalten der entsprechenden Segmente für jede Ziffer alle Segmente ausgeschaltet werden.

Beispiel

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

Zahlen und ihre entsprechenden Segmente:

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

Regeln

Codegolf ⊨ kürzester Einstieg gewinnt.

Eingang

Eine nicht leere Liste von Segmenten, die eingeschaltet sind, gegeben als

  1. Eine Folge von Zahlen. Die Segmente sind von oben nach unten von links nach rechts nummeriert. ab 0 oder 1. Zahlen müssen nicht in Ordnung sein.

  2. Eine einzelne 7-Bit-Ziffer. MSB / LSB nicht angegeben (somit können Sie wählen).

Nicht numerische Zeichen zwischen Zahlen sind zulässig (müssen jedoch nicht unterstützt werden).

Z.B. für Nummer 7: 136oder 1010010oder0100101

Ausgabe

Eine Folge von Zahlen, die auf die Anzeige "angewendet" werden sollen. Nicht in irgendeiner Weise eingeschränkt, wie die Reihenfolge der Ziffern. Z.B. für Ausgangszustand entspricht Zahl 1wäre gültig Ausgängen 1, 111, 010usw.

Eine alternative Ausgabe ist eine 10-Bit-Ziffer (wieder ist MSB / LSB Ihre Wahl). Z.B. für 1als Eingabe, würde der Ausgang sein 1000000000oder 0000000001.

Einige Kombinationen haben mehrere sich nicht wiederholende Lösungen, z. Segmente, die dem Großbuchstaben entsprechen, Hkönnen durch 013, aber auch 489und ausgeschaltet werden 0258.

Wenn es keine Lösung gibt (was meines Erachtens nicht möglich ist), ist die Ausgabe leer.

kyrill
quelle
2
Dies erfordert mehr Spezifikation. Welche Segmente sind in jeder Ziffer enthalten (enthält beispielsweise 9 das untere Segment?). Zeichnen Sie alle Ziffern und geben Sie die Nummern der Segmente an, die in jeder Ziffer enthalten sind.
Level River St
Welche Formate sind für die Eingabe zulässig? Werden die Segmentnummern der Reihe nach angegeben? Was machen wir, wenn es keine Lösung gibt?
Level River St
"Einige Kombinationen haben mehrere sich nicht wiederholende Lösungen" Auch jede Permutation einer Lösung ist eine andere Lösung, oder? (wie 301für H).
Arnauld
1
Der Beweis, dass es immer eine Lösung gibt: Es reicht aus, für jedes einzelne Segment eine Lösung zu finden. Lösungen für die horizontalen Segmente, von oben nach unten, sind 17, 08und 1479. Lösungen für die oberen vertikalen Segmente von links nach rechts sind 39und 59. Lösungen für die unteren vertikalen Segmente von links nach rechts sind 56und 2389.
Greg Martin
1
@GregMartin 2ist nicht immer notwendig, weil man es mit entweder ersetzen kann 0468, 1358oder 1369, je nachdem , ob Sie ein 0, 8oder 9in Ihrer Antwort, aber es gibt keine Möglichkeit zu beseitigen , 7überhaupt, und ich glaube , Sie mindestens einen haben , haben von 1und 3.
Neil

Antworten:

4

Jelly , 26 25 Bytes

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

Probieren Sie es online!

Übernimmt die Eingabe als 7-Bit-Ganzzahl. Gibt die Binärform einer 10-Bit-Ganzzahl zurück.

Dies zwingt einfach alle Möglichkeiten. Entfernen Sie das , um alle möglichen Ausgaben zu erhalten, oder ersetzen Sie es durch ein X, um eine zufällige mögliche Ausgabe zu erhalten.

Magic Visualisierungsprogramm!

Wie es funktioniert

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
quelle
1
Das Array of numbers ( “wØ][:koR¶z‘) enthält möglicherweise einen Fehler. Ihrer Nummer 9fehlt das untere Segment (vergleichen Sie 9in Ihrer Visualisierung mit dem in der Aufgabenbeschreibung). Ansonsten sehr schön, vor allem die Visualisierung!
kyrill
1
@ kyrill behoben! Nur eine geringfügige Änderung im Listenliteral erforderlich.
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)

Das funktioniert, weil:

  • Durch Umschalten von 1 und 7 wird nur das obere Segment umgeschaltet
  • Durch Umschalten von 1, 2 und 6 wird nur das obere linke Segment umgeschaltet
  • Durch Umschalten von 1, 2, 3, 5 und 6 wird nur das obere rechte Segment umgeschaltet
  • Durch Umschalten von 2, 4 und 6 wird nur das mittlere Segment umgeschaltet
  • Durch Umschalten von 5 und 6 wird nur das untere linke Segment umgeschaltet
  • Durch Umschalten von 2, 3, 5 und 6 wird nur das untere rechte Segment umgeschaltet
  • Durch Umschalten von 2, 3, 4, 6 und 7 wird nur das untere Segment umgeschaltet
Neil
quelle
1
Ich bin mir nicht sicher, ob dies als Gewinner akzeptiert werden sollte, weil Sie sich offensichtlich von Arnauld inspirieren ließen. Aber dann hat er sich auch von Ihrem Kommentar inspirieren lassen. Trotzdem, schöne Antwort, ihr beide!
kyrill
@kyrill Meine aktualisierte Antwort war auch ein Vorschlag von Neil. Es besteht kein Zweifel, dass seine Antwort bisher gewinnt.
Arnauld
2

JavaScript (ES6), 117 107 101 86 84 Byte

Dank Neil 15 Bytes gespart

Übernimmt die Eingabe als 7-Bit-Ganzzahl, wobei das LSB das obere Segment ist. Gibt eine 10-Bit-Ganzzahl zurück, bei der das LSB eine Ziffer ist 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
quelle
1
Rekursion ist kürzer: 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. Oder wenn Sie davon ausgehen , eine Antwort vorliegt, 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 Danke! Ja, es gibt immer eine Antwort.
Arnauld
1
Da es immer möglich ist, eine Antwort mit den Ziffern zu erstellen 1-7, können Sie weitere 8 Byte speichern, indem Sie das 83und das ,91,75und mit entfernen k+2.
Neil
2

Mathematica, 40 Bytes

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

(Sie können mehr Golf spielen, indem Sie die Ausgabe für jedes Segment sorgfältig auswählen und zwischen LSB und MSB wechseln.)

Nehmen Sie die Eingabe zum Beispiel als Liste von Positionen {2,4,5,7}und geben Sie eine 10-Bit-Zahl aus ( 384=0110000000 binär) in der MSB-Reihenfolge (0, ..., 9) aus.

Im Beispiel entspricht

  |_
  |_

und die Ausgabe entspricht {7,8} .

Erläuterung:

Die magischen Zahlen (fest codierte Liste) sind die Ausgabe, die für jedes Segment zurückgegeben wird. (binär codiert) Und wenn eine Zahl zweimal in der Liste erscheint, ist der Effekt der gleiche wie der, dass sie nicht angezeigt wird. Daher wird bitweises XOR verwendet. Wir müssen nur die Ausgabe des möglichen Wertes der eingeschalteten Segmente XOR.

user202729
quelle
2

Gelee , 12 Bytes

ị“A#7*06n‘^/

Probieren Sie es online!

Dies ist keine rohe Kraft, und es ist bemerkenswert kürzer als meine andere Lösung. Nimmt Eingaben als Liste aktivierter Segmente und Ausgaben als LSB als oberstes Segment.

Ausgabe als Liste der Ziffernbewegungen.

Wie es funktioniert

Das wird schnell gehen

ị“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
quelle
Können Sie nicht die Tatsache ausnutzen, dass sich wiederholende Lösungen bei Verwendung dieses Algorithmus zulässig sind, um die XOR-Reduzierung durch etwas Kürzeres (z. B. eine Abflachung) zu ersetzen? Oder vermisse ich etwas?
Der Code, wie ich ihn jetzt habe, erzeugt eine Liste von 7-Bit-Ganzzahlen, die ungefähr gleich sind 1*use digit 1 + 2*use digit 2 + 4*use digit 3 ... 64*use digit 7, dann reduziert XOR sie @ ais523. Das Reduzieren würde bei einer Liste von verwendeten Ziffern funktionieren, die mehr Zeichen benötigt.
Fireflame241