Renvoyer la version retournée d'un nombre

18

Lorsqu'un nombre est affiché sur une calculatrice, il est possible de considérer à quoi ressembleraient les différentes transformations de ce nombre. Par exemple, sur un affichage à sept segments, 2 s'affiche comme suit:

entrez la description de l'image ici

Et lorsqu'il est retourné horizontalement, il ressemble à ceci:

entrez la description de l'image ici

En tant que tel, l'image miroir de 2 est 5.

La tâche dans ce défi est de prendre un nombre à un chiffre et de renvoyer le numéro qui est son image miroir (si possible). Si son image miroir ne ressemble pas à un nombre, renvoyez le nombre pivoté de 180 degrés (si possible). Si aucun de ces éléments n'est le cas, retournez -1.

Voici la liste complète des entrées et sorties que votre programme doit gérer:

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

En tant que défi de , le code le plus court gagne!

James Williams
la source
17
Je ne suis pas d'accord avec votre dernier point - un 1 sur un affichage à 7 segments serait simplement retourné de l'autre côté, donc 1 devrait faire une sieste à 1.
Jwosty
29
Je ne sais pas trop comment inverser chaque chiffre. Si 2 devient 5, alors 6 devrait devenir en arrière 9, pas 9. Mais si 6 devient 9, alors le flip est juste une rotation, donc 2 devient un autre 2, pas 5.
kernigh
6
6, 9 tourné à 180 degrés, 2, 5 retourné horizontalement, et 1, 3 sont en fait des réflexions d'eux-mêmes sur l'axe vertical.
jimmy23013
22
Les traductions définies dans la question ne sont pas du tout cohérentes. Pourquoi 2 et 5 retournent-ils, mais pas 3?
Rynant
4
J'ai remarqué un fait curieux au sujet des nombres commutables: ils forment des motifs binaires opposés, c'est-à-dire 2 = 010, 5 = 101. 6 = 0110, 9 = 1001. Quelqu'un peut-il utiliser ce fait dans sa solution?
Jack Aidley

Réponses:

32

Haskell - 43 31

43 personnages sans rien d'extraordinaire.

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

Je l'ai réduit à 31 caractères en en faisant une fonction partielle.

f=([0,-1,5,-1,-1,2,9,-1,8,6]!!)
Taylor Fausak
la source
4
J'ai ri. Avoir un +1.
seequ
6
+1 Pour utiliser Haskell pour faire exactement ce que la spécification. dit!
recursion.ninja
1
Je ne pense pas que vous ayez besoin f=de la deuxième solution car c'est une expression valide
Cyoce
23

GolfScript, 15 14

J'ai relu la spécification et j'ai constaté que l'entrée devait être une chaîne.

"0.5..29.86"\?

Courir:

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

Ancienne version (qui a une entrée entière):

[0.5..2 9.8 6]?

Le plus récent (14 octets) est quelque peu inspiré par la réponse CJam d'Aditsu .

jimmy23013
la source
1
Je ne peux pas croire que je n'y ai pas pensé ...
Dennis
19

PowerShell - 27

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

Python 2.x - 28

'015..29.86'.find(`input()`)
Willem
la source
2
Python 2.x, en particulier.
seequ
6
Avec Python 3, vous pouvez supprimer les `s et enregistrer 2 caractères.
Rynant
11

JavaScript 37 36

alert("0_5__29_86".search(prompt()))
DarkAjax
la source
utiliser .search()et enregistrer un octet.
Ismael Miguel
@IsmaelMiguel Nice one, Thanks!
DarkAjax
8

CJam, 20 octets

q25691347`"5296W"er~

Essayez-le en ligne.

Production

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

Comment ça fonctionne

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
la source
8

BEFUNGE 93 - 18 14 20 octets

Je suppose que les commentateurs ont raison, bien que Befunge soit un langage 2d, c'est un peu différent. Pourtant, à cet instant, les commentateurs ont raison.

&1g01g-.  
! &  #* )'

Pas:

&

Lit l'entrée sous la forme d'une valeur numérique x et la pousse sur la pile.

1g

Obtient la valeur de caractère c (donc, comme '!' = 33, ou '*' = 42. Une cellule vide = 32) à la position x, 1.

01g-.

Lit la valeur de caractère de la cellule 0,1 (33), la soustrait de c et la renvoie sous forme de valeur numérique.

