Renderuj numery w „cyfrowym stylu zegara”

28

Napisz najkrótszy program, który weźmie ciąg liczb (o długości co najmniej 20) jako dane wejściowe i wyświetli dane wyjściowe przy użyciu standardowych liczb w stylu zegara cyfrowego. Na przykład dla danych wejściowych 81 rozwiązanie z wyjściem ascii dałoby:

 _
|_|  |
|_|  |

Wyjściowa grafika jest również akceptowalna, jeśli pomaga.

mootinator
źródło
jakiś górny limit „weź ciąg liczb jako dane wejściowe”?
Aman ZeeK Verma
Hmm, powiedzmy, że jeden wiersz na 80-kolumnowym ekranie (20) jest wystarczająco dobry .
mootinator

Odpowiedzi:

6

APL (Dyalog) (45)

{3 3⍴' _|'[1+⍵⊤⍨9⍴3]}¨⎕UCS'ા8धगɯે૙ࣃଏ૽'[1+⍎¨⍞]

Ciąg ા8धगɯે૙ࣃଏ૽,, są znakami Unicode 2750 56 2343 2327 623 2759 2777 2243 2831 2813(jednak powinieneś być w stanie po prostu skopiować i wkleić). Kodują liczby. Program odczytuje wiersz z klawiatury.

Wyjaśnienie:

  • 1+⍎¨⍞: odczytaj wiersz z klawiatury, przeanalizuj każdy znak jako cyfrę, a następnie dodaj 1 do każdej liczby (tablice APL są domyślnie oparte na 1).
  • ⎕UCS'ા8धगɯે૙ࣃଏ૽'[... ]: Wybierz znaki należące do cyfr wprowadzonych cyfr i wyszukaj wartości Unicode.
  • {... : dla każdej z tych wartości:
  • 1+⍵⊤⍨9⍴3: pobierz pierwsze 9 cyfr podstawy 3 z wartości wyrażonej w podstawie 3 i dodaj 1 (ponieważ tablice są oparte na ar 1).
  • ' _|'[... ]: wybierz spację, linię poziomą lub linię pionową w zależności od tych cyfr
  • 3 3⍴: formatuj jako pole 3 na 3.
marinus
źródło
36

Funciton

Nie jest to język odpowiedni do gry w golfa ... ale niezależnie od tego starałem się zachować możliwie najmniejszy rozmiar kodu - zupełnie inne wyzwanie niż w „zwykłych” językach. Jest to 1555 znaków lub 3110 bajtów (jeśli kodowane są jako UTF-16; UTF-8 jest większy).

Oto zrzut ekranu z uruchomionego programu. To naprawdę działa :)

Ponieważ wygląda to brzydko w StackExchange ze względu na dodatkowe odstępy między wierszami, rozważ uruchomienie następującego kodu w konsoli JavaScript przeglądarki, aby to naprawić: $('pre').css('line-height',1)

     ╓─╖ ╔╗┌─╖   ┌─╖
     ║ʜ║ ║╟┤↔╟┐ ┌┤‼╟┐
     ╙┬╜ ╚╝╘═╝│ │╘╤╝│
╔═╗  ┌┴────┐  │┌┴╖ ┌┴╖
║0║ ┌┴─┐  ┌┴─┐└┤ʜ╟─┤·╟┐
╚╤╝┌┴╖┌┴╖┌┴╖┌┴╖╘╤╝ ╘╤╝│
┌┘┌┤·╟┤ɦ╟┤·╟┤?╟ │  ┌┴╖│
│ │╘╤╝╘╤╝╘╤╝╘╤╝ └──┤‼╟┘
│┌┴╖│ ┌┴╖┌┘╔═╧╗    ╘═╝
└┤?╟┘┌┤?╟┘┌╢10║    ┌─────────┐
 ╘╤╝ │╘╤╝┌┘╚══╝ ┌─┬┘╔══╗┌──╖┌┴╖ ╓─╖
  ┘  └───┘╔════╗│┌┴┐║21╟┤>>╟┤·╟┐║ɦ║
╔════════╗║1005╟┘└┬┘╚══╝╘═╤╝╘╤╝│╙┬╜        ┌─┐
║14073768║╚════╝ ┌┴╖ ┌─╖ ┌┴╖┌┴╖└─┴─────────┘┌┴╖
║7584800 ╟───────┤?╟─┤‼╟─┤ʜ╟┤·╟─────────────┤·╟┐╔═══════╗╔══╗
╚════════╝       ╘╤╝ ╘╤╝ ╘╤╝╘╤╝    ╔══╗┌─╖┌┐╘╤╝│║2097151║║21╟┐
 ╔═══════════════╗│   ┘   │  │     ║48╟┤−╟┤├─┤┌┘╚══╤════╝╚══╝│
 ║140737555464224╟┘  ┌────┘┌┬┘     ╚══╝╘╤╝└┘┌┘│╓─╖ │┌┐┌─╖┌─╖┌┴─╖
 ╚═══════════════╝   │ ┌───┘└─────────┐┌┴─╖ │┌┘║↔║ ├┤├┤‼╟┤↔╟┤>>║
