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!

James Williams
fonte
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]!!)
Taylor Fausak
fonte
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 .

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

PowerShell - 27

'0 5  29 86'.indexof($args)
Rynant
fonte
14

Python 2.x - 28

'015..29.86'.find(`input()`)
Willem
fonte
2
Python 2.x, especificamente.
seequ
6
Com o Python 3, você pode remover os `e salvar 2 caracteres.
Rynant
11

JavaScript 37 36

alert("0_5__29_86".search(prompt()))
DarkAjax
fonte
use .search()e salve um byte.
Ismael Miguel
@IsmaelMiguel Nice one, Thanks!
DarkAjax
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. ";
Dennis
fonte
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.

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

Duncan Jones
fonte
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.

Keen
fonte
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

fonte
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
Kyle Kanos
fonte
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
core1024
fonte
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.

jimmy23013
fonte
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
...
seequ
fonte
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/

aditsu
fonte
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
Parece que este é: sourceforge.net/projects/cjam
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? :)

Zaid
fonte
+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.

overactor
fonte
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.

lukass
fonte
2

ECMAScript 6, 24

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

Usando JavaScript normal, seria 33:

alert(~-++'0n5nn29n86'[prompt()])
ShadowCat7
fonte
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.

lirtosiast
fonte
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);}
NoSeatbelts
fonte
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

fonte
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;}
Ypnypn
fonte
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()])
William Barbosa
fonte
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);}
BenjiWiebe
fonte
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')"
ɐɔıʇǝɥʇuʎs
fonte
1

Clojure - 36

#(case % 2 5 5 2 6 9 9 6 0 0 8 8 -1)
coredump
fonte
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.
Erik, o Outgolfer
fonte
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.
Erik, o Outgolfer
fonte
ịV = žh‡em 05AB1E
Magic Octopus Urn