AndoDaan
la source
2
Assez agréable. Avoir un +1.
seequ
Veuillez corriger la longueur: elle est de 20 octets
har-wradim
1
En fait, vous avez mal compté vos octets. Vous avez utilisé 19 octets. Nous comptons les nouvelles lignes et les espaces. Mais si vous passez à Befunge 98, vous pouvez en enregistrer un; changer la 1ère ligne en:&1g'!-.
Justin
8

Java - 49

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

Ici, 0x790a300601est une valeur bourrée des sorties souhaitées, avec une valeur ajoutée pour les rendre positives. Les valeurs sont stockées dans des quartets à l'intérieur de la valeur, donc un peu de décalage et de masquage est nécessaire pour les faire apparaître.

Java - 100 (option amusante)

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

Pas la plus petite option, mais un peu de plaisir. J'ai trouvé une graine aléatoire qui produit les valeurs correctes lorsqu'elle est appelée X fois (où 0> = X <= 9).

Duncan Jones
la source
Intelligent. Avoir un +1
Cyoce
8

JavaScript (ECMAScript 6) 25

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

JavaScript (ECMAScript 5) 43

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

MISE À JOUR: edc65 a suggéré une bien meilleure technique. brosse à dents a suggéré une bien meilleure langue. À ce stade, mes principales contributions sont le débogage et la gomination.

Enthousiaste
la source
1
Si vous le changez en ECMAScript 6 (pris en charge dans Firefox), vous pouvez simplement le faire x=>[0,-1,5,-1,-1,2,9,-1,8,6][x].
Brosse à dents
Au début, j'ai failli poster function(x)[0,-1,5,-1,-1,2,9,-1,8,6][x], également grâce à Firefox. Je n'allais pas gagner de toute façon, j'ai donc décidé de m'en tenir à la réponse la plus compatible. Si je commence à changer de langue par souci de concision, je finirai par commencer à définir ma propre langue pour chaque défi que je fais. Mais je vais quand même mentionner la version d'ECMAScript 6, puisque vous l'avez suggérée
Keen
1
Même concept mais plus court (virgules bye bye): x => '106003907' [x] - (x! = 6)
edc65
@ edc65 Vous savez, je voulais utiliser une chaîne et j'avais complètement effacé le fait que je pouvais contraindre le résultat à un nombre. Une erreur bizarre. Pourtant, je ne serais toujours pas venu avec -(x!=6). Je vous remercie.
Keen
6

bash 29

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

par exemple

$ 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

la source
Vous pouvez omettre l' 'expression autour de sed. Je pense aussi que vous pouvez omettre le gcar la spécification ne fournit qu'un chiffre à la fois
Digital Trauma
Merci. C'est juste dans l'exemple, la soumission elle-même n'utilise pas '. Aimer le gpour une entrée plus longue!
4

Kona - 29

Cette fonction renvoie l'élément xdu tableau0 -1 5...

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

Exemples:

> f 2
  5
> f 5
  2
> f 8
  8
Kyle Kanos
la source
Un vecteur en soi est-il vraiment autorisé?
seequ
@TheRare: Hmm, il dit "algorithme" donc je suppose que non. Je vais le changer et le rendre plus semblable au vôtre ...
Kyle Kanos
Semble mieux, avoir un +1.
seequ
4

JavaScript 36 37 41

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

comme fonction ES6 - 27:

f=v=>'0x'+'65b558f5ec'[v]-6
core1024
la source
2
28:f=v=>~-[1,,6,,,3,10,,9,7][v]
nderscore
@nderscore Vous adorez simplement améliorer les codes des gens, n'est-ce pas?
seequ
3
@TheRare Je suis juste en quête pour trouver le code javascript le plus court. :) Si quelqu'un d'autre a déjà publié une bonne réponse, il est plus logique pour moi d'y trouver des optimisations plutôt que de poster une nouvelle réponse qui est presque un doublon. Je ne suis pas ici pour concourir, juste pour coopérer à la réalisation de cet objectif.
nderscore
@nderscore J'ai la même mentalité tant que mon idée est assez similaire. Quoi qu'il en soit, gentil.
seequ
@nderscore Vous m'avez vraiment donné une motivation. Je ne sais pas si je peux le raccourcir, mais je vais essayer :)
core1024
4

Sclipting, 11 caractères

걄럣뉥밈결⓷方分결剩貶

