Какого размера цифра?


13

7-сегментные цифры могут быть представлены в ASCII с использованием _|символов. Вот 1цифры размера :

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

Большие размеры формируются путем пропорционального удлинения каждого сегмента. Вот пара размером 3 цифры.

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

Цель

В этой задаче вы должны написать программу / функцию, которая может принимать одну цифру в качестве ввода и определять ее размер. Подвох: если ввод не является действительной цифрой, то ваша программа должна вывести 0.

Это код-гольф , побеждает меньше байтов.

Вы можете написать либо программу, либо функцию, которая может получить цифру либо как STDIN, либо как аргумент, и вывести / вернуть значение.

Цифры будут представлены в виде многострочной строки, дополненной минимальным количеством пробелов, необходимых для создания идеального прямоугольника. Конечный символ новой строки является необязательной частью ввода. Не будет лишних пробелов.

Когда передается нецифровка, она все равно будет состоять из _|символов, дополненных прямоугольником, и не будет иметь лишних начальных пробелов. Там не будет пустых строк. Вам не придется иметь дело с пустым вводом.

Выходными данными должно быть одно неотрицательное целое число с необязательным завершающим переводом строки. Если ввод не является правильной цифрой любого размера, выведите 0. Иначе выведите размер.

Вот удобное руководство по ширине и высоте каждой цифры для данного размера 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

Примеры ввода / вывода

В:

__ 
  |
__|
  |
__|

Вне:

2

В:

|
|
|

Вне:

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

В:

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

Вне:

4

В:

 ___ 
|    
|___ 
|   |
|___|

Вне:

0 //1 char too wide

В:

 _ 
|_|
| |

Вне:

0 //it's not a digit

В:

 __ 
|   
|__ 
   |
 __|

Вне:

2

В:

 _  _ 
 _| _|
|_  _|

Вне:

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

В:

 _ 
|_|
|_|

Вне:

1

В:

|
|

Вне:

1

В:

__|_
 |  
 _ |
  _ 
|__ 

Вне:

0

Это примерно обратное из преобразования числа в 7-сегментный дисплей шаблона , от 3 -х лет назад.


@steveverrill На самом деле не существует такой вещи, как размер 0цифры, не так ли? Если вы не придумали способ их нарисовать.
PhiNotPi

8
Это было бы невероятно легко, если бы не правило, что это должна быть действительная цифра ...
ETHproductions

@ETHproductions я знаю.
PhiNotPi

@ETHproductions, если бы не было этого требования, это было бы дубликатом codegolf.stackexchange.com/q/19548/15599
Level River St

Ответы:


1

Рубин, 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}

Учитывая, что существует так много возможных недопустимых входных данных, единственный способ сделать это состоял в том, чтобы сгенерировать все правильные цифры и проверить, совпадают ли входные данные.

Я строю каждую цифру снизу вверх, в 2 половины плюс верхняя строка. Хотя существует 12 возможностей (учитывая, что левый сегмент может быть включен, выключен или в случае 3и7 полностью отсутствовать), только 7 фактически присутствуют, и тщательный выбор кодирования позволяет закодировать всю информацию (кроме верхней строки) в один символ

цифра 1не соответствует шаблону и обрабатывается отдельно, и используется для инициализации массива.

Неуправляемый в тестовой программе

Эта версия использует .вместо пробелов для диагностики.

#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[
"__.
..|
..|
..|
..|
"]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.