Jump to content
Tharis

[Desafio] Seven-Segment Display

Recommended Posts

Tharis

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". :)

Share this post


Link to post
Share on other sites
scorch

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


PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Share this post


Link to post
Share on other sites
Ferreira

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

Share this post


Link to post
Share on other sites
Tharis

É 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. ;)

Share this post


Link to post
Share on other sites
skin

Isto parece quase o Codebits tharis ;)


Our lives begin to end the day we become silent about things that matter - Martin Luther King

Share this post


Link to post
Share on other sites
Ferreira

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

Share this post


Link to post
Share on other sites
Betovsky

Em Haskell

import Data.Char
import Data.List

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

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


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Share this post


Link to post
Share on other sites
Nazgulled

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.

Share this post


Link to post
Share on other sites
mogers

Just for fun ;)


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Share this post


Link to post
Share on other sites
Tharis

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. :)

Share this post


Link to post
Share on other sites
Nazgulled

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

Share this post


Link to post
Share on other sites
djthyrax

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 ).


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Share this post


Link to post
Share on other sites
Warrior

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

Share this post


Link to post
Share on other sites
scorch

À 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>

_  _

_| _|

|_  _|


PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Share this post


Link to post
Share on other sites
djthyrax

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().


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Share this post


Link to post
Share on other sites
scorch

E para finalizar, podias usar o nl2br().

O que é isso? Para que é que serve?


PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Share this post


Link to post
Share on other sites
Triton

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


<3 life

Share this post


Link to post
Share on other sites
Betovsky

Geez, puseste a minha cabeça a andar à roda...


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.