Reto de la semana: "display 7 segmentos oblícuo"

Pues nada, se trata de escribir un programilla en el lenguaje que quieras, que tome por línea de comandos un número de cualquier tamaño (menor que un googolplex) y lo represente como en el siguiente ejemplo:

$ pinta_num 1234567890
\ /\ /\  \ /  /  /\ /\ /\ /\
 \ /  /\\/\\/\\/\  \\/\\/\\ \
   \/  /     / \/    \/  / \/

Debe evitarse el uso de secuencias de escape del terminal tipo “gotoxy”. Si se redirige la salida a un fichero, debe escribir lo mismo que en consola. Se valora la legibilidad y brevedad del código por encima de cualquier otra consideración.

[EDITADO]

Alternativa de representación, que no tengo muy claro si es más fácil o más difícil:

$ pinta_num 1234567890
                 /\
                 \ \
               /\ \/ 
               \/\
             /\  /
             \/\
           /\ \/
             \
         /
         \/\
       /  \/
       \/\
      \  /
     \/\
   /\
    /\
 /\  /
  /
\ \/
 \

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de david.villa

Inspirada en la versión de nacho

propongo dos mejoras:

Una legible:

import sys
 
bars = [
    [r"/\  ",  r" \  ", r"/\ ", r"/\  ",  r" \  ", r"/   ", r"/   ", r"/\  ", r"/\  ", r"/\  "],
    [r"\ \ ",  r"  \ ", r" / ", r" /\ ",  r"\/\ ", r"\/\ ", r"\/\ ", r"  \ ", r"\/\ ", r"\/\ "],
    [r" \/ ",  r"    ", r" \/", r"  / ",  r"    ", r"  / ", r" \/ ", r"    ", r" \/ ", r"  / "]]
 
digits = [int(x) for x in sys.argv[1]]
for row in bars:
    for d in digits:
        sys.stdout.write(row[d][:3])
    print

Y otra ilegible, Eye-wink:

import sys
 
segments = [r"/\ ", r" \ ", r"/  ", r"\ \ ", r" / ", r" /\ ", r"  \ ", r"\/\ ", r" \/", r"   ", r"  / "]
digits = [int(x) for x in sys.argv[1]]
for row in [[0,1,0,0,1,2,2,0,0,0], [3,6,4,5,7,7,7,6,7,7], [8,9,8,10,9,10,8,9,8,10]]:
    print ''.join([segments[row[d]][:3] for d in digits])

¿Quién dice que no se puede hacer Python ofuscado? Sticking out tongue

PD: Por cierto, creo que queda claro que el auténtico reto es la 2ª alternativa de representación...

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

Imagen de nacho

Resuelto en python

He cambiado un poco los números; no para que me sea más fácil, si no para que todos los números sean como en un display de 7 segmentos (el 1 y el 7 del primer ejemplo no tenían en cuenta los segmentos no usados de la izquierda). En fin, que aquí va el código:

#!/usr/bin/python
 
import sys
 
top=['/\\ ' , ' \\ ', '/\\ ', '/\\ ', ' \\ ' , '/  '  , '/  '  , '/\\ ', '/\\ ' , '/\\ ']
mid=['\\ \\', '  \\', ' / ' , ' /\\', '\\/\\', '\\/\\', '\\/\\', '  \\', '\\/\\', '\\/\\']
bot=[' \\/' , '   ' , ' \\/', '  /' , '   '  , '  /'  , ' \\/' , '   ' , ' \\/' , '  /']
 
number = []
 
n = str(sys.argv[1])
for d in n:
    if d.isdigit():
        number.append(int(d))
    else:
        print chr(27)+"[0;33m"+"skipping non-digit "+d+chr(27)+"[0m"
 
for i in number:
    print top[i],
 
print ""
 
for i in number:
    print mid[i],
 
print ""
 
for i in number:
    print bot[i],

Nacho

Imagen de david.villa

Si necesitas

poner \ sin el coñazo de tener que "escaparlas", en Python puede usar "raw strings". Eso se consigue poniendo una 'r'" delante de la cadena:

top=[r'/\ ' , r' \ ', r'/\ ', r'/\ ', r' \ ' , r'/  '  , r'/  '  , r'/\ ', r'/\ ' , r'/\ ']

Por cierto, tu solución no es conforme a requisitos, los números salen más separados que en la especificación:

enumciado:
\ /\ /\  \ /  /  /\ /\ /\ /\
 \ /  /\\/\\/\\/\  \\/\\/\\ \
   \/  /     / \/    \/  / \/
 
nacho:
 \  /\  /\   \  /   /   /\  /\  /\  /\  
  \  /   /\ \/\ \/\ \/\   \ \/\ \/\ \ \ 
     \/   /       /  \/      \/   /  \/

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

Ahí va un primer intento en

Ahí va un primer intento en C. Smiling

#include <stdio.h>
#include <string.h>
 
const char* parts[] = {
	"/ // /////",
	"\\\\\\\\\\  \\\\\\",
	"\\   \\\\\\ \\\\",
	"  ///// //",
	"\\\\ \\\\\\\\\\\\\\",
	"\\ \\   \\ \\ ",
	"/ // // //"
};
 
const int order[3][3] = {
	{ 0, 1, -1},
	{ 2, 3, 4 },
	{-1, 5, 6 } 
};
 
int idx(int c) {
	c -= 48;
	return (c < 0 || c >= 10) ? -1 : c;
}
 
void print(int num, int pos) {
	if (pos == -1 || num < 0 || num >= 10) fputc(' ', stdout);
	else fputc(parts[pos][num], stdout);
}
 
int main(int argc, char ** argv) {
	if (argc < 2) return 1;
	int len, num, pos, line, i;
 
	len = strlen(argv[1]);
	for (line = 0; line < 3; line++) {
		pos = 0;
		while (pos < len) {
			num = idx(argv[1][pos]);
			for (i = 0; i < 3; i++) print(num, order[line][i]);
			pos++;
		}
		fputc('\n', stdout);
	}
}