숫자의 크기는 얼마입니까?


13

7 세그먼트 숫자는 _|문자를 사용하여 ASCII로 표시 할 수 있습니다 . 크기는 다음과 같습니다 1.

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

각 세그먼트를 비례 적으로 길게 만들어서 더 큰 크기가 형성됩니다. 여기 몇 크기 3 자리가 있습니다.

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

이 과제에서는 한 자릿수를 입력으로 사용하여 크기를 식별 할 수있는 프로그램 / 기능을 작성해야합니다. 캐치 : 입력이 유효한 숫자가 아닌 경우 프로그램이 출력해야합니다 0.

이것은 code-golf 이며 가장 적은 바이트 수입니다.

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

I / O 예

에:

__ 
  |
__|
  |
__|

밖:

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

이것은 3 년 전의 Transform 수와 7- 세그먼트 디스플레이 패턴역수 입니다 .


@steveverrill 실제로 크기 0숫자 와 같은 것은 존재하지 않습니까? 당신이 그들을 그리는 방법을 생각하지 않는 한.
PhiNotPi

8
이것은 유효한 숫자 여야한다는 규칙이 아니라면 매우 쉬울 것입니다.
ETHproductions

@ETHproductions 알고 있습니다.
PhiNotPi

답변:


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}

유효하지 않은 입력이 너무 많기 때문에이를 수행하는 유일한 방법은 올바른 숫자를 모두 생성하고 입력이 일치하는지 확인하는 것입니다.

각 자리를 아래에서 위로 반으로 나누고 두 줄 반을 더한 것입니다. 12 가능성이 있지만 (왼쪽 세그먼트 오프에 될 수 있음을 고려, 또는의 경우 37로 인코딩 할 수 완전히 결석)은 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[
"__.
..|
..|
..|
..|
"]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.