¿De qué tamaño es el dígito?

13

Los dígitos de 7 segmentos se pueden representar en ASCII utilizando _|caracteres. Aquí están los 1dígitos del tamaño :

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

Los tamaños más grandes se forman al hacer que cada segmento sea proporcionalmente más largo. Aquí hay un par de 3 dígitos.

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

Objetivo

En este desafío, debe escribir un programa / función que pueda tomar un solo dígito como entrada e identificar su tamaño. El problema: si la entrada no es un dígito válido, entonces su programa debería generar 0.

Este es el código de golf , gana menos bytes.

Puede escribir un programa o una función, que puede recibir el dígito como STDIN o un argumento, e imprimir / devolver el valor.

Los dígitos se proporcionarán como una cadena de varias líneas, rellenada con la mínima cantidad de espacio en blanco al final necesario para que sea un rectángulo perfecto. La nueva línea final es una parte opcional de la entrada. No habrá espacios iniciales innecesarios.

Cuando se pasa un no dígito, todavía estará compuesto de _|caracteres, rellenado con un rectángulo y no tendrá espacios iniciales innecesarios. No habrá líneas en blanco. No tendrá que lidiar con entradas vacías.

La salida debe ser un número entero no negativo, con nueva línea final opcional. Si la entrada no es un dígito apropiado de ningún tamaño, salida 0. De lo contrario, salida del tamaño.

Aquí hay una guía práctica para los anchos y alturas de cada dígito para un tamaño dado 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

Ejemplos de E / S

En:

__ 
  |
__|
  |
__|

Fuera:

2

En:

|
|
|

Fuera:

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

En:

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

Fuera:

4

En:

 ___ 
|    
|___ 
|   |
|___|

Fuera:

0 //1 char too wide

En:

 _ 
|_|
| |

Fuera:

0 //it's not a digit

En:

 __ 
|   
|__ 
   |
 __|

Fuera:

2

En:

 _  _ 
 _| _|
|_  _|

Fuera:

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

En:

 _ 
|_|
|_|

Fuera:

1

En:

|
|

Fuera:

1

En:

__|_
 |  
 _ |
  _ 
|__ 

Fuera:

0

Esto es aproximadamente el inverso del número de transformación en un patrón de visualización de 7 segmentos , desde hace 3 años.

PhiNotPi
fuente
@steveverrill No existe realmente un 0dígito de tamaño , ¿ verdad ? A menos que haya ideado una forma de dibujarlos.
PhiNotPi
8
Esto sería increíblemente fácil si no fuera por la regla de que debe ser un dígito válido ...
ETHproductions
@ETHproductions Soy consciente.
PhiNotPi
@ETHproductions si no tuviera ese requisito, sería un duplicado de codegolf.stackexchange.com/q/19548/15599
Level River St el

Respuestas:

1

Rubí, 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}

Dado que hay tantas entradas inválidas posibles, la única forma de hacerlo era generar todos los dígitos correctos y verificar si las entradas coinciden.

Construyo cada dígito de abajo hacia arriba, en 2 mitades más la línea superior. Aunque hay 12 posibilidades (teniendo en cuenta que el segmento izquierdo puede ser encendido, apagado, o en el caso de 3y 7completamente ausente) solamente 7 son en realidad presente y la elección cuidadosa de codificación permite toda la información (excepto la línea superior) a ser codificada en una solo personaje

el dígito 1realmente no se ajusta al patrón y se maneja por separado, se usa para inicializar la matriz.

Sin golf en el programa de prueba

Esta versión utiliza en .lugar de espacios por razones de diagnóstico.

#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
fuente