Tâche
Construisez une calculatrice, qui prend n'importe quelle chaîne, à partir d'un fichier, stdin ou autre, et additionne toutes les valeurs des caractères.
Exemple
Input
Hello World!
Output
1085
Règles
La calculatrice doit accepter uniquement le codage ASCII.
Le code le plus court gagne.
Remarques
En ce qui concerne le commentaire de m.buettner, je dois dire que je n'ai pas pensé à la partie multi-octets.
Je laisse donc cela en bonus.
La calculatrice doit être exécutée telle qu'elle est écrite, donc pas besoin de la modifier avant la compilation ou l'interprétation.
Prime
Grâce à Synthetica , voici encore un bonus,
Le programme qui a la sortie la plus faible lorsque vous utilisez son code lorsque son entrée
gagneobtient une étoile.
Je ne veux pas le modifier complètement.
Si vous l'écrivez en plus pour afficher la valeur (à droite) en UTF-8, vous obtenez une étoile.
Le code qui s'exécute le plus rapidement sur mon ordinateur portable (Lenovo Yoga 13 Intel Core i5 3317U 1,7 GHz, 8 Go de RAM, 128 Go SSD, Intel HD 4000, Windows 8) obtient une étoile.
Les codes Web s'exécuteront d'abord sous IE11 avec chakra puis dans FireFox 29.0.1 avec SpiderMonkey
Le code Linux s'exécutera sur un Raspberry Pi avec Raspbian.
La corde de test est la suivante:
q/%8hnp>T%y?'wNb\},9krW &D9']K$n;l.3O+tE*$*._B^s!@k\&Cl:EO1zo8sVxEvBxCock_I+2o6 yeX*0Xq:tS^f)!!7=!tk9K<6#/E`ks(D'$z$\6Ac+MT&[s[]_Y(`<g%"w%cW'`c&q)D$0#C$QGf>?A$iawvc,}`9!('`c&q)D$0#C$QGf>?A$iawvc,}`9!(
Amusez-vous à coder :)
Bonusscoring
J'ai l'intention de faire le pointage ce samedi afin que le 07.06.14, toutes les réponses après cette date n'obtiennent pas de points bonus;)
Vous pouvez télécharger le code que je vais utiliser pour les tests ici, n'hésitez pas à le fork et à l'améliorer :)
Petite mise à jour à cause du bonus, mon ordinateur portable est partiellement cassé donc je le ferai probablement le week-end prochain, j'en suis vraiment désolé :(
Hello World!
utilisé deux langues différentes pour les valeurs ASCII sur mon ordinateur.Réponses:
GolfScript, 4 caractères
Utilise simplement l'opérateur de pliage (
*
) pour additionner tous les caractères.Si cela doit fonctionner avec la chaîne vide, 9 caractères:
Merci à @PeterTaylor d'avoir fourni une version alternative à 6 caractères qui fonctionne avec une chaîne vide:
la source
0\{+}/
prend en charge la chaîne videAPL (8)
Explication:
+/
somme de⎕UCS
valeurs unicode de⍞
saisie de caractèresla source
Hello World!
?1085
. Ce ne serait pas correct s'il donnait une autre sortie. Il additionne les valeurs des points de code Unicode des caractères.⍞
moyens;)⍞
signifie lire une ligne du clavierHaskell 36
la source
$ printf "Hello World!" | ./charsum
ECHO "Hello World! | ghci charsum.hs
interact
etshow
au lieu degetContents>>=print
:main=interact$show.sum.map fromEnum
Outils Shell + GNU, 29 octets
Prend l'entrée de stdin:
Score propre: 2385
c, 52 octets
Compiler avec (quelques avertissements produits):
Prend l'entrée de stdin:
Score propre: 4354
la source
od
commande?od -AntuC
ne fait pas la même chose queod -An -tuC
.od-An-tuC
ouod -An-tuC
Javascript ( ES6 ) 51
la source
...
avantprompt
? Est-ce une nouvelle chose ES6 ou est-ce pré-ES6?[...prompt(x=0)]
a pris l'invite avec une valeur par défaut de 0 (qui sera utilisée plus tard dans la somme), et applique cette entrée comme un tableau de caractères ... ? Laquelle serait techniquement la même choseprompt(x=0).split("")
, non?prompt(x=0)
signifie "mettre x à 0, appelerprompt
avec la valeur de mettre x à 0", c'est-à-dire 0. Ce serait équivalent à écrire(x=0,prompt(x))
gs2 , 1 octet
d
(0x64
/sum
), bien sûr, résume tous les octets en entrée standard.la source
Python 3 - 28 octets
Exemple d'exécution:
Obtient l'entrée de stdin,
map
s laord
fonction pour obtenir la valeur ASCII de chaque caractère,sum
s it etprint
s.la source
print sum(map(ord,raw_input()))
map(ord,input())
eninput().encode()
. Les objets en octets peuvent toujours être additionnés et ils restent de la même longueur.Assemblage 8086 (16 bits) -
4741 octetsLe contenu du
test.com
fichier est:Le travail réel est effectué dans les 11 premiers octets; J'ai besoin du reste pour imprimer le résultat en notation décimale.
Code source (donne en entrée à l'
debug.com
assembleur DOS ):Quelques notes sur le code:
la source
CJam, 3 octets (somme 260)
Vous pouvez l' essayer en ligne .
Merci jimmy23013 d'avoir aidé à couper 2 personnages :)
Explication:
la source
q1b
est plus court.Befunge98, 6 octets, somme: 445
Tout interprète devrait être bien. J'utilise CCBI .
Utilisez comme suit:
Fonctionne pour les caractères multi-octets et les chaînes vides.
Explication
2j
- sautez par-dessus les deux instructions suivantes (@
et.
- voir ci-dessous)~
- mettre le prochain caractère sur la pile+
- ajoutez la valeur de code du nouveau caractère à la somme actuelle. Le pointeur d'instructions revient au début et le cycle se répète~
rencontre un EOF il inverse la direction du pointeur et les deux instructions "cachées" sont exécutées:.
- imprimer la somme@
- sortiela source
Rubis,
1312 octetssum
est une fonction intégrée qui additionne les caractères d'une chaîne. Soustrait 10 pour tenir compte de la nouvelle ligne à la fin degets
la valeur de retour.(Modifié 4 ans plus tard pour changer
x-10
en~9+x
... la valeur de~9
is-10
, mais il nous permet de supprimer l'espace entrep
et son argument, en économisant un octet.)la source
p
est une méthode de sortie de la valeur de débogage de quelque chose sur une ligne.PowerShell - 27
Exemple
la source
[char[]]"$args"|measure -s
tant qu'il n'y a qu'une seule entrée $ arg.Julia -
117 caractères, somme résultante =943536Puisque la question permet à l'entrée de provenir de la source que vous voulez, je choisis une variable existante. Supposons que
A
contient la chaîne que nous souhaitons évaluer.En fin de compte, vous pouvez additionner directement la chaîne, et elle évaluera ... cependant, en raison de la façon dont la sommation des caractères est gérée, s'il y a un nombre impair de caractères dans la chaîne, elle produira un caractère, plutôt qu'un entier quelconque. En tant que tel, nous le forçons à convertir en int en multipliant par 1.
Ancienne version:
Sortira dans une notation hexadécimale (si la somme est inférieure à 256, ce sera
0x??
, sinon ce sera 8 octets0x????????
). S'il est utilisé dans le code où le résultat est utilisé, il fonctionnera comme n'importe quel autre numéro (c'est comme ça que Julia affiche les entiers non signés).Pour voir la valeur du résultat en décimal, mettez ce qui précède dans
int()
, comme dansint(sum(A.data))
.Pour toute personne qui ne connaît pas Julia, vous attribuez
A
exactement la même manière que vous effectuez les autres affectations aux variables. Alors,A="Hello World!"
ouA="sum(n.data)"
. Dans le cas où vous devez saisir des caractères"
ou'
, il existe plusieurs options, dont la plus simple (car elle évite d'avoir besoin de connaître les nuances des littéraux de chaîne Julia) estA=readline()
, suivie simplement en tapant la chaîne dans STDIN (won ' t gérer les nouvelles lignes, cependant). La séquence d'échappement pour newline est, comme d'habitude,\n
mais je ne pense pas que vous puissiez l'utiliser avec readline ().la source
n
? Je ne connais pas du tout Julia;)n
àA
pour réduire la somme résultante de 988 à 943..data
; mais parce que ce sont des personnages, ils produisent un résultat de caractère pour un nombre impair de caractères. La multiplication par 1 corrige cela.K5, 2 octets (fonction), 5 octets (programme)
Une fonction
Programme
Je ne sais pas si K5 a été créé avant ou après la publication de ce défi. Peu importe ... C'EST IMPRESSIONNANT !!
En K5, si vous effectuez des opérations arithmétiques sur des chaînes, il convertit les caractères en leurs codes ASCII. Donc, cela utilise simplement l'opérateur sum
+/
(en fait, c'est plus + plus).la source
Matlab / Octave 4 octets (bonus: 405)
Ce code est une fonction anonyme, qui fait le travail, il prendra une chaîne et renverra le nombre requis.
la source
gs2
réponse, mais au moins avec la même approche que la réponse Julia, je dois quand même écriresum(A)
. Je pense quesum
seul n'est pas ok (ne serait même pas un code valide =).Go (59 caractères)
Tout dans Go est utf8 par défaut. Le codetext en `délimètres parcourus lui-même donne une sortie de: 5399.
la source
math.Sum
d'utilisation avecmap
ou similaireJolf, 2 octets (non concurrent)
Essayez-le ici!
Umm ... Je ne sais pas quoi dire d'autre.
la source
Gol> <> , 4 octets (non concurrents)
Remarque: cette langue est plus récente que le défi.
la source
Javascript ES6, 41 octets
Merci à @ETHproductions pour 2 octets enregistrés!
la source
_=>[..._].map(y=>x+=y.charCodeAt(),x=0)|x
?Python, 24 octets
C'est plus court que n'importe quelle solution Python jusqu'à présent: une fonction anonyme sans nom, qui prend la chaîne en argument et retourne la somme.
Essayez-le en ligne!
Tout d'abord, le
x.encode()
transforme enbytes
objet. Alors,sum
ajoute les valeurs de code de caractère. Comme il s'agit d'une fonction lambda, la valeur est renvoyée implicitement.De plus, on pourrait avoir
lambda x:sum(map(ord,x))
pour le même nombre d'octets.la source
SML,
4236Il suffit d'ajouter une autre langue.
Convertit String en tableau char, calcule le nombre ascii de chaque valeur et calcule la somme de tous les nombres ascii.
la source
;
. 36 octets: tio.run/##DcpBCoAgEAXQq0zRQomiC7ivdYuWEWgRfB2xKby9uXzwHo/…C 32
la source
main(int argc,char **argv){return(argc?main(0,&(argv[1])):(**argv?**argv+main(0,argv)+((*argv)++?0:0):0));}
(107 caractères) bien qu'il ignore le premier caractère pour une raison quelconque. De plus, les codes de sortie POSIX ne sont que de 8 bits; en bash,echo $?
.D (fonction: 60)
Certainement pas là-dedans pour le gagner.
En supposant qu'il n'a pas besoin d'être un programme complet
Appelé comme ça
Production:
D (programme: 133)
Ne compte pas les sauts de ligne.
Avec plus d'espace et des noms de variable plus longs pour plus de lisibilité
Pour prendre en charge les sauts de ligne dans l'entrée, je pourrais utiliser
byLine(KeepTerminator.yes)
- la bonne façon, pour 20 caractères - ou ajouter un'\n'
à ma ligne - qui rompt l'entrée sur une seule ligne et peut donner la mauvaise somme sur Windows à cause de CRLF, pour 18 caractères.la source
JavaScript (ES6) 54
5854 octets grâce à nderscore :la source
alert([...prompt()].reduce((v,c)=>v+c.charCodeAt(),0))
alert([...prompt(x=0)].map(y=>x+=y.charCodeAt())|x)
Delphi (
8783)Non golfé
Boucle en
S
ajoutant laord
valeur du caractère au résultat. où x == résultatModifications:
4 caractères enregistrés en passant à int64 et en modifiant l'ajout à la somme.
la source
k (8 caractères)
Traduction Q
Valeur bonus:
la source
J (7)
Si proche, mais si loin ... Eh bien, je suppose que 7 est assez décent, car cette réponse accepte également les chaînes vides. (Je fonde mon utilisation d'une variable comme entrée sur la phrase
from a file, stdin or whatever
)Explication:
a.
contient tous les caractères ASCII.x i. y
est similaire à celui de python[x.index(i) for i in y]
.À cet effet,
a. i. y
convertity
en un tableau de ses valeurs ASCII+/
est commesum
:+/1 2 3 4 5 6
signifie1+2+3+4+5+6
Le tout en action
Pour le bonus:
Pas mal, je suppose.
Bon sang.
Merci @algorithmshark
Merci @marinus
la source
b
de nomA
donne un score de 449.R,
35 caractères (somme de 3086)26 octets (somme de 2305)readline()
est un caractère plus long quescan(,"")
maisscan
divise l'entrée par défaut sur les espaces.Usage:
la source
Japt , 6 octets (non concurrent)
Cette réponse n'est pas en concurrence car Japt a été créé après la publication de ce défi.
Assez simple. Essayez-le en ligne!
Comment ça fonctionne
la source
¬
to a negation of some sort?url/interpreter.html#new=1
); anything without it uses the old character set, and anything with it uses the new character set.PlatyPar, 2 bytes (non-competing)
Try it online!
u
generates an array of all charcode values in the input string, ands
finds their sum.When run on itself, it returns
232
.This is similar to Conor's Jolf answer, except that I use a byte to convert the string into an array of character codes (which is implicit in Jolf), whereas he uses a byte to retrieve the input (which is implicit in PlatyPar).
la source