Rakam ne büyüklüktedir?


13

7 segmentli rakamlar ASCII'de _|karakterler kullanılarak gösterilebilir . İşte boyut 1rakamları:

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

Her segment orantılı olarak daha uzun hale getirilerek daha büyük boyutlar oluşturulur. İşte bir çift boyut 3 basamak.

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

Hedef

Bu zorlukta, girdi olarak tek bir rakam alabilecek ve boyutunu tanımlayabilecek bir program / işlev yazmalısınız. Catch: giriş geçerli bir basamak değilse programınız çıktı almalıdır 0.

Bu kod golf , en az bayt kazanır.

Rakamı STDIN veya bağımsız değişken olarak alabilen bir program veya işlev yazabilir ve değeri yazdırabilir / döndürebilirsiniz.

Basamaklar, mükemmel bir dikdörtgen yapmak için gereken minimum miktarda boşlukla doldurulmuş çok satırlı bir dize olarak sağlanacaktır. Sondaki yeni satır, girdinin isteğe bağlı bir parçasıdır. Gereksiz lider alanlar olmayacak.

Rakam olmayan bir sayı geçtiğinde, yine de _|bir dikdörtgenle doldurulmuş ve gereksiz boşluk boşlukları olmayan karakterlerden oluşacaktır . Boş satır olmayacak. Boş girdiyle uğraşmanıza gerek kalmaz.

Çıktı, isteğe bağlı son satırsonu olan tek bir negatif olmayan tam sayı olmalıdır. Giriş herhangi bir boyutta uygun bir rakam değilse, çıktı alın 0. Başka, boyutu çıktı.

Burada, belirli bir boyut için her bir basamağın genişlikleri ve yükseklikleri için kullanışlı bir kılavuz 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

G / Ç Örnekleri

İçinde:

__ 
  |
__|
  |
__|

Dışarı:

2

İçinde:

|
|
|

Dışarı:

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

İçinde:

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

Dışarı:

4

İçinde:

 ___ 
|    
|___ 
|   |
|___|

Dışarı:

0 //1 char too wide

İçinde:

 _ 
|_|
| |

Dışarı:

0 //it's not a digit

İçinde:

 __ 
|   
|__ 
   |
 __|

Dışarı:

2

İçinde:

 _  _ 
 _| _|
|_  _|

Dışarı:

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

İçinde:

 _ 
|_|
|_|

Dışarı:

1

İçinde:

|
|

Dışarı:

1

İçinde:

__|_
 |  
 _ |
  _ 
|__ 

Dışarı:

0

Bu yaklaşık olarak ters bir 7 kademeli ekran örüntüsünün içine sayısı Transform geri 3 yıl.


@steveverrill Gerçekten bir 0rakam rakamı diye bir şey yok, değil mi? Onları çizmenin bir yolunu düşünmedikçe.
PhiNotPi

8
Geçerli bir basamak olması gerektiği kuralına olmasaydı bu inanılmaz derecede kolay olurdu ...
ETHproductions

@ETHproductions Biliyorum.
PhiNotPi

@ETHproductions bu şartı yoksa, codegolf.stackexchange.com/q/19548/15599
Level River St

Yanıtlar:


1

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

Çok fazla sayıda geçersiz giriş olduğu göz önüne alındığında, bunu yapmanın tek yolu tüm doğru rakamları oluşturmak ve girişin eşleşip eşleşmediğini kontrol etmektir.

Her rakamı aşağıdan yukarıya, 2 yarıya ve en üst satırda inşa ediyorum. 12 olasılık olmasına rağmen (sol kesimi kapalı, üzerinde olabileceğini göz önünde bulundurarak, ya durumunda 3ve 7a kodlanacak tamamen yok) sadece 7 aslında mevcut ve kodlama dikkatli seçim (üst satırda hariç) bütün bilgiyi sağlayan organlardır tek karakter.

basamak 1gerçekten desene uymuyor ve diziyi başlatmak için kullanılan ayrı olarak işleniyor.

Test programında yönlendirilmemiş

Bu sürüm, .tanılama amacıyla boşluk yerine kullanır .

#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[
"__.
..|
..|
..|
..|
"]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.