31
\$\begingroup\$

Write the shortest program which will take a string of numbers (of up to at least 20 length) as input, and display the output using the standard digital clock style numbers. For instance for input 81, a solution with ascii output would give:

 _
|_|  |
|_|  |

Graphical output is also acceptable, if it helps.

\$\endgroup\$
4

33 Answers 33

42
\$\begingroup\$

Funciton

Not really a language suitable for golfing... but regardless, I tried to keep the code size as small as I could — quite a different challenge than in “usual” languages. This is 1555 characters or 3110 bytes (if encoded as UTF-16; UTF-8 is larger).

Here’s a screenshot of the program running. It really works :)

Since this looks ugly in StackExchange due to the extra line spacing, consider running the following code in your browser’s JavaScript console to fix that: $('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╟───────────┘
     ╚═══╝             ╚════╝╚═══╝

It could probably be smaller if I hadn’t made a mistake due to which the output was back to front; I fixed that by adding an extra function to reverse the input. Otherwise I would probably have to rewrite all of it.

I also made another mistake (swapping the operands in two calls to ) which made it necessary to declare the extra function, but this one is so small it fits inside the main function and thus doesn’t add any characters!

\$\endgroup\$
2
  • 10
    \$\begingroup\$ Whoa, that looks cool. Not only the solution, the language too :-) \$\endgroup\$
    – Joey
    May 7 '11 at 9:58
  • 1
    \$\begingroup\$ That is just awesome \$\endgroup\$
    – Knerd
    Dec 10 '14 at 10:31
9
\$\begingroup\$

wxpython, many characters

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

enter image description here

ps: not a serious entry, but looks like graphical output is also acceptable, so I just gave it a try :-)

\$\endgroup\$
2
  • \$\begingroup\$ +1 Glad to see this :). \$\endgroup\$
    – mootinator
    Feb 18 '11 at 4:27
  • 1
    \$\begingroup\$ Way too many of you. :P \$\endgroup\$
    – You
    Aug 7 '16 at 16:16
8
\$\begingroup\$

Golfscript - 66 chars

"placeholder text for userscript which counts chars             ";

xxd: (use xxd -r to revert)

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                                     /;

This follows most of the other answers in that there are no spaces between numbers and trailing spaces are kept in. A space between numbers can easily be added with 1+ before {"_ |"=}%. Packed into a base 3 number, and then as base 243 into a string.

\$\endgroup\$
2
  • \$\begingroup\$ Fair enough. I updated the question to not bother with the unnecessary space between numbers. \$\endgroup\$
    – mootinator
    Feb 18 '11 at 5:12
  • 6
    \$\begingroup\$ I think the "placeholder..." thing is a bit confusing. \$\endgroup\$
    – Eelvex
    Feb 18 '11 at 13:35
8
\$\begingroup\$

J, 90, 78 68 chars

[ update: using unicode (1 byte) encoding:

,./(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

works as before: ]

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

The key is in the encoding of digits as base-3 integers. Zero, for example is:

:
 _ 
| |
|_|

or ' _ | ||_|', which becomes 0102022123 = 2750.

\$\endgroup\$
4
  • \$\begingroup\$ I could save 10 characters if J had high precision base-36 numbers. Any suggestions anyone? \$\endgroup\$
    – Eelvex
    Feb 17 '11 at 23:09
  • \$\begingroup\$ I'm using binary now. I wonder if trinary would save me some strokes? \$\endgroup\$ Dec 3 '12 at 4:59
  • 2
    \$\begingroup\$ congratulations for having the 1000th post on codegolf.SE! (http://codegolf.stackexchange.com/q/1000) \$\endgroup\$
    – Doorknob
    Sep 23 '13 at 21:54
  • \$\begingroup\$ 2+ years late but thanks :) \$\endgroup\$
    – Eelvex
    Sep 24 '13 at 1:13
7
\$\begingroup\$

APL (Dyalog) (45)

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

The string, ા8धगɯે૙ࣃଏ૽, are the unicode characters 2750 56 2343 2327 623 2759 2777 2243 2831 2813 (however, you should be able to just copy and paste it). They encode the numbers. The program reads a line from the keyboard.

Explanation:

  • 1+⍎¨⍞: read a line from the keyboard, parse each character as a digit, then add 1 to each number (APL arrays are 1-based by default).
  • ⎕UCS'ા8धगɯે૙ࣃଏ૽'[...]: Select the characters belonging to the digits of the numbers you entered, and look up the Unicode values.
  • {...: for each of these values, do:
  • 1+⍵⊤⍨9⍴3: get the first 9 base-3 digits from the value as expressed in base-3, and add 1 (because the arrays ar 1-based).
  • ' _|'[...]: select a space, horizontal line, or vertical line depending on these digits
  • 3 3⍴: format as a 3-by-3 box.
\$\endgroup\$
5
\$\begingroup\$

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})]]