Enfin, j'ai trouvé un ordinateur Windows avec Visual Studio installé pour construire son interpréteur. Et il a facilement battu mon code GolfScript.

Il lit 18453063256\11\?/11%(en GolfScript.

jimmy23013
la source
2
Intéressant, mais votre réponse GolfScript gagne toujours. Sauf indication contraire, la longueur est mesurée en octets.
Dennis
@Dennis C'était ma 3ème ou 4ème réponse sur ce site. Je ne savais pas. Et je pense qu'APL est une exception.
jimmy23013
@Dennis Et la plupart des gens n'aiment pas Sclipting. :)
jimmy23013
Pas vraiment une exception, nous laissons juste les gens choisir leur encodage. Cette réponse marquerait 22 octets, car c'est sa taille en utilisant UTF-16. APL utilise seulement 256 caractères différents, et il y a une page de codes APL où une fois le caractère fait exactement un octet.
Dennis
@Dennis Ah, vous avez raison.
jimmy23013
3

J - 28 27 octets

Tu sais ce que j'aime? Simplicité (28 octets). Notez que dans J, _1est négatif (-1).

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

Ajoutez un peu de complexité et vous avez 27 octets.

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

Exemple:

   f 2
5
   f 6
9
   f 5
2
...
seequ
la source
3

CJam - 14

Version entrée / sortie:

"0 5  29 86"q#

Version de la pile (suppose que le numéro est sur la pile):

[0W5WWY9W8 6]=

Essayez-les sur http://cjam.aditsu.net/

aditsu
la source
Il n'y a pas d'article Wikipédia sur CJAM, et le lien va juste à un violoneux vide. Où trouveriez-vous des informations sur la langue et ses versions établies?
Panzercrisis
On dirait que c'est ça: sourceforge.net/projects/cjam
Panzercrisis
@Panzercrisis cjam.aditsu.net a "CJam" lié à la page sourceforge
aditsu
3

Perl, 27 26

Le nombre comprend le pdrapeau

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

Usage:

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

Attendez, Perl vient de battre J? :)

Zaid
la source
+1 J'allais publier y+0-9+9a4aa70a13+;$_=9-hex, qui est de la même longueur, mais le vôtre est plus original;)
core1024
1
@ core1024: Et c'est devenu plus court;)
Zaid
Il n'a pas:echo 1 | perl -pe y/2569/5296/,s/[347]/-1/
core1024
@ core1024: J'ai mal lu les spécifications, devrait être corrigé maintenant. C'est toujours plus court que la solution J.
Zaid
Il n'y a vraiment aucun moyen concis de le faire en J, car les valeurs sont strictement typées et les nombres ne peuvent pas correspondre aux chaînes.
seequ
3

Marbelous 34 octets

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

Ce n'est pas la solution la plus courte, mais ce n'est pas la plus longue non plus.

Comment ça fonctionne

}0génère une bille représentant la première entrée de ligne de commande. Ce marbre descend la tique suivante, sur la =6cellule. =6est une cellule de comparaison, elle pousse toute bille de valeur 6 vers le bas et toutes les autres vers la droite. Cette gamme de cellules de comparaison pousse les billes vers la droite jusqu'à ce qu'elles égalent la valeur souhaitée. 0 et 8 tombent et s'impriment quand ils tombent du bas de la planche, 6 et 2, et 9 et 5 obtiennent d'abord 3 ajoutés à eux, soustraits d'eux respectivement. Si une bille ne correspond à aucune des valeurs souhaitées, elle atterrit sur la ?0cellule, ce qui transforme n'importe quelle bille en 0 bille 1 . Ce marbre est ensuite décrémenté et tombe du plateau.

1 Une ?nbille transforme techniquement n'importe quelle bille en bille entre 0 et n. Cela a le bel effet secondaire qui ?0transforme n'importe quoi en 0.

suracteur
la source
2

MATLAB - 35

Je voudrais envelopper cela dans une fonction avec ncomme seul paramètre.

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

35 caractères.

lukass
la source
2

ECMAScript 6, 24

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

En utilisant JavaScript normal, ce serait 33:

alert(~-++'0n5nn29n86'[prompt()])
ShadowCat7
la source
2

TI-BASIC, 24 22

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

Cela code les sorties possibles dans une table de recherche stockée sous la forme d'un nombre à virgule flottante en base 11; le (N + 1) ème chiffre de base 11 après le point décimal est extrait du tableau pour obtenir la valeur du chiffre inversé. Dans la base 11, le nombre est .106003A097, et les chiffres de celui-ci sont exactement 0,-1,5,-1,-1,2,9,-1,8,6.