┌────────────┐┌────┐┌┴╖│┌────────────┐├┤<<║ ││ ╙┬╜┌┘└┘╘╤╝╘═╝╘╤═╝
│   ╔══╗╔═══╗├┘╓─╖ └┤·╟┘│   ╔══╗╔═══╗├┘╘╤═╝ │└─┐└─┤╔═╗┌┴╖ ┌──┘
│   ║95║║892║│┌╢‡╟┐ ╘╤╝ │   ║95║║877║│ ┌┘╔══╧═╗│  │║0╟┤?╟┬┘
│   ╚═╤╝╚═╤═╝││╙─╜│  │  │   ╚═╤╝╚═╤═╝│╔╧╗║2097║│  │╚═╝╘╤╝│
│╔══╗┌┴╖┌┐│  ││┌─╖│ ┌┴╖ │╔══╗┌┴╖┌┐│  │║1║║151 ║│  └──────┘
│║32╟┤?╟┤├┤  │└┤‼╟┘┌┤‡║ │║32╟┤?╟┤├┤  │╚═╝╚════╝│
│╚══╝╘╤╝└┘└──┴┐╘╤╝ │╘╤╝ │╚╤═╝╘╤╝└┘└──┴┐      ┌─┘
│    ┌┴╖     ┌┴╖┌─╖│ │ ┌┴╖│  ┌┴╖     ┌┴╖ ┌─╖┌┴╖
│    │‼╟─────┤·╟┤‼╟┘ │┌┤·╟┘  │‼╟─────┤·╟─┤‼╟┤‡║
└┐┌┐ ╘╤╝     ╘╤╝╘╤╝  ││╘╤╝┌┐ ╘╤╝     ╘╤╝ ╘╤╝╘╤╝
 ├┤├┐┌┴╖╔══╗  └──┐┌┐ │└┐├─┤├┐┌┴╖╔══╗  ├──┐└  │
 │└┘└┤?╟╢32║╔═══╗├┤│┌┴╖││ └┘└┤?╟╢32║╔═╧═╗│┌┐┌┴╖╔══╗
╔╧══╗╘╤╝╚══╝║881╟┘│├┤?╟┘│    ╘╤╝╚══╝║325║└┤├┤?╟╢32║
║927║╔╧══╗  ╚═══╝ └┘╘╤╝╔╧═══╗╔╧══╗  ╚═══╝ └┘╘╤╝╚══╝
╚═══╝║124╟───────────┘ ║1019║║124╟───────────┘
     ╚═══╝             ╚════╝╚═══╝

Prawdopodobnie mógłby być mniejszy, gdybym nie popełnił błędu, z powodu którego wyjście było z powrotem do przodu; Naprawiłem to, dodając dodatkową funkcję do odwrócenia wejścia. W przeciwnym razie prawdopodobnie musiałbym przerobić to wszystko.

Popełniłem także kolejny błąd (zamiana operandów w dwóch wywołaniach do ), co spowodowało, że konieczne było zadeklarowanie dodatkowej funkcji, ale ta jest tak mała, że ​​mieści się w głównej funkcji i dlatego nie dodaje żadnych znaków!

Timwi
źródło
8
Whoa, to wygląda świetnie. Nie tylko rozwiązanie, ale i język :-)
Joey,
1
To jest po prostu niesamowite
Knerd
9

wxpython, wiele znaków

import wx, wx.gizmos as g

class T(wx.Frame):
 def __init__(_):
  wx.Frame.__init__(_, None, size = (800, 60))
  l = g.LEDNumberCtrl(_, -1)
  l.Value = raw_input()

class M(wx.App):
 def OnInit(_):
  T().Show()
  return 1

M().MainLoop()

Test

echo -n 81 | python codegolf-997-wx.py

wprowadź opis zdjęcia tutaj

ps: nie jest to poważny wpis, ale wygląda na to, że wyjście graficzne jest również dopuszczalne, więc po prostu spróbowałem :-)

TY
źródło
+1 Cieszę się, że to widzę :).
mootinator
1
O wiele za dużo z was. : P
Ty
8

Golfscript - 66 znaków

"placeholder text for userscript which counts chars             ";

xxd: (użyj, xxd -raby przywrócić)

0000000: 332c 7b3a 533b 2e7b 3438 2d22 5e70 285d  3,{:S;.{48-"^p(]
0000010: 7025 d3c4 4ab1 7d4a b8dc 4469 ce41 2222  p%..J.}J..Di.A""
0000020: f303 227b 6261 7365 7d2f 3330 2f53 3d33  .."{base}/30/S=3
0000030: 2f3d 7b22 5f20 7c22 3d7d 257d 256e 407d  /={"_ |"=}%}%n@}
0000040: 2f3b                                     /;

Wynika to z większości innych odpowiedzi, ponieważ nie ma spacji między liczbami, a końcowe spacje są zachowywane. Spację między liczbami można łatwo dodać 1+wcześniej {"_ |"=}%. Pakowany w podstawową liczbę 3, a następnie jako podstawa 243 w ciąg.

Nabb
źródło
Słusznie. Zaktualizowałem pytanie, aby nie zawracać sobie głowy niepotrzebnym odstępem między liczbami.
mootinator
6
Myślę, że „symbol zastępczy ...” jest nieco mylący.
Eelvex
8

J, 90 , 78 68 znaków

