Dans les temps modernes , lorsque Charlie Chaplin rencontre un ordinateur, il est employé dans la cour de tri, comme validateur pour déterminer si les travailleurs trient correctement les articles. Les articles en question sont des paquets de billes. Les paquets avec un nombre impair de billes sont empilés dans le panier rouge et les paquets avec un nombre pair de billes sont empilés dans le panier bleu.
Charlie Chaplin est censé frapper le programme qui validerait s'il y a une anomalie dans la procédure de tri. Mack Swain, son patron immédiat, partage un algorithme dont il a besoin pour coder.
Algorithme
L = List of Marble packets that's already sorted
L_ODD = List of packets with Odd Number of Marbles
L_EVEN = List of packets with Even Number of Marbles
Check_Digit = √(ΣL_ODD² + ΣL_EVEN²)
Son travail consiste à déterminer le Check_Digit et à le faire correspondre avec la valeur jamais calculée par son patron.
Charlie Chaplin pendant ses heures de déjeuner, a pu se faufiler dans le tiroir de Mack Swain et déterminer que son tiroir avait une seule carte avec des poinçons sur les 46 32 premières colonnes (ce qui signifie que Mack était capable d'écrire un programme avec seulement 46 32 caractères).
Charlie Chaplin aurait maintenant besoin de l'aide de tous les ninjas de code pour écrire un programme avec le moins de lignes possible. Il annonce également un bonus de 50 points, si quelqu'un peut proposer un programme plus court que son Boss.
Sommaire
Étant donné une liste / un tableau / un vecteur de nombres positifs (pairs et impairs), vous devez écrire une fonction, qui accepterait la array(int [])/vector<int>/list
et calculerait la racine de la somme des carrés des sommes des nombres pairs et impairs dans la liste.
La taille du programme est la taille du corps de la fonction, c'est-à-dire à l'exclusion de la taille de la signature de fonction.
Exemple
List = [20, 9, 4, 5, 5, 5, 15, 17, 20, 9]
Odd = [9, 5, 5, 5, 15, 17, 9]
Even = [20, 4, 20]
Check_Digit = √(ΣOdd² + ΣEven²) = 78.49203781276162
Remarque , la sortie réelle peut varier en fonction de la précision en virgule flottante de l'implémentation.
But
Le score est calculé comme Le score est calculé comme Σ(Characters in your Program) - 46
. Σ(Characters in your Program) - 32
. Outre le vote régulier de la communauté, le score négatif le plus bas recevrait un bonus supplémentaire de 50 points.
Éditer
- Le décalage qui a été utilisé pour calculer le score est passé de 46 à 32. Notez que cela n'affecterait pas l'éligibilité au classement / prime ou invaliderait toute solution.
Verdict
Après un duel horrible entre les Ninjas, M. Chaplin a reçu de merveilleuses réponses. Malheureusement, peu de réponses ont tenté de profiter indûment de la règle et n'ont pas été très utiles. Il voulait en fait un duel équitable et des réponses où la logique était codée dans les signatures de fonction signifierait finalement que la signature de fonction fait partie intégrante de la solution. Enfin, Ninja FireFly a été le vainqueur clair et lui a attribué le bonus qu'il mérite bien. Classement (mis à jour quotidiennement)
╒══════╤═════════════════╤══════════════╤═════════╤════════╤═══════╕
├ Rank │ Ninja │ Dialect │ Punches │ Scores │ Votes ┤
╞══════╪═════════════════╪══════════════╪═════════╪════════╪═══════╡
│ 0 │ FireFly │ J │ 17 │ -15 │ 6 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 1 │ tmartin │ Kona │ 22 │ -10 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 2 │ Sven Hohenstein │ R │ 24 │ -8 │ 7 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 3 │ Ben Reich │ GolfScript │ 30 │ -2 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 4 │ mollmerx │ k │ 31 │ -1 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 5 │ David Carraher │ Mathematica │ 31 │ -1 │ 3 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 6 │ tmartin │ Q │ 34 │ 2 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 7 │ daniero │ dc │ 35 │ 3 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 8 │ psion5mx │ Python │ 38 │ 6 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 9 │ O-I │ Ruby │ 39 │ 7 │ 5 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 10 │ gggg │ Julia │ 40 │ 8 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 11 │ FakeRainBrigand │ LiveScript │ 50 │ 18 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 12 │ Sylwester │ Perl5 │ 50 │ 18 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 13 │ daniero │ Ruby │ 55 │ 23 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 14 │ vasuakeel │ Coffeescript │ 57 │ 25 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 15 │ dirkk │ XQuery │ 63 │ 31 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 16 │ crazedgremlin │ Haskell │ 64 │ 32 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 17 │ Uri Agassi │ Ruby │ 66 │ 34 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 18 │ Sumedh │ JAVA │ 67 │ 35 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 19 │ Danny │ Javascript │ 67 │ 35 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 20 │ deroby │ c# │ 69 │ 37 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 21 │ Adam Speight │ VB │ 70 │ 38 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 22 │ Andrakis │ Erlang │ 82 │ 50 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 23 │ Sp0T │ PHP │ 85 │ 53 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 24 │ brendanb │ Clojure │ 87 │ 55 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 25 │ Merin Nakarmi │ C# │ 174 │ 142 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 26 │ Boopathi │ JAVA │ 517 │ 485 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 27 │ Noyo │ ES6 │ ? │ ? │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 28 │ shiona │ Haskell │ ? │ ? │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 29 │ Vivek │ int │ ? │ ? │ 0 │
└──────┴─────────────────┴──────────────┴─────────┴────────┴───────┘
Réponses:
J,
1817 caractères - 32 = ⁻15(En tant que "corps de fonction"; doit être entre parenthèses ou lié à un nom.)
Explication
J'ai essayé de faire une vue éclatée de ce que fait chaque pièce, comme Tobia le fait dans les réponses APL.
+/&.:*:
pourrait être remplacé par|@j./
utilisation de l' astuce de magnitude complexe d'OI pour enregistrer encore deux autres caractères.Exemple
la source
ES6,
(48 - 32) = 16(1 - 32) = -31Version originale:
La définition de la fonction entière est de 53 caractères, le corps seulement est de 48.
Version mise à jour, tirant pleinement parti de la définition du problème et déplaçant pratiquement tout hors du corps et dans la signature:
La nouvelle définition de la fonction est désormais de 63 "coups de poing" au total, mais le CORPS de la fonction est désormais d'un seul caractère de barrage.De plus, il ne corrompt plus l'espace de noms global! :RÉ
Usage:
la source
R, (24 - 32) = −8
Le corps de la fonction se compose de 24 caractères.
Usage:
la source
sqrt(sum(by(x,x%%2,sum)^2))
Je n'ai pas optimisé le sqrt .... putain :-) +1 :-) PS: il est intéressant de voir comment ilby
semble être sorti au début à cause du format de sortie merdique mais quand vous le parcourezsum
c'est corrigé ;-)by
renvoie un tableau unidimensionnel. Il ne faut pas juger la fonction par le résultat de laprint.by
fonction.by
ne retourne pas un tableau (btw, ce que vous entendez par «tableau»? Il n'y en a pas dans R. Vous vouliez probablement un vecteur), ni un vecteur.by
renvoie un objet de classeby
.?array
. De plus,is.array(by(1,1,I))
revientTRUE
.Ruby 2.1+ - (39 caractères au total - 7 non-corps - 32 offset = 0)
Approche légèrement différente. Je crée un nombre complexe
a+b*i
tel quea
etb
sont les sommes des nombres pairs et impairslist
, respectivement. Ensuite, je prends juste la valeur absolue.Ma solution précédente, qui est de 5 caractères de plus mais fonctionne sur 1.9.3+:
Sur une note finale, si Rails + Ruby 2.1+ était autorisé, nous pouvons utiliser
Array#sum
pour réduire le corps à seulement 25 caractères:la source
Python 2.7: 45, non: 40, non: 38 - 32 = 6
Rien de très nouveau ici, juste une combinaison de l'astuce complexe que j'ai vue dans le récent défi Pythagore, lambda pour la compacité et la minimisation de la syntaxe / parenthèse:
Mise à jour - enregistré quelques caractères. Merci à @DSM pour l'astuce de porter le composant complexe à 0/1.
Ok, la lecture de la question et la reconnaissance de la règle de comptage du 'corps de la fonction' économisent encore 2 caractères:
Tests iPython:
la source
abs
des nombres complexesAPL (27 - 46 = -19)
par exemple:
la source
Mathematica 31-32 = -1
GatherBy[#,OddQ]
produit les listes de paquets pairs et de paquets impairs.L'intérieur
Tr
trouve les totaux, qui sont tous les deux au carré, puis additionnés (par l'extérieurTr
).N
convertit d'un nombre irrationnel (la racine carrée d'un entier) en une approximation décimale.Exemple
Si
f[n_]:=
n'est pas inclus dans le décompte, un caractère supplémentaire peut être enregistré.Exemple
la source
Kona, 22 - 32 = -10
la source
Perl5: (50 - 32 = 18)
la source
say
au lieu deprint
et<>
au lieu de@ARGV
(tout en fournissant les arguments sur le STDIN plutôt que sur la ligne de commande)say
unuse
? passer d'un tableau d'arguments à<>
nécessiterait un supplémentsplit/ /,
.dc 3 (35 - 32)
Utilisation de tableaux, comme suggéré par @Tomas. Cela permet d'économiser certains caractères car je peux calculer la parité de chaque nombre et l'utiliser comme index, au lieu de modifier la parité avec comme méthode de branchement et de mettre les bonnes valeurs dans les bons registres. Il s'avère également que les tableaux vous donneront un 0 même si le tableau / index n'a pas été utilisé, vous n'avez donc rien à initialiser.
Suppose que les nombres sont déjà sur la pile et laisse le résultat comme la seule valeur qui reste quand c'est fait.
Tester:
dc 16 (48 - 32)
Première version utilisant les registres o et e pour stocker les nombres pairs et impairs.
la source
sose
;-) peut-être pourriez-vous obtenir un résultat plus court en utilisant les commandes du tableau dc ?Python, 9 (55 - 46)
L'utilisation d'une fonction lambda enregistre quelques octets sur les sauts de ligne, les onglets et
return
.Exemple:
la source
Rubis (66 - 32 = 34)
tester:
la source
Math.hypot *a.partition(&:odd?).map{|x|eval x*?+}
rase quelques caractèresRubis, 55 - 46 = 9
Tester:
la source
h
:f=->a{h=[0,0];a.map{|v|h[v%2]+=v};e,o=h;(e*e+o*o)**0.5}
Q, 34 - 32 = 2
.
la source
Julia, 40-46 = -6
la mise en oeuvre
Production
la source
Coffeescript, (57 - 32 = 25)
Implémentation
la source
+=
et changer0.5
pour.5
GolfScript 30
Je ne pense pas que GolfScript ait beaucoup de chance sur celui-ci!
la source
c #: 69-32 = 37
Code complet:
PS: Juste pour le plaisir, cela fonctionne aussi, malheureusement cela ne change pas le nombre de caractères nécessaires:
la source
Prolog (73 - 32 = 41)
Ici, nous comptons tout après «: -» comme corps de fonction.
Fonction d'appel comme ceci:
la source
Matlab (44 - 46 = -2)
Le corps de la fonction comprend 44 caractères:
Fonction totale comme suit:
Tests de la fonction:
la source
Python 2,7 - 64-46 = 18
Cela pourrait être plus court en utilisant de la
zip
magie, mais pour l'instant:Pour terminer, il s'avère que vous pouvez faire de la magie zip, mais cela vous coûte plus cher (de quelques caractères), donc ce qui précède est valable, à moins que quelqu'un ne puisse améliorer l'un ou l'autre:
la source
abs(sum(1j**(i%2)*i for i in x))
.!s%2
t-il? C'est au moins un changement progressif que vous pouvez accepterC # 174
Lisible
la source
Clojure = 87 - 46 = 41
À peine idiomatique, cependant.
la source
Haskell, 64C - 46 = 18
Pas trop difficile à lire. Exemple d'exécution:
la source
int e=0,o=0;for(int i :n){if(i%2==0)e+=i;else o+=i;}System.out.println(Math.sqrt(e*e+o*o));
Méthode réelle dans le code java
la source
PHP 85-32 = 53
$a=$b=0;foreach($x as $q){if(($q%2)==0)$a=$a+$q;else$b=$b+$q;}echo sqrt($a*$a+$b*$b);
C'est le meilleur que je pourrais être un débutant. Je suis sûr qu'il doit également y avoir des versions plus courtes.
ÉDITER:
Une version réduite du code pourrait être:
Cette version n'a que 64 caractères (21 de moins que la réponse d'origine).
Dit ainsi, 64-32 = 32
la source
foreach($l as$m)$m%2?$o+=$m:$e+=$m;echo sqrt($o*$o+$e*$e);
VB.net (81c - 11c = 70) - 32 = 38
Via une utilisation libérale du terme Écrire une fonction
la source
XQuery, (63 - 32 = 31)
la mise en oeuvre
Production
BaseX a été utilisé comme processeur XQuery.
la source
Erlang: 82C - 32 = 50
Erlang n'est pas génial pour ça. La plupart des raccourcis finissent par être plus de caractères (tuples, etc.)
Les seules vraies choses à noter:
{lists,sum}
est une référence de fonctionlists:sum
et peut être appelée--
( soustraire la liste ) la liste des nombres impairs de la liste complètePeut appeler en utilisant:
Production:
78.49203781276162
la source
Haskell
57 - 32 = 25
Optimisation directe des crazedgremlins réponse:
Optimisations:
read$show
est plus court quefromIntegral
- 3 caractèress=sum\n
et deuxs
a une longueur totale de 8 caractères, deuxsum
n'est que de 6 caractères. - 2 caractèresJ'ai également essayé d'ajouter plus de choses à l'opérateur, mais cela a fini par être aussi long:
la source