• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Tharis

[Desafio] Seven-Segment Display

37 mensagens neste tópico

Bem, deixo aqui um desafio que não é nada de mais.

Dado um número qualquer, convertê-lo, para o Seven-Segment Display.

Por exemplo, 23 resultaria em:

_  _

_| _|

|_  _|

Numa string em ASCII, seria:

" _  _ \n _| _|\n|_  _|\n"

Claro que isto é muito fácil, por isso o objectivo é fazer no menor número de caracteres. :D

(Quanto aos créditos, não vou revelar, por enquanto, porque tem lá soluções) ;)

EDIT

O número é dado em string por causa dos "leading zeroes". :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É para fazer um script/programa/classe, qualquer código que converta?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É um tipo de desafio q n depende da linguagem.

Assim de repente não vejo nenhuma linguagem q tenha alguma vantagem em relação ás outras para implementar isto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Primeira versão:

def convert7segment(n):
    SEGMENTS=[[" _ ","| |","|_|"],
              ["   ","  |","  |"],
              [" _ "," _|","|_ "],
              [" _ "," _|"," _|"],
              ["   ","|_|","  |"],
              [" _ ","|_ "," _|"],
              [" _ ","|_ ","|_|"],
              [" _ ","  |","  |"],
              [" _ ","|_|","|_|"],
              [" _ ","|_|"," _|"]]
    digits=str(n)
    length=len(digits)
    for i in range(3):
        for j in range(length):
            print(SEGMENTS[int(digits[j])][i],end=' ')
        print()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É para fazer um script/programa/classe, qualquer código que converta?

Sim.

Linguagens? À escolha?

Sim (à escolha).

É um tipo de desafio q n depende da linguagem.

Assim de repente não vejo nenhuma linguagem q tenha alguma vantagem em relação ás outras para implementar isto.

Vejo eu. :)

EDIT

Esqueci-me de dizer (lembrou-me o post do Ferreira) que o número é dado em string. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Versão corrigida (o argumento é uma string e devolve o resultado em vez de o escrever):

def convert7segment(n):
    SEGMENTS=[[" _ ","| |","|_|"],
              ["   ","  |","  |"],
              [" _ "," _|","|_ "],
              [" _ "," _|"," _|"],
              ["   ","|_|","  |"],
              [" _ ","|_ "," _|"],
              [" _ ","|_ ","|_|"],
              [" _ ","  |","  |"],
              [" _ ","|_|","|_|"],
              [" _ ","|_|"," _|"]]
    length=len(n)
    result=""
    for i in range(3):
        for j in range(length):
            result+=SEGMENTS[int(n[j])][i]
        result+='\n'
    return result

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em Haskell

import Data.Char
import Data.List

segments = [[" _ ","| |","|_|"]
           ,["   ","  |","  |"]
           ,[" _ "," _|","|_ "]
           ,[" _ "," _|"," _|"]
           ,["   ","|_|","  |"]
           ,[" _ ","|_ "," _|"]
           ,[" _ ","|_ ","|_|"]
           ,[" _ ","  |","  |"]
           ,[" _ ","|_|","|_|"]
           ,[" _ ","|_|"," _|"]
           ]

convert7segment=unlines.(map unwords).transpose.map((segments!!).digitToInt)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Claro que isto é muito fácil, por isso o objectivo é fazer no menor número de caracteres. ;)

E o que é que isso interessa mesmo? Isso é tipo medir pilas, ou seja, pointless.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E o que é que isso interessa mesmo? Isso é tipo medir pilas, ou seja, pointless.

Medir pilas, sim, pode ser isso! :D

Just for fun ;)

Mas aposto mais que é por isto. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Continua pointless, linguagens como haskell (basta ver o exemplo acima) têm grande vantagem nesse aspecto sobre outras linguagens. Se o objectivo fosse fazer algo com o melhor código possível, independentemente do número de caracteres/linhas, tinha muito mais interesse e sempre poderia ter alguma utilidade :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pegando no código do Ferreira:

segments=[[" _ ","| |","|_|"],
              ["   ","  |","  |"],
              [" _ "," _|","|_ "],
              [" _ "," _|"," _|"],
              ["   ","|_|","  |"],
              [" _ ","|_ "," _|"],
              [" _ ","|_ ","|_|"],
              [" _ ","  |","  |"],
              [" _ ","|_|","|_|"],
              [" _ ","|_|"," _|"]]

