Wie groß ist die Ziffer?

13

7-Segment-Ziffern können in ASCII mit _|Zeichen dargestellt werden. Hier sind die Größenangaben 1:

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

Größere Größen werden gebildet, indem jedes Segment proportional länger gemacht wird. Hier sind ein paar 3-stellige Zahlen.

 ___    ___    ___    ___    ___    ___    ___ 
|   |  |          |  |          |  |   |  |   |
|   |  |          |  |          |  |   |  |   |
|___|  |___       |  |___    ___|  |   |  |___|
|   |  |   |      |      |      |  |   |      |
|   |  |   |      |      |      |  |   |      |
|___|  |___|      |   ___|   ___|  |___|   ___|

Tor

In dieser Herausforderung müssen Sie ein Programm / eine Funktion schreiben, die eine einzelne Ziffer als Eingabe verwenden und deren Größe identifizieren kann. Der Haken: Wenn die Eingabe keine gültige Ziffer ist, sollte Ihr Programm ausgeben 0.

Das ist Code-Golf , die wenigsten Bytes gewinnen.

Sie können entweder ein Programm oder eine Funktion schreiben, die die Ziffer entweder als STDIN oder als Argument empfängt, und den Wert drucken / zurückgeben.

Die Ziffern werden als mehrzeilige Zeichenfolge bereitgestellt, die mit dem Mindestmaß an abschließendem Leerzeichen aufgefüllt ist, das erforderlich ist, um ein perfektes Rechteck zu erstellen. Die nachfolgende Newline ist ein optionaler Teil der Eingabe. Es wird keine unnötigen führenden Leerzeichen geben.

Wenn eine Nicht-Ziffer übergeben wird, besteht sie weiterhin aus _|Zeichen, die zu einem Rechteck aufgefüllt sind und keine nicht benötigten führenden Leerzeichen enthalten. Es werden keine Leerzeilen angezeigt. Sie müssen sich nicht mit Leereingaben befassen.

Die Ausgabe sollte eine einzelne nicht negative Ganzzahl mit optionalem Zeilenumbruch sein. Wenn die Eingabe keine richtige Ziffer von beliebiger Größe ist, geben Sie sie aus 0. Anderenfalls geben Sie die Größe aus.

Hier finden Sie eine praktische Anleitung für die Breiten und Höhen der einzelnen Ziffern für eine bestimmte Größe N.

Digit  Height  Width (not counting newlines)
1      2N      1
2      2N+1    N+2
3      2N+1    N+1
4      2N      N+2
5      2N+1    N+2
6      2N+1    N+2
7      2N+1    N+1
8      2N+1    N+2
9      2N+1    N+2
0      2N+1    N+2

E / A-Beispiele

Im:

__ 
  |
__|
  |
__|

Aus:

2

Im:

|
|
|

Aus:

0  //because it is of an invalid height.  Either 1 char too short or tall.

Im:

|    |
|    |
|    |
|____|
     |
     |
     |
     |

Aus:

4

Im:

 ___ 
|    
|___ 
|   |
|___|

Aus:

0 //1 char too wide

Im:

 _ 
|_|
| |

Aus:

0 //it's not a digit

Im:

 __ 
|   
|__ 
   |
 __|

Aus:

2

Im:

 _  _ 
 _| _|
|_  _|

Aus:

0  //both would be valid individually, but input should be a *single* digit

Im:

 _ 
|_|
|_|

Aus:

1

Im:

|
|

Aus:

1

Im:

__|_
 |  
 _ |
  _ 
|__ 

Aus:

0

Dies ist ungefähr die Umkehrung der Transformationszahl in ein 7-Segment-Anzeigemuster seit 3 ​​Jahren.