[ aktualizacja: przy użyciu kodowania Unicode (1 bajt):

,./(10 3 3$((90$3)#:256#.24x-~3&u:'%ė¨ÔW/~º»sy¡ăì<t÷²'){' _|'){~"./.Y
NB. utf characters are: 37 279 168 212 87 47 126 186 187 115 121 161 259 236 60 116 247 178

działa jak poprzednio:]

,./(10 3 3$((90$3)#:1219424106940570763878862820444729939648410x){' _|'){~"./. '58321'
 _  _  _  _    
|_ |_| _| _|  |
 _||_| _||_   |

Kluczem jest kodowanie cyfr jako liczb całkowitych base-3. Na przykład zero to:

:
 _ 
| |
|_|

lub ' _ | ||_|', który staje się 010202212 3 = 2750.

Eelvex
źródło
Mógłbym zapisać 10 znaków, gdyby J miał bardzo precyzyjne liczby podstawowe 36. Jakieś sugestie?
Eelvex
Używam teraz binarnego. Zastanawiam się, czy trinary zaoszczędziłoby mi trochę uderzeń?
luser droog
2
gratulacje za 1000. post na codegolf.SE! ( http://codegolf.stackexchange.com/q/1000)
Klamka
Ponad
5

Mathematica 205 209 198 179

i = IntegerDigits; t = Thread; r = Rule;
z@n_ := Row@i@n /. t[r[Range[0, 9], Grid[Partition[ReplacePart[Characters@" _ |_||_|", 
t[r[#, ""]]], 3], Spacings -> 0] & 
/@ (i /@ {5, 24578, 49, 47, 278, 67, 6, 4578, , 78})]]

Stosowanie

z@1234567890

cyfry

DavidC
źródło
5

JavaScript (145)

148 145

Ponieważ JavaScript nie ma tak naprawdę standardowego wejścia / wyjścia, jest on zapisywany jako funkcja, która pobiera ciąg znaków i zwraca dane wyjściowe jako ciąg znaków.

function r(n){for(i=o="",b=" |_\n|",L=n.length;i<3*L;)o+=b[(c="ǪĠòƲĸƚǚĢǺƺ".charCodeAt(n[i%L])>>(i++/L|0)*3)&1]+b[c&2]+b[c&4]+b[i%L?0:3];return o}

Rozmieszczone:

function r(n)
{
    for (i = o = "", b = " |_\n|", L = n.length;   i < 3*L;   )
        o += b [ (c = "ǪĠòƲĸƚǚĢǺƺ".charCodeAt(n[i%L]) >> (i++/L|0)*3) & 1 ] +
             b [ c&2 ] +
             b [ c&4 ] +
             b [ i%L ? 0 : 3 ];  // space or newline
    return o
}

Oto jak to działa:

  • Każdy kształt cyfry jest kodowany znakiem Unicode składającym się z 9 bitów.
  • Pierwsze trzy bity dotyczą pierwszego rzędu itp.

  • W każdej grupie trzech bitów pierwszy określa, czy pierwszym znakiem jest |spacja, drugi czy to jest _spacja, a trzeci ponownie |czy spacja.

  • Te trzy bity są odzyskiwane c&1, c&2a c&4, które są następnie używane jako wskaźniki w łańcuchu b.

  • Przy każdej iteracji i%Lznajduje się „współrzędna x”, tj. Cyfra na wejściun

  • Przy każdej iteracji i/Ljest „współrzędna y”, tj. Wiersz, ale musimy |0uczynić ją liczbą całkowitą

  • Wreszcie, spacje między cyframi i nowe linie między wierszami są również pobierane przez indeksowanie do b, ponowne użycie znaku spacji i w przeciwnym razie nieużywaną pozycję 3 w tym ciągu! :)

Timwi
źródło
Unicode! BAH! ... cóż, jest krótszy niż mój. +1
luser droog
5

Ruby, 142

' _     _  _     _  _  _  _  _ 
| |  | _| _||_||_ |_   ||_||_|
|_|  ||_  _|  | _||_|  ||_| _|'.lines{|l|puts x.chars.map{|i|l[i.to_i*3,3]}*''}

oczekuje danych wejściowych w zmiennej x. przykłady:

x = '321'
#  _  _    
#  _| _|  |
#  _||_   |

x = '42'
#      _ 
#  |_| _|
#    ||_ 
Patrick Oscity
źródło
ooooo. ładny! ...
luser droog,
3

Golfscript - 97 znaków

:*{32' _':$@'14'{?~!=}:&~32}%n*{:x' |':|\'1237'&$x'017'&|x'56'&}%n*{:x|\'134579'&$x'147'&|x'2'&}%
gnibbler
źródło
Użyj znaku wstecznego, aby zapisać znak dla wszystkich ciągów liczbowych (jak wstawić ten znak w formacie kodu?)
Nabb
@Nabb: Nie możesz - StackExchange to takie badziewie ...
Timwi
3

Windows PowerShell, 127

$i="$input"[0..99]
'☺ ☺☺ ☺☺☺☺☺','♠☻♥♥♦♣♣☻♦♦','♦☻♣♥☻♥♦☻♦♥'|%{$c=$_
""+($i|%{('···0·_·0··|0·_|0|_|0|_·0|·|'-split0)[$c[$_-48]]})}

Ponieważ ciągi zawierają pewne nieprzyjemne do pisania znaki, zrzut heksowy dla Twojej wygody:

000: 24 69 3D 22 24 69 6E 70 │ 75 74 22 5B 30 2E 2E 39  $i="$input"[0..9
010: 39 5D 0A 27 01 00 01 01 │ 00 01 01 01 01 01 27 2C  9]◙'☺ ☺☺ ☺☺☺☺☺',
020: 27 06 02 03 03 04 05 05 │ 02 04 04 27 2C 27 04 02  '♠☻♥♥♦♣♣☻♦♦','♦☻
030: 05 03 02 03 04 02 04 03 │ 27 7C 25 7B 24 63 3D 24  ♣♥☻♥♦☻♦♥'|%{$c=$
040: 5F 0A 22 22 2B 28 24 69 │ 7C 25 7B 28 27 20 20 20  _◙""+($i|%{('
050: 30 20 5F 20 30 20 20 7C │ 30 20 5F 7C 30 7C 5F 7C  0 _ 0  |0 _|0|_|
060: 30 7C 5F 20 30 7C 20 7C │ 27 2D 73 70 6C 69 74 30  0|_ 0| |'-split0
070: 29 5B 24 63 5B 24 5F 2D │ 34 38 5D 5D 7D 29 7D     )[$c[$_-48]]})}
Joey
źródło
5
Spójrz na wszystkie emotikony ..
Wang Dingwei
3

g Dalej, 186 175 znaków

Nowa wersja:

: s query parse-word bounds s" D@DD@DDDDDb`ddfFF`fff`Fd`df`f`" bounds do cr 2dup do i c@ '0 - j + c@ 3 0 do dup 3 and s"  _|" drop + 1 type 4 / loop drop loop 10 +loop bye ; s

To faktycznie przeszkadza również wyjść (+3 znaki) :). Oto bardziej czytelna wersja, robi trochę upakowania bitów, aby zmniejszyć rozmiar LUT o 1/3, ale wynikowy kod jest bardziej złożony, więc nie stanowi dużej oszczędności:

: 7s query parse-word bounds 
    s" D@DD@DDDDDb`ddfFF`fff`Fd`df`f`"
    bounds do 
        cr
        2dup do
            i c@ '0 - j + c@
            3 0 do
                dup 3 and
                s"  _|" drop + 1 type
                4 / \ shorter than an rshift
            loop
            drop
        loop
    10 +loop bye ;
7s

Stara wersja:

: s query parse-word bounds s"  _     _  _     _  _  _  _  _ | |  | _| _||_||_ |_   ||_||_||_|  ||_  _|  | _||_|  ||_|  |" bounds do cr 2dup do i c@ '0 - 3 * j + 3 type loop 30 +loop ; s

To powoduje, że stos jest niezrównoważony i nie przeszkadza mu wyjść z interpretera. Oto czystsza, bardziej czytelna wersja

: 7s query parse-word bounds 
    s"  _     _  _     _  _  _  _  _ | |  | _| _||_||_ |_   ||_||_||_|  ||_  _|  | _||_|  ||_|  |"
    bounds do 
        cr
        2dup do
            i c@ '0 - 3 * j + 3 type
        loop
    30 +loop 2drop bye ;
7s
Talia Troi
źródło
2

C # 369 Znaków

static void Main(string[] a){var b = new[] {123,72,61,109,78,103,119,73,127,111};var g = new[]{" _  ","|","_","| ","|","_","| "};a[0].ToCharArray().SelectMany((x,w)=>g.Select((y,i)=>new{s=((b[x-48]>>i&1)==1)?y:new String(' ',y.Length),j=i,v=w})).GroupBy(z=>(z.j+2)/3).ToList().ForEach(q=>Console.WriteLine(String.Join("", q.OrderBy(l=>l.v).Select(k=>k.s).ToArray())));}

Mogłem z łatwością wyciąć kilka postaci. Chodziło raczej o nadużycie LINQ :)

Więcej wersji białych znaków:

static void Main(string[] a)
{
    var b = new[] {123, 72, 61, 109, 78, 103, 119, 73, 127, 111};
    var g = new[] { " _  ", "|", "_", "| ", "|", "_", "| " };
    a[0].ToCharArray().SelectMany(
        (x,w)=>g.Select(
           (y,i)=>new{s=((b[x-48]>>i&1)==1)?y:new String(' ',y.Length),j=i,v=w}))
            .GroupBy(z=>(z.j+2)/3).ToList().ForEach(
            q=>Console.WriteLine(
                String.Join("", q.OrderBy(l=>l.v).Select(k=>k.s).ToArray())));
}
mootinator
źródło
Przede wszystkim potrzebujesz deklaracji klasy is using(409). Jest też trochę niepotrzebnych białych znaków, które można usunąć (402). Zadanie stanowi, że spacje między cyframi należy pominąć (399).
Joey,
Dzięki. Zredagowałem to zadanie, ponieważ nikt nie przestrzegał oryginalnej reguły białych znaków. Edytuj odpowiedź, jeśli cię obraża, bo mnie to nie obchodzi.
mootinator
gjest używany tylko raz, więc możesz zapisać 7 znaków, wkładając go.
Timwi
1
W rzeczywistości bjest również używany tylko raz, więc możesz go również wstawić. Ponadto możesz zapisać wiele znaków, jeśli zmienisz tablicę liczb całkowitych na "{H=mNgwI\x7fo", lub nawet krótszą, jeśli zmienisz \x7fna rzeczywisty znak # 127 (który jest drukowalny, ale dopuszczalny). >>Będzie nadal działać, ponieważ istnieje niejawna konwersja od charcelu int.
Timwi
Również .ToCharArray()i .ToArray()to zarówno zbędne, można je po prostu usunąć :)
Timwi
2

Rozwiązanie Java: 585 570 znaków

Nie sądzę, że będę próbował grać w golfa w Javie ...

import java.util.*;
public class CG997{public static void main(String[]args){
short[][]lets=new short[][]{{0,1,3,2,0,4,2,1,4},{0,0,3,0,0,4,0,0,4},{0,1,3,0,1,
4,2,1,3},{0,1,3,0,1,4,0,1,4},{0,0,3,2,1,4,0,0,4},{0,1,3,2,1,3,0,1,4},{0,1,3,2,1
,3,2,1,4},{0,1,3,0,0,4,0,0,4},{0,1,3,2,1,4,2,1,4},{0,1,3,2,1,4,0,0,4}};
String[]syms=new String[]{" ","_","|","  ","| "};
String s=new Scanner(System.in).nextLine();
for(int o=0;o<3;o++){for(char c:s.toCharArray()){for(int i =0;i<3;i++)
System.out.print(syms[lets[Short.parseShort(c+"")][i+o*3]]);
}System.out.println();}}}
Mitch
źródło
Twoja wersja java jest o wiele lepsza / krótsza niż moja :) btw! ... czy 6 w cyfrowej reprezentacji zegara ma górną granicę (_) na górze, czy nie? Byłem zdezorientowany po wyjściu!
Aman ZeeK Verma
Po sprawdzeniu ekspresu do kawy za mną szóstki powinny mieć czapkę. Zaktualizuję moje rozwiązanie.
Mitch
2

Pyton, 218 180 176

b=map(int,raw_input());a=map(int,bin(914290166014670372457936330)[2:]);c=' |_';p=lambda k:''.join(c[a[9*n+k]]+c[2*a[9*n+1+k]]+c[a[9*n+2+k]]for n in b)+'\n';print p(6)+p(0)+p(3)

Z podziałami linii:

b=map(int,raw_input())
a=map(int,bin(914290166014670372457936330)[2:])
p=lambda k:''.join(' |'[a[9*n+k]]+' _'[a[9*n+1+k]]+' |'[a[9*n+2+k]]for n in b)+'\n'
print p(6)+p(0)+p(3)
scleaver
źródło
2

Bash, 11 znaków

toilet "$i"

Tak, wiem, oszukuję.

Musisz mieć zainstalowaną toaletę.

Wug
źródło
1
I ustaw domyślną czcionkę na jedną z 7-segmentowymi numerami wyświetlania. figletteż by działał.
Rob
2

Java, 2,095

public class DigitalNumber {
    public static void main(String args[]){
        char[][] panel = new char[3][120]; //A 20 digit panel!
        int digXIndex = 0;int digYIndex = 0;
        for (int i=0;i<args[0].length(); i++){
            int dig=Integer.parseInt(""+args[0].charAt(i));
            panel[digXIndex][digYIndex]=32;   
            digYIndex++;
            if (dig!=1 && dig!=4)
                panel[digXIndex][digYIndex]='_';  
            else
                panel[digXIndex][digYIndex]=32;
            digYIndex++;
                panel[digXIndex][digYIndex]=32; 
            digYIndex=3*i;
            digXIndex++;
            if (dig!=1 && dig!=2 && dig!=3 && dig!=7)
                panel[digXIndex][digYIndex]='|';    
            else
                panel[digXIndex][digYIndex]=32;
            digYIndex++;
            if (dig!=1 && dig!=0 && dig!=7)
                panel[digXIndex][digYIndex]='_';    
            else
                panel[digXIndex][digYIndex]=32;
            digYIndex++;
            if (dig!=6 && dig!=5)
                panel[digXIndex][digYIndex]='|';  
            else
                panel[digXIndex][digYIndex]=32;
            digYIndex=3*i;
            digXIndex++;
            if (dig!=6 && dig!=8 && dig!=2 && dig!=0)
                panel[digXIndex][digYIndex]=32;  
            else
                panel[digXIndex][digYIndex]='|';
            digYIndex++;
            if (dig!=7 && dig!=4 && dig!=1)
                panel[digXIndex][digYIndex]='_';  
            else
                panel[digXIndex][digYIndex]=32;
            digYIndex++;
            if (dig!=2)
                panel[digXIndex][digYIndex]='|';  
            else
                panel[digXIndex][digYIndex]=32;
            digXIndex=0;
            digYIndex+=(i*3)+1;
        }       
        for (int i=0; i<3; i++){
            for (int j=0; j<120; j++)
                if (panel[i][j]!=0)
                System.out.print((char)(panel[i][j]));
                else
                    System.out.print("");
            System.out.println();
        }   
    }
}

PRZYKŁADOWE I / O

java DigitalNumber 98765432109876543210
     _  _  _  _  _     _  _     _  _  _  _  _  _     _  _     _ 
    |_||_|  ||_ |_ |_| _| _|  || ||_||_|  ||_ |_ |_| _| _|  || |
     _||_|  ||_| _|  | _||_   ||_| _||_|  ||_| _|  | _||_   ||_|
Aman ZeeK Verma
źródło
5
Powinienem zacząć nienawidzić java :)
Aman ZeeK Verma
1
Java świetnie nadaje się do wielu rzeczy, ale zwięzły kod nie jest jedną z nich.
Jonathan M. Davis
2
Ten kod nie jest nawet golfowy. Może być o wiele krótszy.
Joey,
Trochę grałem w twój kod;)
Knerd,
1

D: 295 znaków

import std.stdio;void main(string[]a){string[3]o;foreach(c;a[1]){int n=cast(int)(c)-48;auto e=" ";o[0]~=n!=1&&n!=4?" _ ":"   ";o[1]~=!n||n>3&&n!=7?"|":e;o[1]~=n>1&&n!=7?"_":e;o[1]~=n<5||n>6?"|":e;o[2]~=!(n&1)&&n!=4?"|":e;o[2]~=!n||n>1&&n!=4&&n!=7?"_":e;o[2]~=n!=2?"|":e;}foreach(l;o)writeln(l);}

Bardziej czytelnie:

import std.stdio;

void main(string[] a)
{
    string[3] o;

    foreach(c; a[1])
    {
        int n = cast(int)(c) - 48;
        auto e = " ";

        o[0] ~= n != 1 && n != 4 ? " _ " : "   ";

        o[1] ~= !n || n > 3 && n != 7 ? "|" : e;
        o[1] ~= n > 1 && n != 7 ? "_" : e;
        o[1] ~= n < 5 || n > 6 ? "|" : e;

        o[2] ~= !(n&1) && n != 4 ? "|" : e;
        o[2] ~= !n || n > 1 && n != 4 && n != 7 ? "_" : e;
        o[2] ~= n != 2 ? "|" : e;
    }

    foreach(l; o)
        writeln(l);
}
Jonathan M. Davis
źródło
1

Ocaml, 268

let t=function|'1'|'4'->"   "|_->" _ "let m=function|'0'->"| |"|'1'|'7'->"  |"|'2'|'3'->" _|"|_->"|_|"|'5'|'6'->"|_ "let b=function|'0'|'8'->"|_|"|'1'|'4'|'7'->"  |"|'2'->"|_ "|_->" _|"let f s=let g h=String.iter(fun c->print_string(h c))s;print_newline()ing t;g m;g b

Wersja do odczytu

let t = function
  | '1'
  | '4' -> "   "
  | _ -> " _ "
let m = function
  | '0' -> "| |"
  | '1'
  | '7' -> "  |"
  | '2'
  | '3' -> " _|"
  | _ -> "|_|"
  | '5'
  | '6' -> "|_ "
let b = function
  | '0'
  | '8' -> "|_|"
  | '1'
  | '4'
  | '7' -> "  |"
  | '2' -> "|_ "
  | _ -> " _|"
let f s =
  let g h =
    String.iter (fun c -> print_string (h c)) s;
    print_newline () in
  g t;
  g m;
  g b
ReyCharles
źródło
1

Perl (182 180)

#!perl -l
$_=<<7;
 _     _  _     _  _  _  _  _ 
| |  | _| _||_||_ |_   ||_||_|
|_|  ||_  _|  | _||_|  ||_| _|
7
@b=map{[/(...)/g]}split/\n/;@d=split//,<>;for$p(@b){print map$p->[$_],@d}

czyta ze STDIN.

$ perl 7segment.pl 
1234567890987654321
    _  _     _  _  _  _  _  _  _  _  _  _  _     _  _     _ 
  | _| _||_||_ |_   ||_||_|| ||_||_|  ||_ |_ |_| _| _|  || |
  ||_  _|  | _||_|  ||_| _||_| _||_|  ||_| _|  | _||_   ||_|
memowe
źródło
1

Ghostscript (270) (248) (214)

Edycja: więcej podstawień. Usunięto spację między cyframi.

Edycja: jeszcze więcej zmian. Główna pętla wygląda teraz tak, jak działa!

/F{forall}def[48<~HUp;::1ncBInp~>{1 index 1 add}F
pop/*{dup
2 idiv exch
2 mod
1 eq}/P{print}/#{( )P}/?{ifelse
P}/O{{( )}?}/|{*{(|)}O}/_{*{(_)}O}>>begin[[[[ARGUMENTS{{load
# _ #}F()=]2{{| _ |}F()=]}repeat]pop[[[[}F

Wykorzystuje funkcję przetwarzania argumentów ghostscript: wywołaj za pomocą gs -dNODISPLAY -- digit.ps 012 345 6789.

luser droog
źródło
1

Delfy || 453 (568 z formatem)

Nie dość blisko, by wygrać, ale fajnie było to zrobić ^. ^

const asc: array[0..9] of array[0..2] of string = ((' _ ','| |','|_|'),('   ','  |','  |'),(' _ ',' _|','|_ '),(' _ ',' _|',' _|'),('   ','|_|','  |'),(' _ ','|_ ',' _|'),(' _ ','|_ ','|_|'),(' _ ','  |','  |'),(' _ ','|_|','|_|'),(' _ ','|_|',' _|'));var s,l:string;x,i:integer;begin Readln(s);s:=StringReplace(s,' ','',[rfReplaceAll]);for I := 0 to 2 do begin l:='';for x := 1 to length(s) do l := l + asc[StrToInt(s[x])][i];writeln(l);end;readln;end.  

W formacie

const
asc: array[0..9] of array[0..2] of string = (
  (' _ ','| |','|_|'),
  ('   ','  |','  |'),
  (' _ ',' _|','|_ '),
  (' _ ',' _|',' _|'),
  ('   ','|_|','  |'),
  (' _ ','|_ ',' _|'),
  (' _ ','|_ ','|_|'),
  (' _ ','  |','  |'),
  (' _ ','|_|','|_|'),
  (' _ ','|_|',' _|'));
var
s,l:string;
x,i:integer;
begin
    Readln(s);
    s:=StringReplace(s,' ','',[rfReplaceAll]);
    for I := 0 to 2 do
    begin
      l:='';
      for x := 1 to length(s) do
        l := l + asc[StrToInt(s[x])][i];
      writeln(l);
    end;
    readln

koniec.

Teun Pronk
źródło
1

PHP, 140 136 133 131 129 128 bajtów

Mógłbym zaoszczędzić 5 7 więcej dzięki rozszerzonemu ascii: po jednym dla "| _"i podział wiersza, trzy za ~"z/]{4lno~|"(negacja bitowa zamieniłaby wszystko w rozszerzone znaki ascii = żadnych znaków specjalnych, a PHP nie potrzebuje tam cudzysłowów), dwa dla -1(to tylko tam, aby zachować mapę w standardowym ascii). Ale dla czytelności i kompatybilności pozostaję przy standardowym ascii.

for(;""<$c=$argv[1][$i++];)for($n=753754680;$n>>=3;)$r[$p++%3].="| _"[ord(~"z/]{4lno~|"[$c])-1>>$n%8&1?:$n&2];echo join("
",$r);

mapa bitowa

  • Wziąć diodowe _, |_|, |_|jako bity -6-, 024, 135(liczba bitów jest 0 i 2 dla diody LED pionowych)
  • Utwórz mapy bitowe dla liczb 0..9: [123,48,94,124,53,109,111,112,127,125]
  • Zmniejsz o 1, aby wszystkie kody ascii do wydruku -> "z/]{4lno~|"
  • negate -> ~"z/]{4lno~|"(zezwala na trójskładnikowy skrót podczas wyboru postaci)

szablon

  • używać 7do pomieszczeń -> 767, 024,135
  • REGROUP kolumnach zamiast rzędów -> 701, 623, 745(świadczy $p=0przestarzałe)
  • do tyłu -> 547326107(czytaj mapę od prawej do lewej; umożliwia zapętlenie arytmetyczne)
  • dodaj zero -> 5473261070(pozwala połączyć shift z testem w głowicy pętli)
  • czytaj ósemkowy, konwertuj na dziesiętny -> 753754680(dwa bajty krótsze: jedna cyfra i prefiks)

awaria

for(;""<$c=$argv[1][$i++];) // loop through input characters
    for($n=753754680;$n>>=3;)   // loop through template
        $r[$p++%3].="| _"[          // append character to row $p%3:
            ord(~"z/]{4lno~|"[$c])-1// decode bitmap
                >>$n%8&1            // test bit $n%8 (always 1 for bit 7)
            ?                       // if set: 1 (space)
            :$n&2                   // else: 2 (underscore) for bits 2,3,6; 0 (pipe) else
        ];
echo join("\n",$r);         // print result
Tytus
źródło
+16 bajtów w systemie szesnastkowym:ord(~"z/]{4lno~|v.J=NF"[hexdec($c)])-1
Tytus
1

Java 8, 280 bajtów

interface M{static void main(String[]a){String x="",y=x,z=x;for(int c:a[0].getBytes()){c-=48;x+=" "+(c==4|c==1?" ":"_")+" ";y+=(c==7|c>0&c<4?" ":"|")+(c==7|c<2?" ":"_")+(c>4&c<7?" ":"|");z+=(c%2<1&c!=4?"|":" ")+(c%3==1?" ":"_")+(c==2?" ":"|");}System.out.print(x+"\n"+y+"\n"+z);}}

Wyjaśnienie:

Wypróbuj tutaj.

interface M{                     // Class
  static void main(String[]a){   //  Mandatory main-method
    String x="",                 //   String for row 1, starting empty
           y=x,                  //   String for row 2, starting empty
           z=x;                  //   String for row 3, starting empty
    for(int c:a[0].getBytes()){  //   Loop over the bytes of the input
      c-=48;                     //    Convert the byte to integer
      x+=                        //    Append to row 1:
         " "                     //     a space
         +(c==4|c==1?            //     +If the digit is a 1 or 4:
            " "                  //       Append a space
           :                     //      Else:
            "_")                 //       Append an underscore
         +" ";                   //     + another space
      y+=                        //    Append to row 2:
         (c==7|c>0&c<4?          //      If the digit is 1, 2, 3, or 7:
           " "                   //       Append a space
          :                      //      Else:
           "|")                  //       Append a pipe
         +(c==7|c<2?             //     +If the digit is 0, 1, or 7:
            " "                  //       Append a space
           :                     //      Else:
            "_")                 //       Append an underscore
         +(c>4&c<7?              //     +If the digit is 5 or 6:
            " "                  //       Append a space
           :                     //      Else:
            "|");                //       Append a pipe
      z+=                        //    Append to row 3:
         (c%2<1&c!=4?            //      If the digit is 0, 2, 6 or 8:
           "|"                   //       Append a pipe
          :                      //      Else:
           " ")                  //       Append a space
          +(c%3==1?              //     +If the digit is 1, 4, or 7:
             " "                 //       Append a space
            :                    //      Else:
             "_")                //       Append a pipe
          +(c==2?                //     +If the digit is 2:
             " "                 //       Append a space
            :                    //      Else:
             "|");               //       Append a pipe
    }                            //   End of loop
    System.out.print(x+"\n"+y+"\n"+z);
                                 //   Print the three rows
  }                              //  End of main-method
}                                // End of class

W funkcji byłoby to 218 bajtów .

Kevin Cruijssen
źródło
0

Python, 227 znaków

a="   ";b=" _ ";c="|_|";d="| |";e="|  ";f="  |";g="|_ ";h=" _|"
z=[[b,d,c],[a,f,f],[b,h,g],[b,h,h],[a,c,f],[b,g,h],[b,g,c],[b,f,f],[b,c,c],[b,c,h]]
x=map(int,raw_input())
for i in range(3):
 for j in x:
  print z[j][i],
 print

Prosty i bezpośredni.

David Sousa
źródło
0

Perl, 145 znaków

$i=<>;for$s(6,3,0){for($i=~/./g){$v=(175,9,158,155,57,179,183,137,191,187)[$_]>>$s;$o.=($v&4?'|':$").($v&2?'_':$").($v&1?'|':$")}$o.="
"}print$o

Nie golfowany:

# Read STDIN
$i = <>;
# Amount to bit shift later
for $s (6,3,0)
{
  # For each character C from STDIN
  for ($i =~ /./g)
  {
    # Get the Cth array index, bit shifted right by $s
    $v = (175, 9, 158, 155, 57, 179, 183, 137, 191, 187)[$_]>>$s;
    # Concatenate each character if the bitwise masked value says it should be there
    $o .= ($v & 4 ? '|' : $") .
          ($v & 2 ? '_' : $") .
          ($v & 1 ? '|' : $");
  }
  # Concatenate a newline
  $o .= "
";
}
# Print the result
print $o;
KJP
źródło
0

Python 3.4.3 - 1514 858 bajtów

Pokusa, aby rozwiązać ten problem, była zbyt wielka, aby się nie zarejestrować i odpowiedzieć = P.

Jestem trochę nowy w Pythonie, więc sformatowałem swój program ładnie i schludnie (a przynajmniej tak zrobiłem). Ulepszenia są bardzo mile widziane!

import sys;l1,l2,l3,l4,l5="";num=input()
for c in num:
    if c=="1":
        l1+=" oo  ";l2+="  o  ";l3+="  o  ";l4+="  o  ";l5+="oooo "
    if c=="2":
        l1+="oooo ";l2+="   o ";l3+="oooo ";l4+="o    ";l5+="oooo "
    if c=="3":
        l1+="oooo ";l2+="   o ";l3+=" ooo ";l4+="   o ";l5+="oooo "
    if c=="4":
        l1+="o  o ";l2+="o  o ";l3+="oooo ";l4+="   o ";l5+="   o "
    if c=="5":
        l1+="oooo ";l2+="o    ";l3+="oooo ";l4+="   o ";l5+="oooo "
    if c=="6":
        l1+="oooo ";l2+="o    ";l3+="oooo ";l4+="o  o ";l5+="oooo "
    if c=="7":
        l1+="oooo ";l2+="   o ";l3+="   o ";l4+="   o ";l5+="   o "
    if c=="8":
        l1+="oooo ";l2+="o  o ";l3+="oooo ";l4+="o  o ";l5+="oooo "
    if c=="9":
        l1+="oooo ";l2+="o  o ";l3+="oooo ";l4+="   o ";l5+="oooo "
    if c=="0":
        l1+="oooo ";l2+="o  o ";l3+="o  o ";l4+="o  o ";l5+="oooo "
print(l1+"\n"+l2+"\n"+l3+"\n"+l4+"\n"+l5)

Edycja: użyto skróconych nazw zmiennych; aby skrócić, tylko jedna spacja na końcu liczb wyjściowych, wszystkie zmienne zdefiniowane jednocześnie.

Nowe wiersze mają 2 bajty (CRLF) i użyłem tabulatorów zamiast 4 spacji.


źródło
2
Witamy w Programowaniu Puzzle i Code Golf! Ponieważ jest to wyzwanie związane z golfem, będziesz chciał, aby Twój kod był jak najkrótszy. Te wskazówki mogą być przydatne podczas gry w golfa.
Alex A.,
„Użyłem tabulatorów zamiast 4 spacji” Jestem zdezorientowany. Dlaczego i tak nie korzystałeś z kart? ;)
Lekkość ściga się z Moniką
0

SmileBASIC, 216 bajtów

?INPUT N$DIM A[14]COPY A,@A@A
DATA 1,0,0,1,3,1,1,3,0,4,3,4,1,6FOR D=0 TO LEN(N$)-1X=ASC("w$]m.k{%\o"[VAL(N$[D])])FOR I=0TO 6T=I*2IF X<<31THEN GBOX A[T]+D*5,A[T+1],A[T]+D*5+!(I MOD 3),A[T+1]+!!(I MOD 3)
X=X/2NEXT
NEXT

Używanie grafiki zamiast tekstu, ponieważ prawdopodobnie jest ona krótsza.

Wyjaśnienie:

PRINT 'so the input and output don't overlap
INPUT NUMBER$ 'get number
DIM PTS[7*2] 'locations of segments
COPY PTS,@PTDATA 'copy data into array
@PTDATA
DATA 1,0,0,1,3,1,1,3,0,4,3,4,1,6 'stored as x,y,x,y,...
FOR DIGIT=0 TO LEN(NUMBER$)-1
 NUM=ASC("w$]m.k{%\o"[VAL(NUMBER$[DIGIT])]) 'get digit data. That data string doesn't have any non-ASCII characters, except \ which is 127 in SB.
 FOR I=0 TO 7-1 'draw each segment
  T=I*2 'position of point in array
  IF X AND 1 THEN GLINE PTS[T]+DIGIT*5,PTS[T+1],PTS[T]+DIGIT*5+!(I MOD 3),PTS[T+1]+!!(I MOD 3) 'draw segment. I MOD 3 determines whether it's horizontal or vertical.
  X=X>>1 'shift to next bit
 NEXT
NEXT
12Me21
źródło
0

C ++, 230 229 225 223 218 207 204 198 bajtów

#import<iostream>
#define d for(auto
std::string v[3],t,g="|_| =2$0^262\'032;2$2?272";main(){std::cin>>t;d i:t)d j:{0,1,2})d k:{0,1,2})v[k]+=g[g[i*2-92+!k]>>j+k/2*3&1?j:3];d j:v)std::cout<<j<<'\n';}

Odczytuje ze standardowego wejścia i wyświetla na standardowe wyjście.

Wyjaśnienie:

#import<iostream>                // string inside

std::string v[3], t, g="|_| "    // symbol on different horizontal position
      "=2$0^262\'032;2$2?272";   // space(0) or not(1) for each number and position
                                 // binary representation, last 6 bits is used
                                 // even positions are for row 1, 2; odds are for row 0

main() {
    std::cin>>t;                 // input
    for (auto i:t)               // for each character
        for (auto j:{0,1,2})     // for each horizontal position
            for (auto k:{0,1,2}) // for each vertical position
                v[k]+=g[         // use first four chars only
                    g[i*2-92     // i*2-96 is number*2, +4 to skip first four
                        +!k]     // row 0 uses another character
                    >>j+k/2*3    // (k==2?3:0)+j, the expected bit
                    &1           // extract the bit
                    ?j:3         // space or not space
                ];

    for (auto j:v) std::cout<<j<<'\n'; // output
}
Colera Su
źródło
0

PowerShell, 114 bajtów

param($a)6,3,0|%{$l=$_
-join($a|% t*y|%{('   0 _ 0 _|0|_ 0| |0  |0|_|'-split0)[(+('f-SR5Z^mvr'["$_"])-shr$l)%8]})}

Skrypt testowy:

$f = {

param($a)6,3,0|%{$l=$_
-join($a|% t*y|%{('   0 _ 0 _|0|_ 0| |0  |0|_|'-split0)[(+('f-SR5Z^mvr'["$_"])-shr$l)%8]})}

}

&$f "1234567890"
&$f "81"

Wydajność:

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

Główny pomysł:

Każdy standardowy numer stylu zegara cyfrowego zawiera 3 linie. Co więcej, pierwszy wiersz zawiera tylko 2 opcje. Łącznie 6 opcji. Dlatego 7 bitów wystarcza do zakodowania każdej cyfry.

line str=@('   ', ' _ ', ' _|', '|_ ', '| |', '  |', '|_|')

#    line str    binary       dec    ASCII
-    --------    ---------    ---    -----
0 -> 1 
     4 
     6        -> 1 100 110 -> 102 -> 'f'

1 -> 0
     5
     5        -> 0 101 101 ->  45 -> '-'

...

8 -> 1
     6
     6        -> 1 110 110 -> 118 -> 'v'

9 -> 1
     6
     2        -> 1 110 010 -> 114 -> 'r'

Zatem ciąg f-SR5Z^mvrkoduje wszystkie segmenty dla wszystkich standardowych numerów stylów zegara cyfrowego.

Uwaga: Kolejność line strzostała specjalnie wybrana, aby wszystkie kody znajdowały się w przedziale 32..126.

mazzy
źródło