Quelle est la taille du chiffre?

13

Les chiffres à 7 segments peuvent être représentés en ASCII à l'aide de _|caractères. Voici les 1chiffres de taille :

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

De plus grandes tailles sont formées en allongeant chaque segment proportionnellement. Voici un couple de taille 3 chiffres.

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

Objectif

Dans ce défi, vous devez écrire un programme / une fonction qui peut prendre un seul chiffre en entrée et identifier sa taille. Le hic: si l'entrée n'est pas un chiffre valide, alors votre programme devrait sortir 0.

C'est le code-golf , le moins d'octets gagne.

Vous pouvez écrire un programme ou une fonction, qui peut recevoir le chiffre sous forme de STDIN ou d'argument, et imprimer / renvoyer la valeur.

Les chiffres seront fournis sous la forme d'une chaîne de plusieurs lignes, rembourrée avec la quantité minimale d'espaces de fin nécessaires pour en faire un rectangle parfait. La nouvelle ligne de fin est une partie facultative de l'entrée. Il n'y aura pas d'espaces de tête inutiles.

Lorsqu'un caractère non numérique est transmis, il sera toujours composé de _|caractères, complété par un rectangle et ne comportera aucun espace de début inutile. Il n'y aura pas de lignes vides. Vous n'aurez pas à gérer une entrée vide.

La sortie doit être un seul entier non négatif, avec une nouvelle ligne de fin facultative. Si l'entrée n'est pas un chiffre correct de n'importe quelle taille, sortez 0. Sinon, affichez la taille.

Voici un guide pratique pour les largeurs et hauteurs de chaque chiffre pour une taille donné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

Exemples d'E / S

Dans:

__ 
  |
__|
  |
__|

En dehors:

2

Dans:

|
|
|

En dehors:

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

Dans:

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

En dehors:

4

Dans:

 ___ 
|    
|___ 
|   |
|___|

En dehors:

0 //1 char too wide

Dans:

 _ 
|_|
| |

En dehors:

0 //it's not a digit

Dans:

 __ 
|   
|__ 
   |
 __|

En dehors:

2

Dans:

 _  _ 
 _| _|
|_  _|

En dehors:

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

Dans:

 _ 
|_|
|_|

En dehors:

1

Dans:

|
|

En dehors:

1

Dans:

__|_
 |  
 _ |
  _ 
|__ 

En dehors:

0

Il s'agit approximativement de l' inverse du nombre de transformation en motif d'affichage à 7 segments , depuis 3 ans.

PhiNotPi
la source
@steveverrill Il n'y a pas vraiment de 0chiffre de taille , n'est-ce pas? Sauf si vous avez trouvé un moyen de les dessiner.
PhiNotPi
8
Ce serait incroyablement facile sans la règle selon laquelle il doit s'agir d'un chiffre valide ...
ETHproductions
@ETHproductions que je connais.
PhiNotPi
@ETHproductions s'il n'avait pas cette exigence, ce serait un doublon de codegolf.stackexchange.com/q/19548/15599
Level River St

Réponses:

1

Rubis, 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}

Étant donné qu'il y a tellement d'entrées invalides possibles, la seule façon de le faire était de générer tous les chiffres corrects et de vérifier si l'entrée correspond.

Je construis chaque chiffre de bas en haut, en 2 moitiés plus la ligne supérieure. Bien qu'il existe 12 possibilités (en considérant que le segment de gauche peut être activé, désactivé ou dans le cas 3et 7complètement absent), seules 7 sont réellement présentes et un choix judicieux de l'encodage permet à toutes les informations (sauf la ligne supérieure) d'être encodées en un caractère unique.

le chiffre 1ne correspond pas vraiment au modèle et est géré séparément, utilisé pour initialiser le tableau.

Non testé dans le programme de test

Cette version utilise . place des espaces pour des raisons de diagnostic.

#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
la source