sevenseg = lambda n, seg: '\n'.join([str([seg[int(j)][i] for j in str(n)]) for i in range(min(map(lambda x: len(x), seg)))])

print sevenseg(123456, segments)

Tenho um str(n) para aceitar também o número em inteiro (dá jeito para testar :D).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podias por \n's aí, nestes concursos nunca se conta o número de ' ' e '\n's..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

À pedreiro, mas funciona. :D


$number = "23";


$linhas[1] = array("0" => " _ ", "1" => "   ", "2" => " _ ", "3" => " _ ", "4" => "   ", "5" => " _ ", "6" >= " _ ", "7" => " _ ", "8" => " _ ", "9" => " _ ");

$linhas[2] = array("0" => "|_|", "1" => "  |", "2" => " _|", "3" => " _|", "4" => "|_|", "5" => "|_ ", "6" >= "|_ ", "7" => "  |", "8" => "|_|", "9" => "|_|");

$linhas[3] = array("0" => "|_|", "1" => "  |", "2" => "|_", "3" => " _|", "4" => "  |", "5" => "_|", "6" >= "|_|", "7" => " |", "8" => "|_|", "9" => "|");
$return = $number;
Foreach ($linhas[1] as $nome => $valor){
$return = str_replace($nome, $valor, $return);
//echo $return."<br />";
}
$return_1 = $return."<br />";
$return = $number;
Foreach ($linhas[2] as $nome => $valor){
$return = str_replace($nome, $valor, $return);
}
$return_1 .= $return."<br />";
$return = $number;
Foreach ($linhas[3] as $nome => $valor){
$return = str_replace($nome, $valor, $return);
}
$return_1 .= $return."<br />";
echo $return_1;

Output:

_  _ <br> _| _|<br>|_ _|<br>

_  _

_| _|

|_  _|

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Txi que complicação scorch :D

Primeiro podes declarar a array desta maneira: $linhas = array(array(" _ ", "  "), array("|_|", "  |"));

Depois em vez de 3 foreaches, podes usar um foreach dentro de um for tipo for($i=0;$i<3;$i++) foreach($linhas[$i] as $k => $v) echo ((str)$k).$v;

E para finalizar, podias usar o nl2br().

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E para finalizar, podias usar o nl2br().

O que é isso? Para que é que serve?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

def decode(i):
d=[('_'+'|_|'*2)[x] if (0xde12bcb672e6ee92fef6>>(8*(9-i))>>7-x)&1 else ' ' for x in range(7)]  
return '\n'.join([' '+d[0]]+[''.join(x) for x in zip(*[iter(d[1:])]*3)])

:D

Aqui fica a minha submissão. Só funciona com números de um digito, não estou com pachorra para mais. :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Só funciona com números de um digito,

Então não presta. :mrgreen:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Continua pointless, linguagens como haskell (basta ver o exemplo acima) têm grande vantagem nesse aspecto sobre outras linguagens. Se o objectivo fosse fazer algo com o melhor código possível, independentemente do número de caracteres/linhas, tinha muito mais interesse e sempre poderia ter alguma utilidade :D

Se Haskell tem vantagem paciência.

Então não presta. :mrgreen:

Big True! :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fica aqui a minha contribuição. Nunca tinha feito um código tão manhoso  :P

#include <stdio.h>
char r[99], s[99] , i= -1 , j, k ;
int a[] = { 306775170 , 1060861645 , 255694735 };
#define M(n,z) r[k++] = a[i]>>3*s[j]-'0' & n ? z : ' ',
main() {
scanf("%s", s);
for ( ; ++i < 3 ; puts(r) )
	for (j=k=0; s[j] ; M(4,'|') M(2,'_') M(1,'|') j++ ) ;
}

Assumo que compilação com (muitos) warnings é aceite  :P

edit: tinha vários parêntesis desnecessários :x

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fica aqui a minha contribuição. Nunca tinha feito um código tão manhoso  :P

#include <stdio.h>
char r[99], s[99] , i= -1 , j, k ;
int a[] = { 306775170 , 1060861645 , 255694735 };
#define M(n,z) r[k++] = a[i]>>3*s[j]-'0' & n ? z : ' ',
main() {
scanf("%s", s);
for ( ; ++i < 3 ; puts(r) )
	for (j=k=0; s[j] ; M(4,'|') M(2,'_') M(1,'|') j++ ) ;
}

Porreiro. Tenho de experimentar depois e ver como fizeste. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora