Berapa ukuran digitnya?

13

Digit 7-segmen dapat direpresentasikan dalam ASCII menggunakan _|karakter. Berikut adalah 1digit ukurannya :

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

Ukuran yang lebih besar dibentuk dengan membuat setiap segmen secara proporsional lebih panjang. Berikut adalah pasangan ukuran 3 digit.

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

Tujuan

Dalam tantangan ini, Anda harus menulis program / fungsi yang dapat mengambil satu digit sebagai input dan mengidentifikasi ukurannya. Tangkapan: jika input bukan angka yang valid, maka program Anda harus menampilkan 0.

Ini adalah kode-golf , byte paling sedikit menang.

Anda dapat menulis suatu program atau fungsi, yang dapat menerima angka sebagai STDIN atau argumen, dan mencetak / mengembalikan nilainya.

Digit akan disediakan sebagai string multi-garis, diisi dengan jumlah spasi spasi minimum yang diperlukan untuk menjadikannya persegi panjang yang sempurna. Baris baru yang tertinggal adalah bagian opsional dari input. Tidak akan ada ruang terkemuka yang tidak dibutuhkan.

Ketika non-digit dilewatkan, itu masih akan terdiri dari _|karakter, empuk ke persegi panjang, dan tidak memiliki ruang terkemuka yang tidak dibutuhkan. Tidak akan ada garis kosong. Anda tidak perlu berurusan dengan input kosong.

Output harus berupa bilangan bulat non-negatif, dengan baris tambahan opsional. Jika input bukan digit yang tepat dari ukuran apa pun, output 0. Lain, keluaran ukuran.

Berikut ini adalah panduan praktis untuk lebar dan tinggi setiap digit untuk ukuran tertentu 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

Contoh I / O

Di:

__ 
  |
__|
  |
__|

Di luar:

2

Di:

|
|
|

Di luar:

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

Di:

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

Di luar:

4

Di:

 ___ 
|    
|___ 
|   |
|___|

Di luar:

0 //1 char too wide

Di:

 _ 
|_|
| |

Di luar:

0 //it's not a digit

Di:

 __ 
|   
|__ 
   |
 __|

Di luar:

2

Di:

 _  _ 
 _| _|
|_  _|

Di luar:

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

Di:

 _ 
|_|
|_|

Di luar:

1

Di:

|
|

Di luar:

1

Di:

__|_
 |  
 _ |
  _ 
|__ 

Di luar:

0

Ini kira-kira kebalikan dari angka Transformasi menjadi pola tampilan 7-segmen , dari 3 tahun yang lalu.

PhiNotPi
sumber
@steveverrill Sebenarnya tidak ada yang namanya 0digit ukuran , bukan? Kecuali Anda sudah memikirkan cara untuk menggambar mereka.
PhiNotPi
8
Ini akan sangat mudah jika bukan karena aturan bahwa itu harus digit yang valid ...
ETHproduksi
@ ETHproductions Saya sadar.
PhiNotPi
@ ETHproductions jika tidak memiliki persyaratan itu, itu akan menjadi duplikat dari codegolf.stackexchange.com/q/19548/15599
Level River St

Jawaban:

1

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

Mengingat ada begitu banyak input yang mungkin tidak valid, satu-satunya cara untuk melakukan ini adalah dengan menghasilkan semua digit yang benar dan memeriksa untuk melihat apakah input tersebut cocok.

Saya membangun setiap digit dari atas ke bawah, dalam 2 bagian ditambah garis atas. Meskipun ada 12 kemungkinan (mengingat bahwa segmen kiri dapat hidup, mati, atau dalam kasus 3dan 7sama sekali tidak ada) hanya 7 yang benar-benar hadir dan pilihan pengkodean yang hati-hati memungkinkan semua info (kecuali baris paling atas) dikodekan ke dalam karakter tunggal.

digit 1tidak benar-benar cocok dengan pola dan ditangani secara terpisah, digunakan untuk menginisialisasi array.

Tidak digabungkan dalam program uji

Versi ini menggunakan .bukan spasi untuk alasan diagnostik.

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