Jaki rozmiar ma cyfra?

13

7-segmentowe cyfry mogą być reprezentowane w ASCII za pomocą _|znaków. Oto 1cyfry wielkości :

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

Większe rozmiary powstają przez proporcjonalne wydłużenie każdego segmentu. Oto kilka cyfr wielkości 3.

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

Cel

W tym wyzwaniu masz napisać program / funkcję, która może przyjąć jedną cyfrę jako dane wejściowe i określić jej rozmiar. Haczyk: jeśli dane wejściowe nie są prawidłową cyfrą, Twój program powinien wypisać dane 0.

To jest golf golfowy , wygrywa najmniej bajtów.

Możesz napisać program lub funkcję, która może odbierać cyfrę jako STDIN lub argument i wypisywać / zwracać wartość.

Cyfry będą dostarczane jako ciąg wieloliniowy, wypełniony minimalną ilością spacji końcowej potrzebnej do utworzenia idealnego prostokąta. Końcowy znak nowej linii jest opcjonalną częścią wprowadzania. Nie będzie niepotrzebnych wiodących pól.

Gdy zostanie przekazany znak inny niż cyfra, nadal będzie się składał ze _|znaków, będzie wypełniony prostokątem i nie będzie zawierał niepotrzebnych spacji wiodących. Nie będzie pustych linii. Nie będziesz musiał radzić sobie z pustymi danymi wejściowymi.

Wyjście powinno być pojedynczą nieujemną liczbą całkowitą, z opcjonalnym końcowym znakiem nowej linii. Jeśli wejście nie jest poprawną cyfrą o dowolnym rozmiarze, wyjdź 0. W przeciwnym razie wypisz rozmiar.

Oto przydatny przewodnik po szerokościach i wysokościach każdej cyfry dla danego rozmiaru 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

Przykłady we / wy

W:

__ 
  |
__|
  |
__|

Na zewnątrz:

2

W:

|
|
|

Na zewnątrz:

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

W:

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

Na zewnątrz:

4

W:

 ___ 
|    
|___ 
|   |
|___|

Na zewnątrz:

0 //1 char too wide

W:

 _ 
|_|
| |

Na zewnątrz:

0 //it's not a digit

W:

 __ 
|   
|__ 
   |
 __|

Na zewnątrz:

2

W:

 _  _ 
 _| _|
|_  _|

Na zewnątrz:

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

W:

 _ 
|_|
|_|

Na zewnątrz:

1

W:

|
|

Na zewnątrz:

1

W:

__|_
 |  
 _ |
  _ 
|__ 

Na zewnątrz:

0

Jest to w przybliżeniu odwrotność liczby przekształceń w 7-segmentowy wzór wyświetlania sprzed 3 lat.

PhiNotPi
źródło
@steveverrill Nie ma czegoś takiego jak 0cyfra wielkości , prawda? Chyba że wymyśliłeś sposób na ich narysowanie.
PhiNotPi
8
Byłoby to niezwykle łatwe, gdyby nie zasada, że ​​musi to być poprawna cyfra ...
ETHproductions
@ETHproductions Jestem świadomy.
PhiNotPi
@ETHproductions, gdyby nie spełniał tego wymogu, byłby duplikatem codegolf.stackexchange.com/q/19548/15599
Level River St

Odpowiedzi:

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}

Biorąc pod uwagę, że istnieje wiele możliwych nieprawidłowych danych wejściowych, jedynym sposobem na to było wygenerowanie wszystkich poprawnych cyfr i sprawdzenie, czy dane wejściowe są zgodne.

Każdą cyfrę buduję od dołu do góry, w 2 połówkach i górnej linii. Chociaż istnieje 12 możliwości (biorąc pod uwagę, że lewy segment może być włączony, wyłączony lub w przypadku 3i 7całkowicie nieobecny), tylko 7 jest obecnych, a ostrożny wybór kodowania umożliwia zakodowanie wszystkich informacji (z wyjątkiem górnej linii) w pojedynczy znak.

cyfra 1tak naprawdę nie pasuje do wzoru i jest obsługiwana osobno, służąc do inicjalizacji tablicy.

Niegolfowany w programie testowym

Ta wersja używa .zamiast spacji ze względów diagnostycznych.

#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
źródło