Usage

z@1234567890

digits

\$\endgroup\$
5
\$\begingroup\$

JavaScript (145)

148 145

Since JavaScript doesn’t really have standard input/output, this is written as a function that takes a string and returns the output as a string.

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}

Spaced out:

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
}

Here’s how it works:

  • Every digit shape is encoded in a Unicode character consisting of 9 bits.
  • The first three bits are for the first row, etc.

  • In each group of three bits, the first specifies whether the first character is | or space, the second whether it’s _ or space, and the third again | or space.

  • These three bits are retrieved as c&1, c&2 and c&4, which are then used as indexes into the string b.

  • At each iteration, i%L is the “x-coordinate”, i.e. the digit within the input n

  • At each iteration, i/L is the “y-coordinate”, i.e. the row, but we need |0 to make it an integer

  • Finally, the spaces between the digits and the newlines between the lines are also retrieved by indexing into b, re-using the space character and the otherwise unused position 3 in that string! :)

\$\endgroup\$
1
  • \$\begingroup\$ Unicode! BAH! ... well, it is shorter than mine. +1 \$\endgroup\$ Dec 3 '12 at 4:54
5
\$\begingroup\$

Ruby, 142

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

expects input in the variable x. examples:

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

x = '42'
#      _ 
#  |_| _|
#    ||_ 
\$\endgroup\$
1
  • \$\begingroup\$ ooooo. pretty! ... \$\endgroup\$ Dec 3 '12 at 4:49
3
\$\begingroup\$

Golfscript - 97 chars

:*{32' _':$@'14'{?~!=}:&~32}%n*{:x' |':|\'1237'&$x'017'&|x'56'&}%n*{:x|\'134579'&$x'147'&|x'2'&}%
\$\endgroup\$
2
  • \$\begingroup\$ Use the backtick to save a char for all the numeric strings (how do I insert this character in the code format?) \$\endgroup\$
    – Nabb
    Feb 18 '11 at 5:00
  • \$\begingroup\$ @Nabb: You can’t — StackExchange is crap like that... \$\endgroup\$
    – Timwi
    May 6 '11 at 13:29
3
\$\begingroup\$

Windows PowerShell, 127

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

Since the strings contain some unpleasant-to-write characters, a hexdump for your convenience:

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]]})}
\$\endgroup\$
1
  • 6
    \$\begingroup\$ Look at all the smileys.. \$\endgroup\$ Feb 18 '11 at 4:58
3
\$\begingroup\$

Java Solution: 585 570 Chars

I don't think I'll be attempting any more golfing in Java...

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();}}}
\$\endgroup\$
2
  • \$\begingroup\$ Your java version is way better/shorter than mine :) btw!... does 6 in digital clock representation has a cap (_) at top or not? I got confused after you output! \$\endgroup\$ Feb 18 '11 at 22:02
  • \$\begingroup\$ Upon checking the coffee maker behind me, the 6's should have a cap. I'll update my solution. \$\endgroup\$
    – Mitch
    Feb 18 '11 at 22:30
3
\$\begingroup\$

Bash, 11 characters

toilet "$i"

Yes I know, I'm cheating.

You need to have toilet installed.

\$\endgroup\$
1
  • 1
    \$\begingroup\$ And have the default font set to one with 7 segment display numbers. figlet would also work. \$\endgroup\$
    – Rob
    Nov 14 '12 at 18:36
3
\$\begingroup\$

gForth, 186 175 chars

New version:

: 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

This actually bothers to exit (+3 chars) as well :). Here is the more readable version, it does some bit-packing to reduce the LUT size by 1/3, but the resulting code is more complex so it's not much of a savings:

: 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

Old version:

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

This leaves the stack unbalanced and doesn't bother to exit the interpreter. Here is a cleaner more readable version

: 7s query parse-word bounds 
    s"  _     _  _     _  _  _  _  _ | |  | _| _||_||_ |_   ||_||_||_|  ||_  _|  | _||_|  ||_|  |"
    bounds do 
        cr
        2dup do
            i c@ '0 - 3 * j + 3 type
        loop
    30 +loop 2drop bye ;
7s
\$\endgroup\$
2
\$\begingroup\$

C# 369 Characters

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())));}

I could easily cut a few characters out. The point was more to abuse LINQ :)

