Retornar a versão invertida de um número


18

Quando um número é mostrado em uma calculadora, é possível considerar como seriam as várias transformações desse número. Por exemplo, em uma exibição de sete segmentos, 2 é mostrado assim:

insira a descrição da imagem aqui

E quando virado horizontalmente, fica assim:

insira a descrição da imagem aqui

Como tal, a imagem espelhada de 2 é 5.

A tarefa neste desafio é pegar um número de um dígito e retornar o número que é sua imagem espelhada (se possível). Se a imagem espelhada não parecer um número, retorne o número girado 180 graus (se possível). Se nenhum desses for o caso, retorne -1.

Aqui está a lista completa de entradas e saídas que seu programa precisa gerenciar:

Input   Output
0       0
1       -1
2       5
3       -1
4       -1
5       2
6       9
7       -1
8       8
9       6

Como um desafio de , o código mais curto vence!


17
Eu discordo com o seu último ponto - a 1 em um display de 7 segmentos simplesmente ser virado para o outro lado, assim que um deve NAP para 1.
Jwosty

29
Estou confuso sobre como virar cada dígito. Se torna-se 2 5, em seguida, 6 deve tornar-se para trás 9, não 9. Mas se 6 torna-se 9, então o flip é apenas uma rotação, para que 2 torna-se mais 2, não 5.
kernigh

6
6, 9 giraram 180 graus, 2, 5 giraram horizontalmente e 1, 3 são de fato reflexos de si mesmos através do eixo vertical.
jimmy23013

22
As traduções definidas na pergunta não são consistentes. Por que 2 e 5 invertem, mas 3 não?
Rynant

4
Percebi um fato curioso sobre os números comutáveis: eles formam padrões binários opostos, ou seja, 2 = 010, 5 = 101. 6 = 0110, 9 = 1001. Alguém pode usar esse fato em sua solução?
Jack Aidley

Respostas:


32

Haskell - 43 31

43 caracteres sem nada extravagante.

f 0=0
f 8=8
f 2=5
f 5=2
f 6=9
f 9=6
f _= -1

Reduziu para 31 caracteres, tornando-a uma função parcial.

f=([0,-1,5,-1,-1,2,9,-1,8,6]!!)

4
Eu ri. Tenha um +1.
seequ

6
+1 Para usar o Haskell para fazer exatamente o que a especificação. diz!
recursion.ninja

1
Eu não acho que você precisa f=para a segunda solução, pois é uma expressão válida
Cyoce

23

GolfScript, 15 14

Li as especificações novamente e descobri que a entrada deve ser uma string.

"0.5..29.86"\?

Para correr:

echo -n 2 | ruby golfscript.rb a.gs

Versão antiga (que possui entrada inteira):

[0.5..2 9.8 6]?

O mais recente (14 bytes) é um pouco inspirado na resposta do CJam pelo aditsu .


1
Não posso acreditar que eu não tinha pensado nisso ...
Dennis


14

Python 2.x - 28

'015..29.86'.find(`input()`)

2
Python 2.x, especificamente.
seequ

6
Com o Python 3, você pode remover os `e salvar 2 caracteres.
Rynant


8

CJam, 20 bytes

q25691347`"5296W"er~

Experimente online.

Resultado

$ for i in {0..9}; { cjam <(echo 'q25691347`"5296W"er~') <<< $i; echo; }
0
-1
5
-1
-1
2
9
-1
8
6

Como funciona