L'astuce d'edc65 de soustraire un dans le cas de 6 conduit à cette solution de 24 octets, où ⑩^( trouve un seul jeton d'un octet:

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

L'approche chaîne est de 29 octets:

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

L'approche par tableau (qu'Ypnpyn a également adoptée) est de 30 octets, en supposant que le nombre est stocké dans X:

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

24 -> 22: Suppression de deux chiffres supplémentaires de précision dans la constante magique.

lirtosiast
la source
Cela peut presque certainement être joué à 19, et peut-être à 18; cependant, je dois rechercher les bons numéros.
lirtosiast
2

C - 47 octets [au lieu de 48 octets]

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

Pour ajouter des E / S (que les autres réponses n'ont pas toujours) pour 86 octets:

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
la source
1
Wow, je n'avais aucune idée des littéraux de tableau en ligne comme celui-ci était une chose. Très belle première réponse, et bienvenue chez PPCG! (Il n'est pas nécessaire d'ajouter des soumissions de fonctions d' E / S sont parfaitement valides .)
Martin Ender
1

Python - 34

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

la source
1
33 f=lambda n:ord(" "[n])-3Travailler avec Space Codeskulptor.org/#user34_Q7NbNvQy55_0.py
Dylan Madisetti
Vous voudrez peut-être expliquer comment et pourquoi cela fonctionne
Riot
En utilisant la table ascii asciitable.com, les espaces blancs choisis sont imprimables en python. cela ressemble en fait à &#002;&#002;&#008;&#002;&#002;&#005;&#012;&#002;&#011;&#009;moins 3 pour la raison que -1 laisse un caractère nul qui n'est pas bon, et moins 2 laisse un
saut de
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
la source
Vous pouvez rendre votre code un peu plus court si vous ajoutez 1 à chaque valeur du tableau et après [i] soustraire 1.
barteks2x
@ Barteks2x Bon point; merci
Ypnypn
1

JavaScript 42 37

Exécutez-le sur la console de votre navigateur

alert(~-[1,,6,,,3,10,,9,7][prompt()])
William Barbosa
la source
1

C - 117 108 106 106 77 76 octets

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

Pas la meilleure langue pour jouer au golf, mais bon ...
Compilez avec gcc progname.c -o progname. (Ignorez les avertissements ou ajoutez-include stdio.h à la commande de compilation.)

Utilisation: ./progname <numéro>

ÉDITER

Selon la suggestion de @ bebe, voici un exemple qui prend à la place l'entrée de STDIN:

C - 68 51 octets

main(){printf("%d","106003:097"[getchar()-48]-49);}
BenjiWiebe
la source
l'utilisation d=*b[1]-48pourrait être une bonne idée
bebe
@bebe Ah oui, merci!
BenjiWiebe
1
main(){printf("%d",(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1);}désolé de vous déranger autant mais je trouve cela un peu plus court.
bebe
Vous pouvez enregistrer un autre personnage en rendant le tableau global afin que vous n'ayez pas besoin de la distribution. 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 octets
bebe
1

J (24, fonction)

(le panneau de saisie ne joue pas bien. Collez ce qui suit dans un interpréteur python et ma réponse sera révélée :)

print "f=:{&(_3+3 u:'^C^B^B^E^L^B^K\t')"
ɐɔıʇǝɥʇuʎs
la source
1

Clojure - 36

#(case % 2 5 5 2 6 9 9 6 0 0 8 8 -1)
coredump
la source
1

05AB1E , 13 octets (non concurrents)

0®5®®Y9®8 6¹@

Essayez-le en ligne!

-3 merci à Emigna .

Explication:

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 le Outgolfer
la source
0®5®®Y9®8 6¹@devrait également fonctionner.
Emigna
@Emigna Je n'en avais aucune idée, merci!
Erik the Outgolfer
Bonne réflexion avec @. Pas souvent, vous voyez que utilisé :)
Emigna
@Emigna Un octet plus court que )¹èou )sè.
Erik the Outgolfer
1

Jelly, 14 bytes (non-competing)

ị“-5--29-860”V

Try it online!

Explanation:

ị“-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 the Outgolfer
la source
ịV = žh‡ in 05AB1E
Magic Octopus Urn