More whitespace version:

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())));
}
\$\endgroup\$
5
  • \$\begingroup\$ First of all, you need a class declaration and usings (409). Then there is a some unnecessary whitespace that can be removed (402). The task states that whitespace between the digits shall be omitted (399). \$\endgroup\$
    – Joey
    Apr 16 '11 at 12:26
  • \$\begingroup\$ Uh, thanks. I edited the task because nobody was following the original whitespace rule. Feel free to edit the answer if it offends you, because I just don't care. \$\endgroup\$
    – mootinator
    Apr 16 '11 at 17:42
  • \$\begingroup\$ g is used only once, so you can save 7 characters by inlining it. \$\endgroup\$
    – Timwi
    May 6 '11 at 1:10
  • 1
    \$\begingroup\$ Actually b is also used only once, so you can inline it too. Also, you can save a lot of characters if you change the integer array to "{H=mNgwI\x7fo", or even shorter if you change \x7f to the actual character #127 (which is unprintable, but permissible). The >> will still work because there is an implicit conversion from char to int. \$\endgroup\$
    – Timwi
    May 6 '11 at 1:14
  • \$\begingroup\$ Also, the .ToCharArray() and the .ToArray() are both redundant, you can just remove them :) \$\endgroup\$
    – Timwi
    May 6 '11 at 1:16
2
\$\begingroup\$

Python, 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)

With line breaks:

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)
\$\endgroup\$
2
\$\begingroup\$

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();
        }   
    }
}

SAMPLE I/O

java DigitalNumber 98765432109876543210
     _  _  _  _  _     _  _     _  _  _  _  _  _     _  _     _ 
    |_||_|  ||_ |_ |_| _| _|  || ||_||_|  ||_ |_ |_| _| _|  || |
     _||_|  ||_| _|  | _||_   ||_| _||_|  ||_| _|  | _||_   ||_|
\$\endgroup\$
4
  • 5
    \$\begingroup\$ I should start hating java :) \$\endgroup\$ Feb 17 '11 at 21:06
  • 1
    \$\begingroup\$ Java is great for many things, but terse code is not one of them. \$\endgroup\$ Feb 18 '11 at 11:32
  • 3
    \$\begingroup\$ Well, this code isn't even golfed. It could be way shorter. \$\endgroup\$
    – Joey
    Apr 16 '11 at 9:20
  • \$\begingroup\$ I golfed your code a bit ;) \$\endgroup\$
    – Knerd
    Dec 10 '14 at 10:46
2
\$\begingroup\$

Java 8, 280 274 bytes

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);}}

-6 bytes thanks to @ceilingcat.

Explanation:

Try it here.

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:
         c==4|c==1?              //     If the digit is a 1 or 4:
            "   "                //       Append three spaces
           :                     //      Else:
            " _ ";               //       Append a space + underscore + space instead
      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

As function this would be 212 bytes instead.

\$\endgroup\$
0
2
\$\begingroup\$

Vyxal jṠ, 40 bytes

»*ż↵↲ṡŀ≬₍ṡfl₆ǎ8≠∇ƈH»`_ |`τ3/₀/ƛ£⁰ƛ¥nIi;ṅ

Try it Online!

A mess. Uses base-3 compression.

»...»                     # Compressed integer containing all digits
     `_ |`τ               # Decompress by custom base-3
           3/             # Divide into 3
             ₀/           # Divide each piece into 10
               ƛ          # Map this new list to...
                £         # Store to register
                 ⁰ƛ    ;  # Map this new input to...
                   ¥      # Push register
                    nIi   # Get correct value
                        ṅ # Join
                          # (Implicit) Join by newlines
\$\endgroup\$
1
\$\begingroup\$

D: 295 Characters

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);}

More Legibly:

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);
}
\$\endgroup\$
1
\$\begingroup\$

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

Readable version

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
\$\endgroup\$
1
\$\begingroup\$

Ghostscript (270) (248) (214)

Edit: More substitutions. Removed space between digits.

Edit: Even more substitutions. Main loop now looks like what it does!

/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

Uses ghostscript's argument-processing feature: invoke with gs -dNODISPLAY -- digit.ps 012 345 6789.

\$\endgroup\$
1
\$\begingroup\$

Delphi || 453 (568 With format)

Not even close enough to win but it was fun to do ^.^

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.  

With format

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.

\$\endgroup\$
1
\$\begingroup\$

PHP, 140 136 133 131 129 128 bytes

I could save 5 7 more with extended ascii: one each for "| _" and the linebreak, three for ~"z/]{4lno~|" (bitwise negation would turn everything to extended ascii characters = no special characters, and PHP doesn´t need quotes there), two for -1 (it´s only there to keep the map in standard ascii). But for readability and compatibility, I stay with standard 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);

the bitmap

  • Take LEDS _,|_|, |_| as bits -6-,024,135 (bit number &2 is 0 for vertical LEDs)
  • Create bitmaps for numbers 0..9: [123,48,94,124,53,109,111,112,127,125]
  • Decrease by 1 to make them all printable ascii codes -> "z/]{4lno~|"
  • negate -> ~"z/]{4lno~|" (allows ternary shorthand in character selection)

