Calculer la moyenne des caractères de la chaîne

24

Tâche

Votre tâche consiste à produire une chaîne contenant des caractères moyens de chaîne. Le premier caractère du résultat serait le caractère moyen du premier caractère (qui est le premier caractère) et la moyenne du deuxième caractère de deux premiers caractères et ainsi de suite.

Quel est le caractère moyen?

Les chaînes sont des tableaux d'octets. Le caractère moyen de la chaîne peut être trouvé en calculant la moyenne des valeurs ASCII des caractères de la chaîne et en prenant le caractère ASCII correspondant.

Par exemple, une chaîne "Hello!"peut être écrite sous forme de séquence d'octets 72 101 108 108 111 33. La moyenne des valeurs ascii est 533/6 = 88.833 ... et quand elle est arrondie à l'entier le plus proche, nous obtenons 89 qui est le code ascii pour la lettre captive Y.

Règles

  • Vous pouvez supposer que l'entrée ne contient que des caractères ASCII imprimables
  • L'entrée peut être lue depuis stdin ou comme arguments de ligne de commande ou comme arguments de fonction
  • La sortie doit être standard. Si votre programme est fonctionnel, vous pouvez également renvoyer la chaîne que vous auriez sinon imprimée.
  • Il doit s'agir d'un programme ou d'une fonction dans son intégralité, et non d'un extrait
  • Des échappatoires standard s'appliquent
  • Les entiers sont arrondis par fonction floor(x+0.5)ou fonction similaire.

Comment gagner?

C'est le , donc la réponse la plus courte (en octets) en victoires.

Exemples

  • Hello!HW^adY
  • testtmop
  • 4243
  • StackExchangeSdccd_ccccddd
Hannes Karppila
la source
Question modifiée. Maintenant, cela doit être clair: vous devez arrondir les moitiés vers le haut.
Hannes Karppila
1
"L' entrée peut être lue depuis stdin ou comme arguments de ligne de commande ": ou comme arguments de fonction (puisque vous autorisez les fonctions), n'est-ce pas?
Luis Mendo
Bien sûr, réédité.
Hannes Karppila
2
Désolé de vous déranger encore une fois, mais les fonctions doivent-elles réellement imprimer la sortie sur STDOUT ou peuvent-elles renvoyer la chaîne souhaitée?
Dennis
Désolé, j'ai oublié de le modifier avant. Maintenant ça devrait aller.
Hannes Karppila

Réponses:

11

Brainfuck 106 octets

,[>,<.[->+<]>>++<[>[->+>+<<]>[-<<-[>]>>>[<[>>>-<<<[-]]>>]<<]>>>+<<[-<<+>>]<<<]>[-]>>>>[-<<<<<+>>>>>]<<<<<]

C'est ma première participation à un code-golf, soyez gentil! Cela fonctionne, mais brainfuck ne peut pas gérer les flottants (pas que je sache), donc la valeur arrondie est toujours la plus basse (pourrait corriger mon algorithme plus tard).

De plus, l'algorithme fait la moyenne des valeurs 2 par 2, ce qui signifie qu'il pourrait être inexact à certains endroits. Et je dois aussi corriger un bug qui imprime un nombre à la fin de la sortie.

Panda rouge
la source
9

Pyth, 16 octets

smCs+.5csaYCdlYz

Assez simple. Utiliser s+.5au lieu d'arrondir, car pour une raison quelconque, round(0.5, 0)c'est 0 en Python.

orlp
la source
1
Python 3 arrondit la moitié vers pair, ce qui introduit moins de biais. La question ne spécifie pas explicitement comment les moitiés doivent être arrondies, j'ai donc demandé des éclaircissements au PO.
Dennis
Question modifiée. 0.5devrait être arrondi 1.
Hannes Karppila
7

Q, 15 12 octets

12 octets comme expression

"c"$avgs"i"$

