The challenge
The shortest code by character count to generate seven segment display representation of a given hex number.
Input
Input is made out of digits [0-9] and hex characters in both lower and upper case [a-fA-F] only. There is no need to handle special cases.
Output
Output will be the seven segment representation of the input, using those ASCII faces:
_ _ _ _ _ _ _ _ _ _ _ _
| | | _| _| |_| |_ |_ | |_| |_| |_| |_ | _| |_ |_
|_| | |_ _| | _| |_| | |_| _| | | |_| |_ |_| |_ |
Restrictions
The use of the following is forbidden: eval, exec, system, figlet, toilet and external libraries.
Test cases:
Input:
deadbeef
Output:
_ _ _ _ _
_||_ |_| _||_ |_ |_ |_
|_||_ | ||_||_||_ |_ |
Input:
4F790D59
Output:
_ _ _ _ _ _
|_||_ ||_|| | _||_ |_|
|| | _||_||_| _| _|
Code count includes input/output (i.e full program).
COM Executable: 102 bytes
Assemble the following using A86 (this is the original, larger version):
Edit:
The DosBox issue is probably the way the program assumes register values at start-up. Anyhow, here's the modified source that assembles to 102 bytes and should work with DosBox:
Thanks to ephemient for a couple of tweaks!
Golfscript - 116 chars
Make sure to save without an extra newline on the end or the input string will be printed at the end.
How it works
Notice that more segments are turned on than off for the range 0-F. List the exceptions (digits that have the segment turned off) for each segment.
Windows PowerShell, 157
C (170 characters)
This takes the input string as a command-line argument. Conversion to use stdin would be one more character:
The stdin version can accept up to 98 input characters. Of course, any more than
floor(terminalWidth / 3)
will cause confusing line wrap.The output for each character is treated like a 3x3 grid, where the cells in each row are the segments. A segment is either "on" or "off". If a segment is "on", either a
'|'
or a'_'
is output, depending on position. If it's off, a space is output. The character array is an array of bits that determine whether each segment is on or off. More about that after the code:The character array describes the character grids. Each character in the array describes one horizontal row of the output grid for two input characters. Each cell in the grid is represented by one bit, where
1
means that segment is "on" (so output a'|'
or a'_'
, depending on position), and0
means that segment is "off".It takes three characters in the array to describe the entire grid for two input characters. The lowest three bits of each character in the array, bits 0-2, describe one row for the even input character of the two. The next three bits, bits 3-5, describe one row for the odd input character of the two. Bits 6 and 7 are unused. This arrangement, with an offset of +33, allows every character in the array to be printable, without escape codes or non-ASCII characters.
I toyed with several different encodings, including putting the bits for all 7 segments of an input character into one character in the array, but found this one to be the overall shortest. While this scheme requires 24 characters in the array to represent the segments of only 16 input characters, other encodings either required using non-ASCII characters (which unsurprisingly caused problems when I used this in my Morse Code golf answer), a lot of escape codes, and/or complex decoding code. The decoding code for this scheme is surprisingly simple, although it does take full advantage of C's operator precedence to avoid having to add any parentheses.
Let's break it into tiny steps to understand it.
This is the encoded array. Let's grab the appropriate character to decode.
The first 8 characters describe the top row of segments, the next 8 describe the middle row of segments, and the last 8 describe the bottom row of segments.
Remember that, by this point, c contains a value from 0 to 15, which corresponds to an input of ABCDEF0123456789, and that the array encodes two input characters per encoded character. So the first character in the array,
'#'
, holds the bits for the top row of 'A' and of 'B', the second character, also'#'
, encodes the top row of 'C' and 'D', and so on.The encoding results in several values that are under 32, which would require escape codes. This offset brings every encoded character into the range of printable, unescaped characters.
The right shift operator has lower precedence than arithmetic operators, so this shift is done to the character after subtracting the offset.
c%2
evaluates to zero for even numbers, and to one for odd numbers, so we'll shift right by three for odd characters, to get at bits 3–5, and not shift at all for even characters, providing access to bits 0–2. While I'd prefer to usec&1
for even/odd check, and that is what I use everywhere else, the&
operator has too low precedence to use here without adding parentheses. The%
operator has just the right precedence.Shift by an additional
j
bits to get at the correct bit for the current output position.The bitwise and operator has lower precedence than both the arithmetic operators and the shift operators, so this will test whether bit zero is set after shifting has brought the relevant bit into bit zero.
If bit zero is set ...
... output one of these characters, chosen by ...
... whether our horizontal loop variable is even or odd.
Otherwise (bit zero is not set), output 32 (space character).
I don't think I can trim this down much more, if any, and certainly not enough to beat hobbs's perl entry.
BrainF***,
920906885868863860858 chars for digital clockI started on this on the (now closed) digital clock code golf, so : is supported as well. Todo: handle lowercase.
This depends heavily on the platform being 8-bit.
Python, 188 total chars
I haven't looked too much at the other solutions, but I'm sure there is still a lot of room for improvement.