the template

  • use 7 for the spaces -> 767,024,135
  • regroup by columns instead of rows -> 701,623,745 (renders $p=0 obsolete)
  • reverse -> 547326107 (read the map from right to left; allows arithmetic looping)
  • append zero -> 5473261070 (allows to combine shift with test in loop head)
  • read octal, convert to decimal -> 753754680 (two bytes shorter: one digit and the prefix)

breakdown

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
\$\endgroup\$
1
  • \$\begingroup\$ +16 bytes for hexadecimal: ord(~"z/]{4lno~|v.J=NF"[hexdec($c)])-1 \$\endgroup\$
    – Titus
    Jan 25 '17 at 3:57
1
\$\begingroup\$

Powershell, 114 bytes

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

Test script:

$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"

Output:

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

Main idea:

Each standard digital clock style number contains 3 lines. Moreover, the first line contains only 2 options. A total of 6 options. Therefore, 7 bits are enough to encode each digit.

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'

So, the string f-SR5Z^mvr encodes all segments for all standard digital clock style numbers.

Note: The order of the line str was specially selected so that all codes were in the interval 32..126.

\$\endgroup\$
1
\$\begingroup\$

Perl 5 -F, 96 bytes

map{@m=/./g;say map{substr'    _  _||_ | |  ||_|',3*$m[$_],3}@F}1011011111,4522633566,6532526562

Try it online!

The string _ _||_ | | ||_| represents the possible "cross sections" of the digits (grabbed the idea from @mazzy's PowerShell solution). The numbers in the list 1011011111,4522633566,6532526562 represent indices into that string for the first, second, and third line of each of the digits 0-9. The index must be multiplied by 3 to get to the correct position. This loops over each character input (stored in the @F array by the -F option on the command line), finds the correct index into the string for that input, and then outputs the result.

Old version: Perl 5 -n, 102 bytes

for$b(' a ',dbe,fcg){say s%.%'$b=~y/'.(b,abcdf,dg,df,acf,ef,e,bcdf,Z,f)[$&]."/ /r=~y/a-z/___|/r"%geer}

Try it online!

Considers the characters of the display to be named like this: $$\begin{array}{|c|c|c|} \hline & a & \\ \hline d &b & e \\ \hline f & c & g \\ \hline \end{array}$$

The code iterates over strings representing each line of that table (' a ',dbe,fcg). On each of those, it changes the elements turned off into spaces. This information is in the list (b,abcdf,dg,df,acf,ef,e,bcdf,z,f). It uses the current element of the input (stored in $_ by the commandline switch and extracted by the pattern match into $&) to index into that list. Finally, the letters a, b, and c are changed to underscores (_) and all other letters into pipes (|).

\$\endgroup\$
0
\$\begingroup\$

Perl (182 180)

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

reads from STDIN.

$ perl 7segment.pl 
1234567890987654321
    _  _     _  _  _  _  _  _  _  _  _  _  _     _  _     _ 
  | _| _||_||_ |_   ||_||_|| ||_||_|  ||_ |_ |_| _| _|  || |
  ||_  _|  | _||_|  ||_| _||_| _||_|  ||_| _|  | _||_   ||_|
\$\endgroup\$
0
\$\begingroup\$

Python, 227 chars

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

Simple and straightforward.

\$\endgroup\$
0
\$\begingroup\$

Python 3.4.3 - 1514 858 bytes

The temptation to solve this was too great not to sign up and answer =P

I'm a bit new to Python, so I formatted my program nice and neat (or at least I did). Improvements are greatly appreciated!

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)

Edit: Shortened variable names, used ; to shorten, only one space at end of output numbers, defined variables all at once.

New lines are 2 bytes (CRLF) and I used tabs instead of 4 spaces.

\$\endgroup\$
2
  • 2
    \$\begingroup\$ Welcome to Programming Puzzles & Code Golf! Since this is a code golf challenge, you'll want to make your code as short as possible. These tips maybe be helpful for golfing. \$\endgroup\$
    – Alex A.
    Dec 24 '15 at 3:35
  • \$\begingroup\$ "I used tabs instead of 4 spaces" I'm confused. Why weren't you using tabs anyway? ;) \$\endgroup\$ Feb 11 '16 at 23:38
0
\$\begingroup\$

SmileBASIC, 216 bytes

?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

Using graphics instead of text, because it's probably shorter.

Explanation:

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
\$\endgroup\$
0
\$\begingroup\$

C++, 230 229 225 223 218 207 204 198 bytes

#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';}

Reads from stdin and output to stdout.

Explanation:

#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
}
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.