Étant donné une serrure à combinaison standard comme celle de l'image. Le moyen de le déverrouiller consiste à aligner les 4 chiffres du code sur la ligne de combinaison. Après des années de bons et loyaux services, vous avez été licencié de la fabrique de serrures et vous avez décidé de vous venger en ne mélangeant pas les serrures avant de les envoyer, laissant ainsi chaque serrure avec la combinaison pour la déverrouiller sur la ligne de combinaison.
Vous savez également qu'en regardant l'ordre des numéros dans les autres lignes, il est possible de déterminer quels numéros doivent être sur la ligne de combinaison (et donc la combinaison pour la déverrouiller).
Si chaque ligne de la serrure reçoit un numéro à partir de la ligne 0 pour la ligne de combinaison (la ligne qui déverrouille la serrure) à la ligne 9. Par exemple, si les numéros de la ligne 4 le sont 5336
, alors la combinaison pour la déverrouiller serait 1992
.
Malheureusement, les serrures ont déjà été emballées et votre vue de chaque serrure est obscurcie, vous ne pouvez donc voir que les numéros sur différentes lignes de la serrure.
Le défi
Étant donné 4 paires de chiffres, où le premier chiffre de l'entier représente le numéro de ligne et le deuxième chiffre représente le numéro qui apparaît sur cette ligne, déterminez la combinaison du verrou. Par exemple, si vous saisissez:
57 23 99 45
Ensuite, il devrait sortir:
2101
Ou
25 78 63 15
et
3174
Supposons que l'entrée sera toujours 4 entiers positifs sous la forme `25 64 72 18.
Il s'agit de code-golf , donc les programmes les plus courts en nombre d'octets gagnent.
C'est aussi ma première question, donc tout commentaire est apprécié.
57 23 99 45
. Ce n'est pas quatre paires d'entiers: c'est quatre entiers. Et certaines réponses supposent qu'elles obtiennent cela sous forme de chaîne, tandis que d'autres supposent qu'elle est prête à être analysée en 4 pouces.0
s principaux ).Réponses:
CJam,
98 octetsLit les paires de chiffres comme arguments de ligne de commande. Pour essayer le code en ligne , passez
ea
àlS/
pour lire à partir de STDIN simulé.Exemple d'exécution
Comment ça marche
Le code de caractère du chiffre d est 48 + d . Ainsi, en considérant la chaîne à deux chiffres xy, un nombre de base 9 donne 9 * (48 + x) + (48 + y) = 10 * (48 + x) + y - x ≡ y - x (mod 10) .
la source
"99"
est en fait interprétée comme le tableau[57 57]
parb
;"xy"9b
est implémenté en tant que9 * ord(x) + ord(y)
. Je devrais ajouter cela à ma réponse.CJam,
131211 caractèresGrâce à user23013, il est maintenant réduit à 11 caractères :)
Explications:
Essayez-le en ligne
Je sais qu'on peut jouer au golf plus. Mais c'est ma première vraie tentative sur CJam et je suis limité par l'expérience :)
Alternativement, les autres méthodes pour faire la même chose avec 1 caractère supplémentaire:
ou
ou
la source
l~]
. J'ai l'impression que l'analyse de l'entrée devrait être possible avec moins de trois, mais je n'ai jamais utilisé CJam auparavant: /4{ri_A/-A%}*
est un octet plus court.4{Ar:--A%}*
.Golfscript (14
13)Essayez-le en ligne ici
C'est à peu près la même chose que la solution d'Optimizer , mais dans une langue différente. Il est difficile de l'aborder différemment car le problème est assez simple
, donc la cravate va certainement à l'Optimizer, dont l'entrée était plus tôt de toute façon.Pour le même nombre d'octets que vous pouvez faire
la source
- 10
.GNU dc , 14 octets
Emprunter le truc astucieux de base 9 de Dennis :
Entiers d'entrée lus depuis STDIN, un par ligne.
Explication:
Sortie:
Réponse précédente, 18 octets:
Parce que je pensais que je pourrais me rapprocher des langues "golf" avec ça (mais je ne l'ai pas fait):
la source
9i[?A%nd]dxxxx
C
646356 ou 61Si l'entrée peut être envoyée depuis un fichier
Si l'entrée doit être tapée en stdin
Lit les quatre nombres dans une boucle puis traite chacun en soustrayant le premier chiffre de la valeur et en imprimant le résultat modulo 10.
Économies grâce aux divers commentaires ci-dessous et en utilisant également putchar au lieu de printf
la source
scanf
extérieurfor()
comme cecia,i;main(){for(;i++-4;printf("%d",(a-a/10)%10))scanf("%d",&a);}
a*.9
au lieu dea-a/10
while
boucle et en déclaranta
comme argumentmain
:main(a){while(scanf("%d",&a)>0)printf("%d",(a-a/10)%10);}
Python 3, 64
Simple.
Il peut être plus court si je suis autorisé à imprimer, disons à la
[2, 1, 0, 1]
place ( 46 ):la source
str((i-i//10)%10)
directement au lieu d'en utiliser une secondemap()
. J'ai aussi commencé avec des générateurs pour le mien, mais j'ai constaté qu'unefor
boucle réelle était finalement plus courte.print(''.join((i-i//10)%10for i in map(int,input().split())))
. De plus , si les espaces sont dans la sortie provoque bien vous pouvez éviterjoin
et déballage tuple utilisation:print(*((i-i//10)%10for i in map(int,input().split())))
.C, 92
Entrée depuis la ligne de commande. Soustrait le premier code ASCII de chaque argument du second, ajoute 10 et prend modulo 10.
Je pense que c'est la première fois que j'écris un
printf
avec quatre%
s et sans virgule (la virgule est dans le#define.
)la source
#define f scanf("%c%c ",&a,&b);putchar(48+(9*a+b)%10)
suivia,b;main(){f;f;f;f;}
serait de 18 octets plus court.scanf
est nécessaire, étant donné qu'ilscanf
est censé analyser les espaces blancs uniquement comme séparateur. Alchymist a une idée encore meilleure en C. Mais il semble que vous l'ayez déjà gagnée avec votre réponse Cjam.a(n)
pouvait être omis, puis j'ai remarqué que mettreprintf("%d%,...)
autour de votre macro économiserait quelques octets et finalement je me suis un peu emporté ... - L'espace est nécessaire car%c
lit un caractère, n'importe quel caractère, donc lors de la deuxième exécution, il stockerait 32 poucesa
. - Battre CJam avec C devrait s'avérer difficile.printf()
est déjà aussi longue que ma réponse ...Java - 203 octets
Juste parce qu'il doit y avoir une entrée Java, j'ai vu une belle opportunité de donner une chance au golf (première soumission jamais).
S'il y a de la place pour quelques améliorations, je serais heureux de les connaître ;-)
la source
Lua - 46 personnages
Lit trois caractères à la fois (accordez-moi la petite pitié de saisir un espace à la fin), et même si a et b sont string-y ... ba MAGICALEMENT leur permet de concevoir un bébé entier sain. Est-ce que le retour à la ligne est vérifié lors de l'impression.
la source
JavaScript ES6 -
5343 octetsFonction assez simple, utilise l'expression régulière pour obtenir les chiffres. Essayez-le sur http://jsfiddle.net/efc93986/1/ . Si les fonctions ne sont pas autorisées, un programme autonome à 52 octets:
Comme ES6 ne fonctionne actuellement que sur Firefox, le code suivant fonctionne sur n'importe quel navigateur moderne, à 70 octets:
la source
1+
....?
place de/\d+ ?
. L'espace après le retour peut être omis. De plus, étant donné qu'aucune E / S spécifique n'a été spécifiée, vous devriez pouvoir utiliser une fonction.a-a[0]
au lieu de1+a[1]-a[0]
devrait également fonctionner.Python 2 - 33 octets
Accepte les entrées utilisateur séparées par des virgules. Par exemple, entrée:
Sortie:
Si la sortie doit correspondre exactement à l'exemple, elle est beaucoup plus longue. 47 octets:
la source
input()
ne fonctionne pas dans mon interpréteur Python 2.APL, 14
L'explication
⎕
prend l'entrée de l'écran. Les valeurs séparées par des espaces sont analysées sous forme de tableau.{...}¨
pour chaque numéro, introduisez-le dans la fonction.⍎¨⍕⍵
prend l'argument, créez un tableau de ses chiffres.--/
calcule les unités moins les dizaines.10|
mod 10.la source
J -
2015La forme non verbale (comme instruction au lieu de la définition de la fonction) est 5 caractères plus courte:
La forme verbale qui est un joli train :
Ce verbe utilisé sur les exemples d'entrées:
la source
Haskell
6058Chiffres à un seul caractère, un véritable ennemi du golf à Haskell.
la source
Perl:
3840Sortie:
la source
abs
n'est pas nécessaire;x - x/10
ne peut pas être négatif. 3. Si vous utilisez les indicateurs-040pe
(généralement comptés comme 5 octets) pour parcourir les entrées délimitées par un espace, vous pouvez raccourcir votre code en$_=($_-int$_/10)%10
. 4. Si vous préférez éviter les indicateurs de ligne de commande, vous pouvez toujours enregistrer quelques octets en définissant$/=$;
et en supprimant l'appel àsplit
.Rubis, 35 octets
Explication
L'entrée est prise comme argument de ligne de commande.
String#bytes
renvoie un tableau d'entiers (codes de caractères ASCII). Seule la différence entre le dernier et le premier code de caractère est importante, pas les entiers eux-mêmes.la source
C # et LinqPad: 104
la source
C ++ 118
la source
#include<iostream>
etstd::
avantcin
etcout
. 2. Vous n'avez pas besoin du conditionnel si vous ometteza=a%10
. 3. Vous n'avez pas besoin des variablesb
etc
des sauts de ligne et (avec quelques modifications) des crochets autour de la boucle for.#include<iostream>
etusing namespace std;
PHP - 90 caractères
Je pensais que j'essaierais le golf de code alors voici, ma première tentative - peut probablement être joué plus.
58 personnages (gracieuseté d'Ismael Miguel)
Accéder au fichier à l'aide
la source
<? for($i=0;$i<4;)echo abs($_GET[n][$i]%10);
qui fait 44 caractères. Accès à partir d'un navigateur à l'aide defile.php?n[]=xx&n[]=yy&n[]=xy&n[]=yx
. (code non testé)$_GET
mais il affiche 57% 10 et j'ai besoin de (5-7)% 10<? for($i=0,$a=$_GET[n];$i<4;++$i)echo abs($a[$i][0]-$a[$i++][1]%10);
. Malheureusement, il fait 65 octets de long. (oublié l'$i
incrémentation sur le dernier) Ou vous pouvez essayer d'<? for($i=0;$i<8;)echo abs($_GET[n][$i++]-$_GET[n][$i++]%10);
accéder au navigateur en utilisantfile.php?n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y
61 octets de long.$_GET['n']
. J'ai édité ma réponse.<? for($i=0,$a=$_GET[n];$i<8;)echo abs($a[$i++]-$a[$i++]);
. Le%10
est inutile et celui-ci est tout simplement meilleur. Vous pouvez également y accéder à l'aide defile.php?n[]=xyxyxyxy
. Cette solution fait 58 octets.Python 3, 60
Entrer et sortir exactement comme spécifié, bien qu'il n'imprime pas de nouvelle ligne de fin. Deux astuces intéressantes ici: 1) remplacer deux appels à
int()
un appel àeval()
, et 2) utiliserjoin()
pour obtenira-b
, puis l'annulerb-a
si nécessaire. Heureusement, l'opérateur modulo de Python donne des valeurs positives même si le premier argument est négatif!la source
eval('-'.join(x))
astuce est géniale.)