q)"c"$avgs"i"$"Hello!"
"HW^adY"
q)"c"$avgs"i"$"test"
"tmop"
q)"c"$avgs"i"$"42"
"43"
q)"c"$avgs"i"$"StackExchange"
"Sdccd_ccccddd"

ou 15 octets en fonction

{"c"$avgs"i"$x}

q){"c"$avgs"i"$x} "Hello!"
"HW^adY"
q){"c"$avgs"i"$x} "test"
"tmop"
q){"c"$avgs"i"$x} "42"
"43"
q){"c"$avgs"i"$x} "StackExchange"
"Sdccd_ccccddd"

profite de

  1. le "i" $ cast pour convertir une chaîne (liste de caractères) en une liste d'entiers
  2. la fonction avgs, qui calcule la moyenne courante d'une liste comme une liste de flottants
  3. le "c" $ cast pour convertir une liste de flottants en une liste de caractères, et qui arrondit automatiquement chaque flottant à l'entier le plus proche avant de le faire [ie ("c" $ 99,5) = ("c" $ 100) et ("c "99,4 $) = (" c "99 $)]
scottstein37
la source
Q a-t-il besoin du wrapper de fonction ici ou pouvez-vous vous en tirer avec l'expression tacite "c"$avgs"i"$? Je ne pense pas qu'une solution pourrait être beaucoup plus simple que cela. :)
JohnE
vous avez raison - pas besoin de l'encapsuleur de fonctions, car "c" $ avgs "i" $ "Bonjour!" fonctionne bien
scottstein37
Je pense que vous pouvez économiser 2 octets en changeant "c"en `c et "i"en` i.
kirbyfan64sos
malheureusement, je ne pense pas que cela fonctionne. Pour utiliser la représentation du type de symbole pour le casting, je devrais utiliser `char et` int selon code.kx.com/wiki/JB:QforMortals2/… J'ai envisagé d'utiliser 10h et 6h au lieu de "c" et "i" mais cela ne sauverait aucun octet - 10h est la même longueur que "c" et substituer 6h pour "i" nécessite un espace de fin, ce qui les rend également de la même longueur.
scottstein37
4

CJam, 19 octets

Uq{i+_U):Ud/moco}/;

Essayez-le en ligne dans l' interpréteur CJam .

Dennis
la source
4

Perl: 31 30 caractères

(Code de 29 caractères + option de ligne de commande de 1 caractère.)

s!.!chr.5+($s+=ord$&)/++$c!ge

Exemple d'exécution:

bash-4.3$ perl -pe 's!.!chr.5+($s+=ord$&)/++$c!ge' <<< 'StackExchange'
Sdccd_ccccddd
homme au travail
la source
3

C # 189135134106 octets

var x=s.Select((t,i)=>Math.Round(s.Select(a=>(int)a).Take(i+1).Average())).Aggregate("",(m,c)=>m+(char)c);

Peut être vu ici

Golfeur pour la première fois

Alex Carlsen
la source
2

K, 36 octets

