Vous venez d'être embauché par une entreprise de construction automobile allemande. Votre première tâche, en tant qu’ingénieur, est d’écrire un programme qui calcule l’empreinte écologique des chaînes ASCII.
L'empreinte écologique de caractère est calculée comme suit:
Ecrivez le code ASCII du caractère en binaire et comptez le nombre de 1.
Par exemple, A
a une empreinte de 2, mais O
est plus sale avec une empreinte de 5.
L'empreinte globale d'une chaîne est la somme des empreintes de ses caractères. Une chaîne vide a une empreinte de zéro.
Votre programme doit accepter une chaîne ASCII en tant que paramètre (via une ligne de commande ou une entrée), calculer son empreinte écologique et la générer. Le programme lui-même doit être encodé en ASCII.
Il y a un hoquet cependant. Comme votre entreprise souhaite entrer sur un nouveau marché avec des règles environnementales plus strictes, vous devez adapter votre programme de sorte qu'il se comporte différemment en "mode test". Ainsi:
Le programme doit afficher 0 lorsqu'il reçoit la chaîne en
test
tant que paramètre.
Notation
Le code source ayant la plus petite empreinte écologique gagne (et oui, la réponse test
est interdite!)
la source
\x7F}~_?{ow7yvu/s\x1F;=znm>k|OW[]^gc\x1Ex\x1D\eef\\'ZY+-VU.St\x173iNM5K6r\x0FG9:q<ljQ\x15\x13pC\aEF8IJL4\x0E21\x16RTh,X*)\x19\v&%\x1A#d\x1C\rab`!\"$(\x180\x05A\x14B\x12\x11DHP\x03\f\x06\n\t\x80\x10\x01@\x04\b\x02 \x00
Réponses:
CJam,
3331Il y a 1130000000095000000003400000001160000000100000000115000000011600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 octets null entre les guillemets doubles.
Le code est équivalent à
qui peut être testé en ligne .
Comment ça marche
Comment ça marche
Ce code source a une empreinte écologique de 75.
la source
Lenguage , 0
La sortie est unaire , car Lenguage / Brainfuck n’a aucun moyen sensé d’imprimer des nombres entiers en base 10.
Le code source actuel contient
null octets et équivaut au programme Brainfuck suivant:
Essayez-le en ligne sur brainfuck.tk .
La longueur du code Brainfuck est extrêmement sous-optimale - pour commencer, j'ai codé en dur les empreintes de tous les caractères ASCII - mais le score 0 correspond au score 0 ...
la source
PowerShell,
337344304 pointsJe crie chez vous parce que c'est moins cher!
Prend l'entrée comme
$A
, puis transforme un tableau de caractères, puis itère sur une boucle for sur chaque caractère, utilise le mot ridiculement verbeux[convert]::ToString()
pour convertir le caractère à cette position en binaire, remplace tous les 0 par rien, puis compte la longueur, et ajoute cela à$B
. À la fin, utilise une équivalence pour indexer dans un tableau dynamique (c'est-à-dire, si$A
esttest
, alors-CEQ
est$TRUE
, donc il indexe vers le deuxième élément,0
).Edit1 - Cas de test corrigé
"TEST"
Edit2 - Golfé quelques points en effectuant une itération sur les caractères eux-mêmes plutôt que leurs index, et en se rappelant que
-replace
cela ne nécessite pas un second paramètre si vous ne le remplacez par rien.la source
" 00100010
sont plus écologiques que les devis simples' 00100111
."TEST"
"
. Également corrigé avec-CEQ
pour la sensibilité à la casse. Cela a un peu augmenté le nombre de points, car j’avais mal marqué le score' '
car je ne l’avais pas délimité correctement lors de mes tests.Pyth -
5249Trois points économisés grâce à @orlp.
Prend des guillemets pour économiser l’empreinte.
Suite de test .
la source
@,0
par*
pour économiser 3 :)@,0
avez-vous simplement oublié de changer?Common Lisp,
294281235Afin de réduire le score, j'ai utilisé
@
(coût 1) et!
(coût 2) comme noms de variables (edit: et c'est encore mieux si j'utilise@
pour la variable se produisant le plus dans la fonction). Je crie trop parce que c'est moins cher.Joli imprimé
la source
;)
JavaScript, 279
Modifier le correctif (ne compte pas le bit 1 de chaque caractère)
Un programme complet, avec entrée et sortie via popup. Testé dans Firefox, devrait fonctionner dans n'importe quel navigateur moderne.
Quelques outils (testé avec Firefox)
la source
test
au lieu de 0.prompt
fonction. Dans Firefox,prompt
traduit les nouvelles lignes (2 bits) en espaces (1 bits), nous obtenons donc 277 au lieu de 279Julia,
254246232La
count_ones
fonction compte le nombre de uns dans la représentation binaire de son entrée.Réduction de mon empreinte écologique grâce à FryAmTheEggman!
la source
Python 3, 271
la source
z=input();print(sum(bin(ord(i)).count("1")for i in z)*(z!="test"))
.... @ FryAmTheEggman Jinx?Perl,
13611873Remplacez tout
@
par\0
Exemple d'utilisation:
la source
MATLAB,
198194 octetsTout d'abord, la chaîne est lue à partir de STDIN via la
input
fonction. Une fois que cela se produit, nous comparons la chaîne d'entrée à la chaînetest
. Si le résultat n'est pastest
correct, nous convertissons chaque caractère en son code ASCII, puis en sa représentation binaire viadec2bin
. Une belle conséquence de cette fonction est que si vous soumettez une chaîne, la représentation binaire de son code ASCII est délimitée comme un caractère par ligne.Par exemple:
dec2bin
génère un tableau de caractères. Ensuite, soustrayez par 48, qui est le code ASCII pour 0 afin que la matrice soit convertie endouble
0 et 1. Une fois que cela se produit, un appel ànnz
compter le nombre total d'éléments non nuls dans cette matrice. Notez que ce résultat est multiplié par l'opposé de la chaîne comparée àtest
. Si la chaîne ne devait pas êtretest
, nous obtenons le calcul de l'empreinte. Si c'est égal, alors la multiplication donne 0.Quelques exemples:
la source
de2bi
place et éviter d' utiliser-48
un type numérique (ainsi que les 2 caractères supplémentaires du nom de la fonction).Frapper
440430412405403Assez simple. Boucle les caractères de l’entrée en convertissant d’abord en ascii (avec
printf %d
et l’entité'
du nombre puis en binaire (avecbc
)), supprime les zéros et compte le nombre de caractères.Pas une bonne réponse mais je n’avais pas encore vu une tentative de bash.
Modifié depuis que ma première réponse permettait à la chaîne d’entrée d’être donnée simplement sur la ligne de commande (c’est-à-dire que cela devenait plusieurs paramètres d’entrée si plusieurs mots étaient utilisés), mais après avoir lu d’autres réponses, je pense pouvoir supposer qu’elle est entre guillemets.
$1
la source
do
avec{
etdone
avec}
. 2. Vous n'avez également pas besoin d'espaces autour<<<
. 3. Vous pouvez remplacer\n
par un saut de ligne littéral.=
et||
coûte 15 € alors que l’utiliser!=
et&&
n’est que 13! Un personnage supplémentaire mais enregistre deux points ...Ceylan,
1431,764,697,571,547,538,501,493,467, 451C'était l'original, non-golfé:
Cela prend l'argument d'un paramètre de ligne de commande ... process.arguments est une séquence de chaînes (éventuellement vide). Par conséquent, avant d'utiliser l'une d'elles, nous devons vérifier si elle existe réellement. Dans l’autre cas, nous émettons un message d’erreur (cela n’est pas requis par la question et nous le jetterons dans les prochaines versions).
La
sum
fonction de Ceylan prend un Iterable non vide d'éléments de quelque type que ce soit qui doit satisfaireSummable
, c'est-à-dire qui a uneplus
méthode, comme Integer. (Cela ne fonctionne pas avec des séquences vides car chaque type Summable aura son propre zéro et le moteur d'exécution n'a aucune chance de savoir lequel est visé.)Les éléments d'une chaîne, ou les un bits d'un entier, ne sont pas des objets itératifs non vides. Par conséquent, nous utilisons ici la fonctionnalité pour construire un élément itérable en spécifiant certains éléments, puis une "compréhension" (qui sera évaluée à zéro ou à plusieurs éléments). Ainsi, dans le cas des caractères, nous en ajoutons (mais seulement lorsque le bit correspondant est défini), dans le cas des chaînes, nous ajoutons le résultat des caractères. (La compréhension ne sera évaluée que lorsque la fonction de réception itérera réellement dessus, pas lors de la construction de l'itérable.)
Voyons comment nous pouvons réduire cela. Premièrement, chacune des fonctions n’est appelée qu’à un seul endroit, nous pouvons donc les aligner. En outre, comme mentionné ci-dessus, supprimez le message d'erreur. (764 points d'empreinte.)
Nous n'avons pas réellement besoin de l'imbrication interne
sum
, nous pouvons en faire une grande compréhension. (Cela nous évite 37 points d’empreintesum({0,})
, et quelques-uns d’autres pour les espaces, qui seront éliminés à la fin de toute façon.) Voici 697:Nous pouvons appliquer un principe similaire à la
"test"
chaîne spéciale casée : comme dans ce cas, le résultat est 0 (rien ne contribue à la somme), nous pouvons simplement le faire dans le cadre de la somme (mais nous devons inverser la condition). . Cela nous évite principalement lesprint(0);
, quelques accolades et un tas d'espaces d'indentation, descendant à une empreinte de 571:Nous faisons la même chose pour le premier
if
, avec l’effet secondaire qui est de ne pas donner d’argument, mais de produire0
au lieu de ne rien faire. (Au moins, je pensais que cela arriverait ici, au lieu de cela, il semble s'accrocher à une boucle éternelle? Étrange.)Nous pouvons réellement omettre le
()
pour lasum
fonction ici, en utilisant une syntaxe d'appel de fonction alternative , qui utilise à la{...}
place de()
, et complétera les compréhensions dans des arguments itérables. Cela a l'empreinte 538:Remplacer le nom de la fonction
footprint
(40) parp
(3) enregistre 37 points supplémentaires, ce qui nous ramène à 501. (Les noms de fonctions de Ceylan doivent commencer par des lettres minuscules, nous ne pouvons donc pas obtenir moins de 3 points.)Les noms de variables
s
(5) etc
(4),i
(4) ne sont pas non plus optimaux. Remplaçons-les para
(argument),d
(digit?) Etb
(bit-index). Empreinte 493:Je ne vois aucune optimisation restante, mais supprimons les espaces non nécessaires (1 point pour chaque espace, deux pour chacun des deux sauts de ligne):
Lors de la navigation dans l'API, j'ai constaté que Character.hash renvoie la même valeur que son
integer
attribut. Mais il n’ya que 14 points au lieu de 30, nous sommes donc 451!la source
PowerShell,
273336328324293288295modifier - j'ai oublié le cas "test" ... tellement cher.
edité - manque une opportunité UPPERCASE.
edititedit - a incorporé les suggestions de commentaires (Merci TimmyD).
edit 4 - D est une variable moins chère que C (2 vs. 3)
edit 5 - Retour à 295 en raison de la vérification de la casse.
Boucle sur la chaîne et compte les 1 qui sont décalés de la valeur ASCII des caractères.
Chapeau-pointe à TimmyD pour m'avoir donné la prévoyance d'utiliser des caractères majuscules ET d'utiliser l'index de tableau à la fin.
la source
PARAM($A)[CHAR[]]$A|%{$C=[INT]$_;WHILE($C){$B+=$C-BAND0X1;$C=$C-SHR1}};($B,0)[$A-EQ"TEST"]
PS C:\scripts> .\ecological-footprint.ps1
"TEST"
PARAM($A)(([CHAR[]]$A|%{$B=$_;0..9|?{[INT]$B-SHR$_-BAND1}}).LENGTH,0)[("TEST"-EQ$A)]
Matlab, 320
la source
C, 374
Les nouvelles lignes (non incluses dans le score) ont été ajoutées pour plus de clarté. Pourrait être amélioré à 360 simplement en changeant les noms de variables en majuscules, mais je vais essayer de penser à quelque chose de mieux.
L'entrée se fait via la ligne de commande, ce qui signifie qu'il segfaults sur une entrée absente. Je m'attends à un pire score pour l'entrée via stdin.
la source
PHP,
377337299 Empreinte écologique (encore beaucoup) ,10291 octetsIl semble que PHP respecte l’environnement en mode test uniquement. ;)
Fonctionne depuis la ligne de commande comme:
while
est plus respectueux de l’environnement quefor
même s’ils partagent le même nombre de personnages. De plus, les noms de variables en majuscules ont une meilleure empreinte que leurs homologues en minuscules.Modifier
decbin
au lieu debase_convert
la source
VBA,
475418Merci Jacob pour 57 points
Convertit chaîne en tableau d'octets (128 est un raccourci vba pour "convertit la chaîne d'Unicode en page de code par défaut du système" ne fonctionnera donc pas sur Mac ....)
Boucle si tableau d'octets convertir en binaire et concaténer tout ensemble.
VBA pourquoi es-tu si mauvais au golf ... :(
la source
"test"
bien sûr)JavaScript,
418410la source
" 00100010
sont plus écologiques que les devis simples' 00100111
.Pyth, 64
Vérifie si l'entrée est test et sinon, compte le nombre de 1 dans la représentation binaire de l'entrée.
la source
Haskell, 292
Rien de plus à dire ici: transformez chaque caractère en valeur ascii (
fromEnum
) et calculez le1
s (viaa
). Résumer tous les résultats.la source
JavaScript (ES6),
521478458449473465Il s’agit de ma première tentative de golf JavaScript. C’est donc probablement très peu golfé.
la source
Ruby,
316313Très simple, à la recherche de plus de possibilités de golf:
b
au lieu dex
sauvegarder 3 points.la source
$*[0]
au lieu degets.chomp
(prend l’entrée comme argument de ligne de commande)" 00100010
sont plus écologiques que les devis simples' 00100111
.H
est meilleur queI
pour la même raison.Python 2,
294281269266Un portage de ma réponse Pyth, ci-dessus.
L'entrée est reçue sous forme de chaîne (avec guillemets):
la source
" 00100010
sont plus écologiques que les devis simples' 00100111
.A=input();print[sum(bin(ord(H)).count("1")for H in A),0][A=="test"]
score à 243.CJam, 123
la source
Pyth, 96
Un port de ma réponse CJam, ci-dessus / ci-dessous.
la source
I
essayer d'utiliser le ternaire?
, mais dans ce cas , car il est un bool vous pouvez simplement utiliser*
(après le passage à lan
place deq
),k
est automatiquement""
ets
sur les chaînes est le même unjk
. J'espère que vous aurez du plaisir à apprendre pyth! :)CJam,
83817977Mieux vaut jusqu'ici après avoir essayé plusieurs variantes:
Essayez-le en ligne
Explication:
la source
Ruby, 247
Approche directe en boucle sur tous les octets de l'entrée et sur tous les bits de chaque octet, en faisant la somme d'une variable
d
.d
est initialisé à -2 carh
contient la nouvelle ligne de terminaison de l'entrée (d'une valeur de 2 bits) et nous ne voulons pas compter cela.De même
h
, contiendratest
avec un retour à la ligne de fin, donc un retour à la ligne doit être inclus dans la valeur de comparaison.la source
R, 279
Assez explicite.
Tests:
la source
C, empreinte 378, 98 octets
Une autre solution C:
La façon dont cela fonctionne est que s est généralement initialisé à 0, mais devient -17 si l'argument de ligne de commande est "test" (strcmp renvoie 0 pour des chaînes égales et non nul pour des chaînes distinctes. Inverser le résultat donne donc 1 si chaîne est "test"). Le nombre -17 a été choisi pour compenser l'empreinte au sol de 17 qui sera calculée pour "test". Le calcul de l'empreinte est facile avec les opérateurs au niveau des bits.
Claquer des doigts! Au départ, j'avais raté les «gains d'empreinte les plus courts», alors je visais le code le plus court ... Je vais voir si je peux réduire l'empreinte.
la source
Java, 594
Java n'est pas très vert.
Version non-golfée:
D
est déclaré comme un moyenInteger
permettant dInteger
' accéder à labitCount
méthode statique de manière respectueuse de l' environnement. LabitCount
méthode considère lechar
s comme un entier et renvoie le nombre de bits définis.la source