Chữ số có kích thước bao nhiêu?


13

Các chữ số 7 đoạn có thể được biểu diễn trong ASCII bằng các _|ký tự. Dưới đây là các 1chữ số kích thước :

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

Kích thước lớn hơn được hình thành bằng cách làm cho mỗi phân khúc dài hơn tương ứng. Dưới đây là một vài kích thước 3 chữ số.

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

Mục tiêu

Trong thử thách này, bạn phải viết một chương trình / hàm có thể lấy một chữ số làm đầu vào và xác định kích thước của nó. Bắt: nếu đầu vào không phải là một chữ số hợp lệ, thì chương trình của bạn sẽ xuất ra 0.

Đây là mã golf , ít byte nhất thắng.

Bạn có thể viết chương trình hoặc hàm, có thể nhận chữ số dưới dạng STDIN hoặc đối số và in / trả về giá trị.

Các chữ số sẽ được cung cấp dưới dạng một chuỗi nhiều dòng, được đệm với số lượng khoảng trắng nhỏ nhất cần thiết để biến nó thành một hình chữ nhật hoàn hảo. Dòng mới theo dõi là một phần tùy chọn của đầu vào. Sẽ không có không gian hàng đầu không cần thiết.

Khi một chữ số không được thông qua, nó vẫn sẽ bao gồm các _|ký tự, được đệm vào một hình chữ nhật và không có khoảng trắng ở đầu không cần thiết. Sẽ không có dòng trống. Bạn sẽ không phải đối phó với đầu vào trống.

Đầu ra phải là một số nguyên không âm duy nhất, với dòng mới tùy chọn. Nếu đầu vào không phải là một chữ số thích hợp của bất kỳ kích thước, đầu ra 0. Khác, đầu ra kích thước.

Dưới đây là một hướng dẫn hữu ích cho chiều rộng và chiều cao của mỗi chữ số cho một kích thước nhất định 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

Ví dụ I / O

Trong:

__ 
  |
__|
  |
__|

Ngoài:

2

Trong:

|
|
|

Ngoài:

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

Trong:

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

Ngoài:

4

Trong:

 ___ 
|    
|___ 
|   |
|___|

Ngoài:

0 //1 char too wide

Trong:

 _ 
|_|
| |

Ngoài:

0 //it's not a digit

Trong:

 __ 
|   
|__ 
   |
 __|

Ngoài:

2

Trong:

 _  _ 
 _| _|
|_  _|

Ngoài:

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

Trong:

 _ 
|_|
|_|

Ngoài:

1

Trong:

|
|

Ngoài:

1

Trong:

__|_
 |  
 _ |
  _ 
|__ 

Ngoài:

0

Đây là xấp xỉ nghịch đảo của số Transform thành mẫu hiển thị 7 đoạn , từ 3 năm trước.


@steveverrill Không thực sự có một 0chữ số kích thước , phải không? Trừ khi bạn nghĩ ra một cách để vẽ chúng.
PhiNotPi

8
Điều này sẽ cực kỳ dễ dàng nếu không phải theo quy tắc rằng nó phải là một chữ số hợp lệ ...
ETHproductions

@ETHproductions Tôi biết.
PhiNotPi

@ETHproductions nếu không có yêu cầu đó, nó sẽ là bản sao của codegolf.stackexchange.com/q/19548/15599
Level River St

Câu trả lời:


1

Hồng ngọc, 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}

Cho rằng có rất nhiều đầu vào không hợp lệ có thể, cách duy nhất để làm điều này là tạo ra tất cả các chữ số chính xác và kiểm tra xem liệu đầu vào có khớp hay không.

Tôi xây dựng từng chữ số từ dưới lên trên, trong 2 nửa cộng với dòng trên cùng. Mặc dù có 12 khả năng (xem xét rằng phân đoạn bên trái có thể bật, tắt hoặc trong trường hợp 37hoàn toàn vắng mặt) chỉ có 7 khả năng thực sự và sự lựa chọn mã hóa cẩn thận cho phép tất cả thông tin (ngoại trừ dòng trên cùng) được mã hóa thành một nhân vật duy nhất.

chữ số 1không thực sự phù hợp với mẫu và được xử lý riêng, được sử dụng để khởi tạo mảng.

Ungolfed trong chương trình thử nghiệm

Phiên bản này sử dụng .thay vì khoảng trắng vì lý do chẩn đoán.

#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[
"__.
..|
..|
..|
..|
"]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.