q          " Read from STDIN. The leaves a string on the stack.            ";
25691347`  " Push the string '25691347'.                                   ";
"5296W"    " Push the string '5296W'.                                      ";
er         " Perform character transliteration.                            ";
~          " Evaluate the result. Examples: '2' returns 2, 'W' returns -1. ";

8

BEFUNGE 93 - 18 14 20 Bytes

Eu acho que os comentaristas estão certos, apesar de o Befunge ser uma linguagem em 2D, é um pouco diferente. Ainda assim, neste instante, os comentaristas estão certos.

&1g01g-.  
! &  #* )'

Passos:

&

Lê a entrada como um valor numérico x e a pressiona na pilha.

1g

Obtém o valor do caractere c (então, como '!' = 33 ou '*' = 42. Uma célula vazia = 32) na posição x, 1.

01g-.

Lê o valor de caractere da célula 0,1 (33), subtrai-o de c e o gera como um valor numérico.


2
Até legal. Tenha um +1.
seequ

Corrija o comprimento: 20 bytes
har-wradim

1
Você realmente está contando seus bytes errados. Você usou 19 bytes. Contamos novas linhas e espaços. Mas se você mudar para o Befunge 98, poderá salvar um; altere a primeira linha para:&1g'!-.
Justin

8

Java - 49

long f(int a){return(0x790a300601L>>(a*4)&15)-1;}

Aqui 0x790a300601está um valor recheado com as saídas desejadas, com uma adicionada para torná-las positivas. Os valores são armazenados em petiscos dentro do valor, portanto, é necessário um pouco de mudança e mascaramento para destacá-los.

Java - 100 (opção divertida)

int f(int a){Random r=new Random(0x2000A2F47D6Fl);int b=0;for(;a>=0;a--)b=r.nextInt(11)-1;
return b;}

Não é a menor opção, mas um pouco de diversão. Encontrei uma semente aleatória que produz os valores corretos quando chamada X vezes (onde 0> = X <= 9).


Esperto. Tenha +1
Cyoce

8

JavaScript (ECMAScript 6) 25

x=>'1060039097'[x]-(x!=6)

JavaScript (ECMAScript 5) 43

function f(x){return'1060039097'[x]-(x!=6)}

ATUALIZAÇÃO: edc65 sugeriu uma técnica muito melhor. A escova de dentes sugeriu uma linguagem muito melhor. Neste ponto, minhas principais contribuições são depuração e bom senso.


1
Se você alterá-lo para ECMAScript 6 (suportado no Firefox), você pode simplesmente fazê-lo x=>[0,-1,5,-1,-1,2,9,-1,8,6][x].
Escova de dentes

No começo, eu quase postei function(x)[0,-1,5,-1,-1,2,9,-1,8,6][x], também graças ao Firefox. Eu não ia ganhar de qualquer maneira, então decidi que continuaria com a resposta de maior compatibilidade. Se eu começar a mudar de idioma por brevidade, acabarei definindo meu próprio idioma para cada desafio que enfrentar. Mas eu vou em frente e mencionar a versão de ECMAScript 6 de qualquer forma, desde que você sugeriu que
Keen

1
Mesmo conceito, mas mais curto (bye bye vírgulas): x => '106003907' [x] - (x = 6!)
edc65

@ edc65 Sabe, eu queria usar uma string e havia deixado de lado o fato de poder coagir o resultado a um número. Um lapso bizarro. No entanto, eu ainda não teria inventado -(x!=6). Obrigado.
Keen


6

festança 29

tr 1-9 x5xx29x86|sed s/x/-1/g

por exemplo

$ echo 0 1 2 3 4 5 6 7 8 9 | tr 1-9 x5xx29x86|sed s/x/-1/g
0 -1 5 -1 -1 2 9 -1 8 6

Você pode omitir a 'expressão sed à volta. Também acho que você pode omitir o gporque a especificação que alimente um único dígito de cada vez
Digital Trauma

Obrigado. É apenas um exemplo, o envio em si não usa '. Gostando da gentrada mais longa!

4

Kona - 29

Esta função retorna o elemento xda matriz0 -1 5...

f:{0 -1 5 -1 -1 2 9 -1 8 6@x}

Exemplos:

> f 2
  5
> f 5
  2
> f 8
  8

Um vetor por si só é realmente permitido?
see

@ TheRare: Hmm, diz "algoritmo", então suponho que não. Eu vou mudá-lo e torná-lo mais parecido com o seu ...
Kyle Kanos

Parece melhor, tenha um +1.
seequ

4

JavaScript 36 37. 41.

alert('0x'+'65b558f5ec'[prompt()]-6)

como função ES6 - 27:

f=v=>'0x'+'65b558f5ec'[v]-6

2
28:f=v=>~-[1,,6,,,3,10,,9,7][v]
nderscore 17/06/2014

@nderscore Você adora melhorar os códigos das pessoas, não é?
seequ

3
@TheRare Estou apenas em uma busca para encontrar o menor código javascript. :) Se outra pessoa já postou uma boa resposta, faz mais sentido para mim encontrar otimizações nela do que postar uma nova resposta quase duplicada. Não estou aqui para competir, apenas para cooperar para alcançar esse objetivo.
Ndscore

@ndcorecore Tenho a mesma mentalidade, desde que minha idéia seja semelhante o suficiente. De qualquer forma, legal.
seequ

@nderscore Você realmente me deu uma motivação. Não tenho certeza se posso torná-lo mais curto, mas vou tentar :)
core1024

4

Sclipting, 11 caracteres

걄럣뉥밈결⓷方分결剩貶

Finalmente, encontrei um computador Windows com o Visual Studio instalado para criar seu intérprete. E derrotou meu código GolfScript facilmente.

18453063256\11\?/11%(no GolfScript.


2
Interessante, mas sua resposta no GolfScript ainda vence. A menos que a pergunta indique o contrário, o comprimento é medido em bytes.
Dennis

@ Dennis Esta foi a minha terceira ou quarta resposta neste site. Eu não sabia E eu acho que o APL é uma exceção.
precisa saber é o seguinte

@ Dennis E a maioria das pessoas não gosta de Sclipting. :)
jimmy23013

Não é realmente uma exceção, apenas deixamos as pessoas escolherem sua codificação. Esta resposta teria 22 bytes, já que esse é o seu tamanho usando UTF-16. O APL usa apenas 256 caracteres diferentes, e há uma página de código do APL em que o caractere uma vez tem exatamente um bytes.
Dennis

@ Dennis Ah, você está certo.
precisa saber é o seguinte

3

J - 28 27 bytes

Você sabe do que eu gosto? Simplicidade (28 bytes). Observe que em J, _1é negativo (-1).

f=:{&0 _1 5 _1 _1 2 9 _1 8 6

Adicione um pouco de complexidade e você terá 27 bytes.

f=:-{&0 2 _3 4 5 3 _3 8 0 3

Exemplo:

   f 2
5
   f 6
9
   f 5
2
...

3

CJam - 14

Versão de entrada / saída:

"0 5  29 86"q#

Versão da pilha (assume que o número está na pilha):

[0W5WWY9W8 6]=

Experimente-os em http://cjam.aditsu.net/


Não há artigo sobre o CJAM na Wikipedia, e o link vai para um violinista em branco. Onde você encontraria informações sobre o idioma e seus lançamentos estabelecidos?
Panzercrisis


@Panzercrisis O cjam.aditsu.net tem "CJam" vinculado à página do sourceforge
aditsu

3

Perl, 27 26

Contagem inclui a pbandeira

y/2569/5296/,s/[1347]/-1/

Uso:

$ echo 7 | perl -pe y/2569/5296/,s/[1347]/-1/
-1

Espere, Perl acabou de derrotar J? :)


+1 Eu ia postar y+0-9+9a4aa70a13+;$_=9-hex, que tem o mesmo comprimento, mas o seu é mais original;) ​​#
core1024 18/06/2012

1
@ core1024: E ele só ficou mais curto;)
Zaid

Ele não fez:echo 1 | perl -pe y/2569/5296/,s/[347]/-1/
core1024

@ core1024: Eu li mal as especificações, deve ser corrigido agora. Ainda é mais curto que a solução J.
Zaid

Realmente não há uma maneira concisa de fazer isso em J, pois os valores são estritamente digitados e os números não podem corresponder às strings.
see

3

Marbelous 34 bytes

}0
=6=9=2=5=0=8?0
+3-3+3-3....--

Não é a solução mais curta, mas também não é a mais longa.

Como funciona

}0gera um mármore representando a primeira entrada da linha de comando. Esse mármore desce o próximo carrapato para a =6célula. =6é uma célula de comparação, empurra qualquer mármore com valor 6 para baixo e todos os outros para a direita. Essa linha de células de comparação empurra os mármores para a direita até atingirem o valor desejado. 0 e 8 simplesmente caem e são impressos quando caem da parte inferior do quadro, 6 e 2 e 9 e 5 primeiro adicionam 3, subtraídos deles respectivamente. Se uma bola de gude não é igual a nenhum dos valores desejados, ele cair na ?0célula, o que transformar qualquer mármore em um 0 mármore 1 . Este mármore então é diminuído e cai do tabuleiro.

1 Um ?nmármore transforma tecnicamente qualquer mármore em mármore entre 0 e n. Isso tem o bom efeito colateral que ?0transforma qualquer coisa em 0.


2

MATLAB - 35

Gostaria de envolver isso em uma função com ncomo o único parâmetro.

f=[0,-1,5,-1,-1,2,9,-1,8,6];
f(n+1)

35 caracteres.


2

ECMAScript 6, 24

f=x=>~-++'0n5nn29n86'[x]

Usando JavaScript normal, seria 33:

alert(~-++'0n5nn29n86'[prompt()])

2

TI-BASIC, 24 22

-1+int(11fPart(11^Ans.0954191904

Isso codifica as saídas possíveis em uma tabela de pesquisa armazenada como um número de ponto flutuante de base 11; o (N + 1) é o décimo primeiro dígito da base 11 depois que o ponto decimal é extraído da tabela para obter o valor do dígito invertido. Na base 11, o número é .106003A097e os dígitos deste menos um são exatamente0,-1,5,-1,-1,2,9,-1,8,6 .

O truque do edc65 de subtrair um no caso de 6 leva a essa solução de 24 bytes, onde ⑩^(está um único token de um byte:

-(Ans≠6)+int(10fPart(.1060039097⑩^(Ans

A abordagem de cadeia é de 29 bytes:

-(Ans≠6)+expr(inString("1060039097",Ans+1,1

A abordagem de matriz (que Ypnpyn também adotou) é de 30 bytes, assumindo que o número seja armazenado em X:

{1,0,6,0,0,3,10,0,9,7}-1:Ans(X+1

24 -> 22: Removidos dois dígitos extras de precisão na constante mágica.


Isso quase certamente pode ser jogado para 19 e, possivelmente, para 18; no entanto, preciso procurar os números corretos.
lirtosiast

2

C - 47 bytes [48 bytes]

f(i){return(int[]){1,0,6,0,0,3,10,0,9,7}[i]-1;}

Para adicionar E / S (que outras respostas nem sempre) para 86 bytes:

main(i){i=(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1;i<0?puts("-1"):putchar(i+48);}

1
Uau, eu não tinha nenhuma pista literal literal de matriz como essa era uma coisa. Muito boa primeira resposta e bem-vindo ao PPCG! (Não há necessidade de adicionar I / O submissões de função são perfeitamente válidos .)
Martin Ender

1

Python - 34

f=lambda n:ord("A@F@@CJ@IG"[n])-65

1
33 f=lambda n:ord(" "[n])-3trabalhando com o espaço codeskulptor.org/#user34_Q7NbNvQy55_0.py #
Dylan Madisetti

Você pode querer explicar como e por que isso funciona
Motim

Usando a tabela ascii asciitable.com, os espaços em branco escolhidos são imprimíveis em python. ele realmente se parece com &#002;&#002;&#008;&#002;&#002;&#005;&#012;&#002;&#011;&#009;Ele de menos 3 a razão para que -1 folhas um caractere nulo que não é bom, e menos 2 folhas de um avanço de linha que é reservado em python
Dylan Madisetti

1

Java, 58 59

int f(int i){int[]a={1,0,6,0,0,3,10,0,9,7};return a[i]-1;}

OU

int f(int i){return new int[]{1,0,6,0,0,3,10,0,9,7}[i]-1;}

Você pode fazer seu código um pouco mais curto, se você adicionar 1 para cada valor em array e depois [i] substrato 1.
barteks2x

@ Barteks2x Bom ponto; obrigado #
11168 Ypnypn

1

JavaScript 42 37

Execute-o no console do seu navegador

alert(~-[1,,6,,,3,10,,9,7][prompt()])

1

C - 117 108 106 77 76 bytes

a[]={1,0,6,0,0,3,10,0,9,7};main(int c,char**b){printf("%d",a[*b[1]-48]-1);}

Não é o melhor idioma para jogar golfe, mas tudo bem ...
Compile com gcc progname.c -o progname. (Ignore os avisos ou adicione -include stdio.hao comando compilar.)

Uso: ./progname <número>

EDITAR

Conforme a sugestão de @ bebe, aqui está um exemplo que usa a entrada de STDIN:

C - 68 51 bytes

main(){printf("%d","106003:097"[getchar()-48]-49);}

usando d=*b[1]-48poderia ser uma boa ideia
bebe

@bebe Ah sim, obrigado!
BenjiWiebe

1
main(){printf("%d",(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1);}desculpe por incomodá-lo muito, mas acho isso um pouco mais curto.
bebe

Você pode salvar outro personagem tornando a matriz global para não precisar do elenco. a[]={1,0,6,0,0,3,10,0,9,7};main(){printf("%d",a[getchar()-48]-1);}
Allbeert

2
main(){printf("%d","106003:097"[getchar()-48]-49);}51 bytes
bebe

1

J (24, função)

(o painel de entrada não está funcionando bem. Cole o seguinte em um intérprete python e minha resposta será revelada :)

print "f=:{&(_3+3 u:'^C^B^B^E^L^B^K\t')"


1

05AB1E , 13 bytes (não concorrente)

0®5®®Y9®8 6¹@

Experimente online!

-3 graças a Emigna .

Explicação:

0®5®®Y9®8 6¹@ Takes an integer from STDIN.
0®5®®Y9®8 6   Push 0, r=-1, 5, r=-1, r=-1, Y=2, 9, r=-1, 8, 6.
           ¹  Push first input item.
            @ Pop and push the 0-indexed stack item at the respective index.

0®5®®Y9®8 6¹@deve funcionar também.
Emigna

@ Emigna eu não tinha ideia, obrigado!
Erik the Outgolfer

Bom pensamento com @. Nem sempre você vê que utilizou :)
Emigna

@ Emigna Um byte menor que )¹èou )sè.
Erik the Outgolfer 31/03


1

Gelatina , 14 bytes (não concorrente)

ị“-5--29-860”V

Experimente online!

Explicação:

ị“-5--29-860”V Takes argument as an integer.
 “-5--29-860”  "-5--29-860" (1-indexed string).
ị              Return the xth char of the string above (y) (x=argument).
             V Eval. - is the same as -1.

ịV = žh‡em 05AB1E
Magic Octopus Urn
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.