PhiNotPi
quelle
@steveverrill Es gibt nicht wirklich so etwas wie eine Größenangabe 0, oder? Es sei denn, Sie haben sich eine Möglichkeit ausgedacht, sie zu zeichnen.
PhiNotPi
8
Dies wäre unglaublich einfach, wenn nicht die Regel bestünde, dass es sich um eine gültige Ziffer handeln muss ...
ETHproductions
@ETHproductions Mir ist bewusst.
PhiNotPi
@ETHproductions Wenn es diese Anforderung nicht hätte, wäre es ein Duplikat von codegolf.stackexchange.com/q/19548/15599
Level River St

Antworten:

1

Rubin, 250

->x{d=y=0
x.size.downto(0){|n|y=n
a=["|
"*2*n]
"XNRDqpm@A".bytes{|z|p=[?|,' ','']
h=s=""
(n*2).times{|i|
i%n<1&&(d=z>>i/n*3&7)&&h=[?_,' '][d/3%2]*n
s=p[d%3]+h+p[d/6]+"
"+s
h=' '*n}
z!=68&&s=' '*(1-d%3/2)+?_*n+" 
"+s
a<<s};puts a
a.index(x)&&break}
y}

Angesichts der Tatsache, dass es so viele mögliche ungültige Eingaben gibt, bestand die einzige Möglichkeit darin, alle richtigen Ziffern zu generieren und zu überprüfen, ob die Eingabe übereinstimmt.

Ich baue jede Ziffer von unten nach oben auf, in 2 Hälften plus der oberen Zeile. Obwohl es 12 Möglichkeiten gibt (wenn man bedenkt, dass das linke Segment an, aus oder im Falle von 3und 7völlig abwesend sein kann), sind tatsächlich nur 7 vorhanden, und die sorgfältige Auswahl der Codierung ermöglicht, dass alle Informationen (außer der obersten Zeile) in a codiert werden einzelnes Zeichen.

Die Ziffer 1passt nicht wirklich zum Muster und wird separat behandelt, um das Array zu initialisieren.

Ungolfed im Testprogramm

Diese Version verwendet .aus diagnostischen Gründen anstelle von Leerzeichen.

#Encoding used for half-digits (radix 3,2,2 most significant digit at right)

#000    |_|  0

#100    ._|  1  . = space

#200    X_|  2  X = no space (for digits 3 and 7)  

#010    |.|  3

#110    ..|  4

#210    X.|  5

#001    |_.  6


f=->x{d=y=0                                        #d and y required to be intialized for scoping reasons
  x.size.downto(0){|n|y=n                          #Assume max possible size of character = length of input and iterate down through all possible sizes n   
    a=["|\n"*2*n]                                  #Make an array containing the digit 1 (different shape to others)
    "XNRDqpm@A".bytes{|z|                          #Each character encodes the pattern for a digit. Iterate through them
      p=['|','.','']                               #Possible components for left and right of digit
      h=s=""                                       #h initialized for scoping reasons. s will contain the digit string 
      (n*2).times{|i|                              #For each row
        i%n<1&&                                    #If i%n==1 we are at the bottom of a half digit
        (d=z>>i/n*3&7)&&                           #so extract info from z and store in d
        h=[?_,'.'][d/3%2]*n                        #h is the horizontal part of the half digit, either _ or spaces 
        s=p[d%3]+h+p[d/6]+"\n"+s                   #Build one row of digit, working upwards: left,middle,right
        h='.'*n                                    #If row i%n!=0 (not bottom row of half digit)the middle section must contain spaces
      }                                            #We now have both halves of the digit, only the top segment missing 
      z!=68&&s='.'*(1-d%3/2)+?_*n+".\n"+s          #If z!=68 (digit 4) add a top to the digit, with appropriate leading and trailing spaces        
      a<<s                                         #Add the completed digit of size n to a
    }
    #puts a                                        #Diagnostic: uncomment to print all the strings checked
    a.index(x)&&break                              #If string x is in a, break

  }
y                                                  #and return last value of n 
}


# digit 7, size 2. Trailing newline required. Outputs 2
puts f[
"__.
..|
..|
..|
..|
"]
Level River St
quelle