`0:_ci_.5+{(+/x)%#x}'.0+1_|(-1_)\_ic

Usage:

  `0:_ci_.5+{(+/x)%#x}'.0+1_|(-1_)\_ic"Hello!"
HW^adY
  `0:_ci_.5+{(+/x)%#x}'.0+1_|(-1_)\_ic"test"
tmop
  `0:_ci_.5+{(+/x)%#x}'.0+1_|(-1_)\_ic"42"
43
  `0:_ci_.5+{(+/x)%#x}'.0+1_|(-1_)\_ic"StackExchange"
Sdccd_ccccddd

_ciet _icconvertir ascii en caractères et vice versa, respectivement. {(+/x)%#x}est un idiome K classique pour calculer une moyenne. Assez simple dans l'ensemble.

Edit: oh, mal lu la spécification. `0: est nécessaire pour imprimer le résultat sur stdout. En attente de clarification sur l'entrée re. Question de Dennis.

JohnE
la source
Si vous utilisez K5, cela peut être raccourci à 35 octets: {[s]`0:`c${_.5+(+/u)%#u:x#s}'1+!#s}.
kirbyfan64sos
Ou 30:`0:`c$_.5+{(+/x)%#x}'1_|(-1_)\
JohnE
`c$_.5+{(+\x)%+\~^x}`i$pour 24. Il pourrait être plus court ( `c$`i${(+\x)%+\~^x}`i$) mais votre REPL ( johnearnest.github.io/ok/index.html ) ne s'arrondit pas correctement lors de la conversion de float en int. J'hésiterais à appeler cette solution ak depuis _ciet _icne suis nulle part dans la spécification K5 pour autant que je sache, alors 0:qu'il n'imprime pas sur stdout mais lit à la place un fichier txt à partir du disque.
tmartin
@tmartin: correct - _ciet _icsont entièrement remplacés en K5 par les formulaires comme `c$. La solution originale que j'ai publiée est compatible avec Kona, qui est basée sur K2 / K3. J'essaie généralement de ne pas publier de solutions avec oK spécifiquement parce que la sémantique change encore et est partiellement inexacte.
JohnE
1
Ah je vois, ça a du sens pour moi. J'ai pensé que c'était une autre solution K5. Voici une solution de 28 caractères kona`0:_ci_0.5+{(+\x)%1.+!#x}_ic
tmartin
2

Mathematica, 75 octets

FromCharacterCode@Floor[.5+Accumulate@#/Range@Length@#]&@ToCharacterCode@#&
jcai
la source
2

Julia, 85 81 octets

s->(i=[int(c)for c=s];print(join([char(iround(mean(i[1:j])))for j=1:length(i)])))

Cela crée une fonction sans nom qui accepte une chaîne et crée un vecteur de ses points de code ASCII. Des moyennes sont prises pour chaque groupe séquentiel, arrondies à des entiers, converties en caractères, jointes en une chaîne et imprimées dans STDOUT.

Alex A.
la source
2

Rubis, 46

s=0.0
$<.bytes{|b|s+=b;$><<'%c'%(0.5+s/$.+=1)}

ideone .

Je m'excuse auprès de w0lf, ma réponse s'est avérée suffisamment différente pour que cela semble valoir la peine d'être publié.

$<.bytesitère sur chaque octet dans stdin, nous imprimons donc la moyenne mobile dans chaque boucle. '% c' convertit un flottant en caractère en arrondissant et en prenant l'ASCII, donc tout ce que nous avons à faire est d'ajouter 0,5 pour le faire arrondir correctement. $.est une variable magique qui commence initialisée à 0 - elle est censée stocker le nombre de lignes, mais comme nous voulons ici le nombre d'octets, nous l'incrémentons manuellement.

histocrate
la source
2

Mathcad, 60 "octets"

entrez la description de l'image ici

Mathcad est une application mathématique basée sur des feuilles de calcul 2D composées de "régions" dont chacune peut être du texte, une expression mathématique, un programme, un tracé ou un composant scripté.

Une instruction mathématique ou de programmation est sélectionnée dans une barre d'outils de palette ou saisie à l'aide d'un raccourci clavier. À des fins de golf, une opération ("octet") est considérée comme le nombre d'opérations au clavier nécessaires pour créer un nom ou une expression (par exemple, pour définir la variable a sur 3, nous écririons a: = 3. L'opérateur de définition : = est une simple pression sur la touche ":", de même que a et 3 donnant un total de 3 "octets". La programmation pour l' opérateur nécessite de taper ctl-shft- # (ou un simple clic sur la barre d'outils de programmation) donc à nouveau est équivalent à 1 octet.

Dans Mathcad, l'utilisateur entre des commandes de langage de programmation à l'aide de raccourcis clavier (ou en les sélectionnant dans la barre d'outils de programmation) plutôt que de les écrire dans du texte. Par exemple, taper ctl-] crée un opérateur de boucle while qui a deux "espaces réservés" pour entrer la condition et une seule ligne du corps, respectivement. En tapant = à la fin d'une expression Mathcad, Mathcad évalue l'expression.

(Nombre d'octets) En le regardant du point de vue de l'utilisateur et en assimilant une opération d'entrée Mathcad (clavier généralement, clic de souris sur la barre d'outils si aucun raccourci kbd) à un caractère et en l'interprétant comme un octet. csort = 5 octets car il est tapé char-by-char comme le sont les autres noms de variable / fonction. L'opérateur for est une construction spéciale qui occupe 11 caractères (dont 3 "espaces réservés" vides et 3 espaces) mais est entrée par ctl-shft- #, donc = 1 octet (similaire aux jetons dans certaines langues). Taper '(citation) crée des parenthèses équilibrées (généralement) et compte donc pour 1 octet. Indexation v = 3 octets (type v [k).

Stuart Bruff
la source
2

Python 3, 66 octets

Si j'utilise à la round()place de int(.5+etc., il enregistre un caractère, mais n'est techniquement pas conforme au défi: les arrondis de Python se round()divisent en deux à l'entier pair le plus proche, pas vers le haut. Cependant, il fonctionne correctement sur toutes les entrées d'échantillon.

Je me sens également un peu sale pour ne pas terminer la sortie avec une nouvelle ligne, mais le défi ne nécessite pas que ...

n=t=0
for c in input():n+=1;t+=ord(c);print(end=chr(int(.5+t/n)))
Tim Pederick
la source
1
Si vous incrémentez n avant l'impression, vous pouvez éviter de le régler de 1.
xnor
1
@xnor: Visage, paume. Paume, visage. Merci d'avoir fait remarquer cela.
Tim Pederick
faire print(end=chr(int(...))pour économiser quelques octets
FlipTack
@ Flp.Tkc: Merci! Réponse mise à jour.
Tim Pederick
2

JavaScript (ES6), 75 octets

let f =
s=>s.replace(/./g,x=>String.fromCharCode((t+=x.charCodeAt())/++i+.5),i=t=0)
<input oninput="O.value=f(this.value)" value="Hello!"><br>
<input id=O value="HW^adY" disabled>

Je ne peux pas croire qu'il n'y ait pas encore de réponse JS avec cette technique ...

ETHproductions
la source
1

Python 2, 71

i=s=0
r=''
for c in input():s+=ord(c);i+=1.;r+=chr(int(s/i+.5))
print r

Avec chaque nouveau caractère, met à jour la somme des caractères set le nombre de caractères ipour calculer et ajouter le caractère moyen.

xnor
la source
Presque exactement la même approche que la mienne, uniquement Python 2 au lieu de 3, et publié quelques heures plus tôt: +1. (De plus, j'ai trouvé que j'économisais quelques octets en imprimant chaque caractère au fur et à mesure plutôt que de les stocker pour une finale print. Est-ce que cela fonctionnera avec Python 2? J'oublie tout à l'heure comment supprimer les retours à la ligne dans la printdéclaration ... la virgule en fait un espace à la place, non?)
Tim Pederick
Python 2 peut faire print _,pour laisser un espace plutôt qu'une nouvelle ligne, mais aucun bon moyen d'omettre l'espace. Bon appel avec l' endargument de Python 3 , j'avais oublié ça.
xnor
@TimPederick Peut-être que le contrôle de retour arrière pourrait être justifié pour un terminal qui l'utilise, comme un hack pour supprimer l'espace:print'\b'+_,
xnor
1

Rubis 59 61

->w{s=c=0.0;w.chars.map{|l|s+=l.ord;(s/c+=1).round.chr}*''}

Test: http://ideone.com/dT7orT

Cristian Lupascu
la source
1
c+=1;(s/c)(s/c+=1) ideone.com/H2tB9W
manatwork
@manatwork Bien repéré! Merci! J'ai appliqué le changement.
Cristian Lupascu du
1

Java, 100

Tout comme beaucoup d'autres réponses ici, je fais la somme et la moyenne en boucle. Juste ici pour représenter Java :)

void f(char[]z){float s=0;for(int i=0;i<z.length;System.out.print((char)Math.round(s/++i)))s+=z[i];}

Mon code d'origine est un 97, mais il ne renvoie que le modifié char[]plutôt que de l'imprimer:

char[]g(char[]z){float s=0;for(int i=0;i<z.length;z[i]=(char)Math.round(s/++i))s+=z[i];return z;}

Maintenant, c'est juste assez long pour que les barres de défilement apparaissent pour moi, alors voici une version avec quelques sauts de ligne, juste parce que:

void f(char[]z){
    float s=0;
    for(int i=0;
            i<z.length;
            System.out.print((char)Math.round(s/++i)))
        s+=z[i];
}
Géobits
la source
Intéressant. Pouvez-vous également nous montrer un exemple d'appel? Mon Java est très rouillé.
manatwork
Comme dans comment l'appeler? En supposant qu'il tests'agit d'un tableau de caractères, utilisez simplement f(test);. S'il s'agit d'un objet String, vous l'utiliseriez f(test.toCharArray());. Les littéraux de chaîne sont bien comme ça aussi:f("Hello!".toCharArray());
Geobits
Oh. Sûr. toCharArray()Moi stupide, j'ai essayé de la violer avec un casting. Merci.
manatwork
Ce serait trop facile de le lancer. Les dieux de Java seraient furieux: P
Geobits
1

C, 62 octets

c;t;main(n){for(;(c=getchar())>0;n++)putchar(((t+=c)+n/2)/n);}

(lien idéone)

Les résultats sont légèrement différents des exemples de l'OP, mais uniquement parce que ce code arrondit 0,5 vers le bas au lieu de monter. Plus maintenant!

ossifrage délicat
la source
1

R, 135 127 Octets

Cela est devenu très rapide et je me suis vraiment trompé la première fois :) Besoin de lire correctement les questions.

cat(sapply(substring(a<-scan(,''),1,1:nchar(a)),function(x)rawToChar(as.raw(round(mean(as.integer(charToRaw(x)))+.5)))),sep='')

Essai

cat(sapply(substring(a<-scan(,''),1,1:nchar(a)),function(x)rawToChar(as.raw(round(mean(as.integer(charToRaw(x)))+.5)))),sep='')
1: Hello!
2: 
Read 1 item
HW^adY
MickyT
la source
quelqu'un a posté un défi de dupe dans le bac à sable alors j'ai trouvé ça ... C'était il y a longtemps, mais ça utf8ToIntva aider! J'ai un golf de 68 octets si vous voulez le mettre à jour.
Giuseppe
@Giuseppe Allez-y et publiez-le si vous le souhaitez. Je soupçonne que c'est sensiblement différent de ce que j'ai fait ici.
MickyT
1

Perl 5, 41 octets

say map{$s+=ord;chr($s/++$c+.5)}pop=~/./g

courir comme

$ perl -E 'say map{$s+=ord;chr($s/++$c+.5)}pop=~/./g' StackExchange
Sdccd_ccccddd
Hobbs
la source
1

TSQL, 118 octets

DECLARE @ varchar(400) = 'StackExchange'

SELECT
top(len(@))char(avg(ascii(stuff(@,1,number,''))+.5)over(order by number))FROM
master..spt_values
WHERE'P'=type

Retour des caractères à la verticale

S
d
c
c
d
_
c
c
c
c
d
d
d
t-clausen.dk
la source
1

> <> , 30 octets

i:0(?v
v &l~<
\+l2(?
\&,12,+o;
  • La première ligne lit depuis stdin et place les caractères sur la pile
  • Le second supprimera le caractère EOL, prendra la taille de la pile et le mettra dans le & registre
  • La troisième ligne ajoutera des numéros sur la pile alors qu'il y en a deux ou plus
  • La quatrième ligne divisera le nombre résultant par la valeur du registre, puis ajoutera 1/2, affichera la valeur sous forme de caractère et s'arrêtera. Face à une valeur flottante lors de l'affichage d'un caractère,> <> le plancher, c'est pourquoi nous avons ajouté 1/2

Vous pouvez l'essayer sur l' interpréteur en ligne, mais vous devez ensuite utiliser la version suivante, car l'interpréteur en ligne remplit la zone de code dans un rectangle et s'applique ?aux espaces.

i:0(?v
v &l~<
\+l2(   ?
\&,12,+o;
Aaron
la source
1

05AB1E , 15 octets [non concurrentiel?]

.pvyDSÇOsg/îç}J

Essayez-le en ligne!

Urne de poulpe magique
la source
-2 octets en supprimant Det }, et en remplaçant spar y.
Kevin Cruijssen
1
@KevinCruijssen pour l'âge de cette réponse, il y a beaucoup plus que cela: P. .pest un 1byter maintenant aussi
Magic Octopus Urn
Ah lol, j'ai oublié ηxD
Kevin Cruijssen
1

Japt , 13 octets (non concurrent)

£T±Xc)/°Y r d

Testez-le en ligne!

Comment ça marche

£   T± Xc)/° Y r d
mXY{T+=Xc)/++Y r d}
                     // Implicit: U = input string, T = 0
mXY{              }  // Replace each char X and index Y in the string by this function:
    T+=Xc            //   Add X.charCodeAt() to T.
         )/++Y       //   Take T / (Y + 1).
               r d   //   Round, and convert to a character.
                     // Implicit: output result of last expression
ETHproductions
la source
Ah, les noix; Je pensais que le filtre "non concurrent" avait été supprimé du classement, donc je ne l'ai pas vu avant de poster ceci .
Shaggy
1

PHP , 176 octets

<?=(implode('',array_reduce(str_split($argv[1]),function($c,$k){array_push($c[1],chr(floor(((ord($k)+$c[0])/(count($c[1])+1))+0.5)));return[ord($k)+$c[0],$c[1]];},[0,[]])[1]));

Exemple:

>php cg.php Hello!
HW^adY
>php cg.php test  
tmop
>php cg.php 42
43

La plus grande solution jusqu'à présent, mais basée sur php, elle ne peut pas être beaucoup plus courte je pense. 2 octets pourraient être enregistrés en supprimant les sauts de ligne.

cb0
la source
Hmm, bon point. J'ai pensé que je pourrais les laisser dans le post pour une meilleure lisibilité. Mais oui, c'est du golf de code. Je vais les retirer;)
cb0
1
Vous pouvez toujours inclure une version supplémentaire avec rembourrage pour plus de lisibilité à côté de votre version courte. Je le fais souvent lorsque mon code est trop long pour être entièrement visible sur la plupart des moniteurs.
Wheat Wizard
0

JavaScript ES7, 122 octets

s=>String.fromCharCode(...[for(i of s)i.charCodeAt()].map((l,i,a)=>Math.round(eval((t=a.slice(0,++i)).join`+`)/t.length)))

Surtout tout se passe dans ce morceau

eval((t=a.slice(0,++i)).join`+`)/t.length)

Le reste est en boucle / conversion de code de caractère

Séparer:

s=> 
 String.fromCharCode(...                        ) // Converts average character code array to string, ... allows it to take an array
   [for(i of s)i.charCodeAt()]                    // Converts string to char code array
   .map((l,i,a)=>                             )   // Loops through each character
     Math.round(                    /t.length)    // Rounds sum of previous char codes, divides by position + 1
       eval(                       )              // evals string of char codes seperated with +
            (                ).join`+`            // joins previous char codes with +
             t=a.slice(0,++i)                     // creates an array with all the char codes

Si les fonctions ne sont pas autorisées:

alert(String.fromCharCode(...[for(i of prompt())i.charCodeAt()].map((l,i,a)=>Math.round(eval((t=a.slice(0,++i)).join`+`)/t.length))))

133 octets


Extrait ES5:

function _toConsumableArray(r){if(Array.isArray(r)){for(var e=0,t=Array(r.length);e<r.length;e++)t[e]=r[e];return t}return Array.from(r)}function _taggedTemplateLiteral(r,e){return Object.freeze(Object.defineProperties(r,{raw:{value:Object.freeze(e)}}))}var _templateObject=_taggedTemplateLiteral(["+"],["+"]),f,t=function t(s){return String.fromCharCode.apply(String,_toConsumableArray(function(){var r=[],e=!0,t=!1,a=void 0;try{for(var n,i=s[Symbol.iterator]();!(e=(n=i.next()).done);e=!0){var o=n.value;r.push(o.charCodeAt())}}catch(l){t=!0,a=l}finally{try{!e&&i["return"]&&i["return"]()}finally{if(t)throw a}}return r}().map(function(l,i,a){return Math.round(eval((f=a.slice(0,++i)).join(_templateObject))/f.length)})))};

// Demo
document.getElementById('go').onclick=function(){
  document.getElementById('output').innerHTML = t(document.getElementById('input').value)
};
<div style="padding-left:5px;padding-right:5px;"><h2 style="font-family:sans-serif">Average of Words Snippet</h2><div><div  style="background-color:#EFEFEF;border-radius:4px;padding:10px;"><input placeholder="Text here..." style="resize:none;border:1px solid #DDD;" id="input"><button id='go'>Run!</button></div><br><div style="background-color:#EFEFEF;border-radius:4px;padding:10px;"><span style="font-family:sans-serif;">Output:</span><br><pre id="output" style="background-color:#DEDEDE;padding:1em;border-radius:2px;overflow-x:auto;"></pre></div></div></div>

Downgoat
la source
0

Python 2, 106 octets

Ce n'est pas assez court. Comme c'est python, c'est beaucoup trop verbeux, vous pouvez même lire ce qu'il fait en regardant du code. Mais ça marche.

a=[.0]+[ord(i)for i in raw_input()]
print"".join([chr(int(.5+(sum(a[:i+1])/i)))for i in range(1,len(a))])
Hannes Karppila
la source
1
"Puisque c'est python c'est beaucoup trop verbeux" ... pas comparé à Java. Et je ne suis pas d'accord. Moins verbeux et ce ne serait pas aussi génial que ça. Utilisez Pyth si vous voulez moins verbeux.
mbomb007
0

Matlab, 43

Utilisation d'une fonction anonyme:

f=@(s)char(round(cumsum(+s)./(1:numel(s))))

Exemples:

>> f=@(s)char(round(cumsum(+s)./(1:numel(s))))
f = 
    @(s)char(round(cumsum(+s)./(1:numel(s))))

>> f('Hello!')
ans =
HW^adY

>> f('test')
ans =
tmop

>> f('42')
ans =
43

>> f('StackExchange')
ans =
Sdccd_ccccddd
Luis Mendo
la source
0

JavaScript ES6, 111 octets

w=>w.replace(/./g,(_,i)=>String.fromCharCode([for(f of w.slice(0,++i))f.charCodeAt()].reduce((a,b)=>a+b)/i+.5))

C'est énormément long, en partie grâce au long String.fromCharCodeet aux charCodeAtfonctions de JavaScript . L'extrait de pile contient du code testable non golfé, commenté.

f=function(w){
  return w.replace(/./g,function(e,i){
    return String.fromCharCode(w.slice(0,++i).split('').map(function(f){
      return f.charCodeAt()
    }).reduce(function(a,b){
      // Adds all numbers in the array
      return a+b
      // String.fromCharCode automatically floors numbers, so we add .5 to round up
    })/i+.5)
  })
}

run=function(){document.getElementById('output').innerHTML=f(document.getElementById('input').value)};document.getElementById('run').onclick=run;run()
<input type="text" id="input" value="Hello!" /><button id="run">Run</button><br />
<pre id="output"></pre>

NinjaBearMonkey
la source
0

Facteur, 80 octets

[ cum-sum [ dup zero? 1 0 ? + / ] map-index [ .5 + floor >fixnum ] map >string ]
chat
la source