Berechnen Sie die durchschnittlichen Zeichen der Zeichenfolge

24

Aufgabe

Ihre Aufgabe ist es, eine Zeichenfolge zu erstellen, die durchschnittliche Zeichenfolgen enthält. Das erste Zeichen des Ergebnisses wäre das Durchschnittszeichen des ersten Zeichens (das das erste Zeichen ist) und das Durchschnittszeichen des zweiten Zeichens von zwei ersten Zeichen und so weiter.

Was ist durchschnittlicher Charakter?

Strings sind Arrays von Bytes. Durchschnittlicher Charakter einer Zeichenfolge kann ermittelt werden, indem der Durchschnitt der ASCII-Werte der Zeichen in der Zeichenfolge berechnet und das entsprechende ASCII-Zeichen verwendet wird.

Beispielsweise "Hello!"kann eine Zeichenfolge als Bytefolge geschrieben werden 72 101 108 108 111 33. Der Durchschnitt der ASCII-Werte liegt bei 533/6 = 88.833 ... und wenn es auf die nächste Ganzzahl gerundet wird, erhalten wir 89, einen ASCII-Code für einen GroßbuchstabenY .

Regeln

  • Sie können davon ausgehen, dass die Eingabe nur druckbare ASCII-Zeichen enthält
  • Die Eingabe kann von stdin oder als Befehlszeilenargument oder als Funktionsargument gelesen werden
  • Die Ausgabe muss stdout sein. Wenn Ihr Programm funktioniert, können Sie auch die Zeichenfolge zurückgeben, die Sie andernfalls drucken würden.
  • Es muss ein ganzes Programm oder eine ganze Funktion sein, kein Snippet
  • Standard-Schlupflöcher gelten
  • Ganzzahlen werden durch Funktion floor(x+0.5)oder ähnliche Funktion gerundet .

Wie gewinne ich?

Dies ist , also kürzeste Antwort (in Bytes) in Gewinnen.

Beispiele

  • Hello!HW^adY
  • testtmop
  • 4243
  • StackExchangeSdccd_ccccddd
Hannes Karppila
quelle
Bearbeitete Frage Jetzt sollte klar sein: Man muss die Hälften nach oben runden.
Hannes Karppila
1
" Eingaben können von stdin oder als Kommandozeilenargumente gelesen werden ": oder als Funktionsargumente (da Sie Funktionen erlauben), richtig?
Luis Mendo
Natürlich nochmal bearbeitet.
Hannes Karppila
2
Tut mir leid, dass Sie noch einmal gestört haben, aber müssen Funktionen die Ausgabe tatsächlich an STDOUT ausgeben oder können sie den gewünschten String zurückgeben?
Dennis
Sorry, habe vergessen, das vorher zu bearbeiten. Jetzt sollte es ok sein.
Hannes Karppila

Antworten:

11

Brainfuck 106 Bytes

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

Dies ist meine erste Teilnahme an einem Code-Golf, bitte seien Sie vorsichtig! Es funktioniert, aber Brainfuck kann keine Floats verarbeiten (was mir nicht bekannt ist), sodass der gerundete Wert immer der niedrigste ist (möglicherweise wird mein Algorithmus später korrigiert).

Außerdem mittelt der Algorithmus die Werte 2 mal 2, was bedeutet, dass er an einigen Stellen ungenau sein kann. Und ich muss einen Fehler beheben, der auch eine Zahl am Ende der Ausgabe ausgibt.

Roter Panda
quelle
9

Pyth, 16 Bytes

smCs+.5csaYCdlYz

Ziemlich einfach. Verwenden s+.5statt Runden, weil round(0.5, 0)in Python aus irgendeinem Grund 0 ist.

orlp
quelle
1
Python 3 rundet die Hälfte in Richtung Gerade, wodurch weniger Verzerrung entsteht. Die Frage gibt nicht explizit an, wie die Hälften gerundet werden sollen, daher habe ich das OP um Klärung gebeten.
Dennis
Bearbeitete Frage 0.5gerundet sein sollte 1.
Hannes Karppila
7

Q, 15 12 Bytes

12 Bytes als Ausdruck

"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"

oder 15 Bytes als Funktion

{"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"

Nutzt

  1. Der Cast "i" $, um einen String (eine Liste von Zeichen) in eine Liste von Ganzzahlen umzuwandeln
  2. die avgs-Funktion, die den laufenden Durchschnitt einer Liste als eine Liste von Gleitkommazahlen berechnet
  3. Der Cast "c" $, um eine Liste von Gleitkommazahlen in eine Liste von Zeichen umzuwandeln. Dabei wird jede Gleitkommazahl automatisch auf die nächste Ganzzahl gerundet, bevor dies ausgeführt wird "$ 99.4) = (" c "$ 99)]
scottstein37
quelle
Benötigt Q hier den Funktions-Wrapper oder kommt man nur mit dem impliziten Ausdruck davon "c"$avgs"i"$? Ich glaube nicht, dass eine Lösung einfacher sein könnte. :)
JohnE
Sie haben Recht - Sie benötigen keinen Funktionswrapper, da "c" $ avgs "i" $ "Hello!" funktioniert gut
scottstein37
Ich denke, Sie können 2 Bytes sparen, indem Sie "c"zu "c" und "i""i" wechseln .
kirbyfan64sos
ich glaube leider nicht, dass das funktioniert. Um die Symboltypdarstellung für das Casting zu verwenden, müsste ich "char" und "int" gemäß code.kx.com/wiki/JB:QforMortals2/ verwenden das würde keine Bytes sparen - 10h ist die gleiche Länge wie "c" und das Ersetzen von "i" durch 6h erfordert ein Leerzeichen am Ende, wodurch sie auch die gleiche Länge haben.
Scottstein37
4

CJam, 19 Bytes

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

Versuchen Sie es online in dem CJam Dolmetscher .

Dennis
quelle
4

Perl: 31 30 Zeichen

(29 Zeichen Code + 1 Zeichen Befehlszeilenoption.)

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

Probelauf:

bash-4.3$ perl -pe 's!.!chr.5+($s+=ord$&)/++$c!ge' <<< 'StackExchange'
Sdccd_ccccddd
Mann bei der Arbeit
quelle
3

C # 189 135 134 106 Bytes

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

Kann hier gesehen werden

Zum ersten Mal Golfspieler

Alex Carlsen
quelle
2

K, 36 Bytes

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

Verwendung:

  `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

_ciund _ickonvertieren ASCII in Zeichen und umgekehrt.{(+/x)%#x}ist ein klassisches K-Idiom zur Mittelwertbildung. Insgesamt ziemlich unkompliziert.

Edit: oh, die Spezifikation falsch verstanden. `0: wird benötigt, um das Ergebnis auf stdout zu drucken. Warten auf Klärung der Eingabe bezüglich. Dennis 'Frage.

JohnE
quelle
Wenn Sie K5 verwenden, kann dies zu 35 Bytes verkürzt werden: {[s]`0:`c${_.5+(+/u)%#u:x#s}'1+!#s}.
kirbyfan64sos
Oder 30:`0:`c$_.5+{(+/x)%#x}'1_|(-1_)\
JohnE
`c$_.5+{(+\x)%+\~^x}`i$für 24. Es könnte kürzer sein ( `c$`i${(+\x)%+\~^x}`i$), aber Ihre REPL ( johnearnest.github.io/ok/index.html ) rundet nicht richtig, wenn Sie von float nach int umwandeln . Ich würde zögern, diese ak-Lösung zu nennen, da _ciund _icnirgendwo in der K5-Spezifikation sind, soweit ich das 0:beurteilen kann, während nicht auf stdout gedruckt wird, sondern stattdessen eine txt-Datei von der Festplatte gelesen wird.
Tmartin
@tmartin: richtig- _ciund _icwerden in K5 komplett durch die Formulare wie ersetzt `c$. Die ursprüngliche Lösung, die ich veröffentlicht habe, ist mit Kona kompatibel, das auf K2 / K3 basiert. Ich versuche im Allgemeinen, keine Lösungen mit OK zu veröffentlichen, da sich die Semantik immer noch ändert und teilweise ungenau ist.
JohnE
1
Ah, ich verstehe, macht Sinn für mich. Ich dachte, das wäre eine andere K5-Lösung. Hier ist eine 28 `0:_ci_0.5+{(+\x)%1.+!#x}_ic
Zeichen
2

Mathematica, 75 Bytes

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

Julia, 85 81 Bytes

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

Dadurch wird eine unbenannte Funktion erstellt, die eine Zeichenfolge akzeptiert und einen Vektor der ASCII-Codepunkte erstellt. Für jede sequenzielle Gruppe werden Mittelwerte genommen, auf ganze Zahlen gerundet, in Zeichen umgewandelt, zu einer Zeichenfolge verbunden und nach STDOUT gedruckt.

Alex A.
quelle
2

Rubin, 46

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

ideone .

Als ich mich bei w0lf entschuldigte, fiel meine Antwort so unterschiedlich aus, dass es sich zu lohnen schien, sie zu posten.

$<.bytesiteriert über jedes Byte in stdin, sodass wir den gleitenden Durchschnitt in jeder Schleife ausgeben. '% c' konvertiert einen Gleitkommawert in ein Zeichen, indem es abgerundet und das ASCII-Zeichen verwendet wird. Alles, was wir tun müssen, ist, 0,5 zu addieren, damit es richtig gerundet wird. $.ist eine magische Variable, die mit 0 initialisiert beginnt - sie soll die Zeilenzählung speichern, aber da wir hier die Bytezählung wollen, erhöhen wir sie nur manuell.

Histokrat
quelle
2

Mathcad, 60 "Bytes"

Bildbeschreibung hier eingeben

Mathcad ist eine mathematische Anwendung, die auf 2D-Arbeitsblättern basiert, die aus "Bereichen" bestehen, von denen jeder Text, ein mathematischer Ausdruck, ein Programm, ein Plot oder eine Skriptkomponente sein kann.

Eine mathematische oder Programmieranweisung wird aus einer Palettensymbolleiste ausgewählt oder über eine Tastenkombination eingegeben. Für Golfzwecke wird eine Operation ("Byte") als die Anzahl der Tastaturoperationen angesehen, die zum Erstellen eines Namens oder Ausdrucks erforderlich sind (um beispielsweise die Variable a auf 3 zu setzen, schreiben wir a: = 3. Der Definitionsoperator : = ist ein einziger Tastendruck ":", ebenso wie a und 3, was insgesamt 3 "Bytes" ergibt. Die Programmierung für ergibt Operator erfordert die Eingabe von ctl-shft- # (oder eines einzelnen Klicks auf die Programmiersymbolleiste), was wiederum gleichbedeutend mit ist 1 Byte.

In Mathcad gibt der Benutzer Programmiersprachenbefehle über Tastaturkürzel ein (oder wählt sie aus der Programmiersymbolleiste aus), anstatt sie in Text zu schreiben. Wenn Sie beispielsweise ctl-] eingeben, wird ein while-Schleifenoperator erstellt, der zwei "Platzhalter" für die Eingabe der Bedingung und eine einzelne Zeile des Körpers enthält. Wenn Sie = am Ende eines Mathcad-Ausdrucks eingeben, wird der Ausdruck von Mathcad ausgewertet.

(Anzahl der Bytes) Wenn Sie dies aus der Perspektive der Benutzereingabe betrachten und eine Mathcad-Eingabeoperation (normalerweise Tastatur, Mausklick auf die Symbolleiste, wenn keine KBD-Verknüpfung vorhanden ist) mit einem Zeichen gleichsetzen und dies als Byte interpretieren. csort = 5 Bytes, da es char-by-char geschrieben wird, ebenso wie andere Variablen- / Funktionsnamen. Der Operator for ist ein spezielles Konstrukt, das 11 Zeichen (einschließlich 3 leerer "Platzhalter" und 3 Leerzeichen) belegt, jedoch mit der Tastenkombination ctl-shft- # eingegeben wird, also = 1 Byte (in einigen Sprachen ähnlich wie Token). Wenn Sie '(Anführungszeichen) eingeben, werden (normalerweise) ausgeglichene Klammern erstellt. Dies entspricht 1 Byte. Indizierung von v = 3 Bytes (Typ v [k).

Stuart Bruff
quelle
2

Python 3, 66 Bytes

Wenn ich round()anstelle von int(.5+usw. verwende, speichert es ein Zeichen, entspricht aber technisch nicht der Herausforderung: Pythonsround() Runden halbieren sich auf die nächste gerade ganze Zahl, nicht aufwärts. Es funktioniert jedoch bei allen Sample-Eingaben korrekt.

Ich fühle mich auch ein bisschen dreckig, weil ich die Ausgabe nicht mit einem Zeilenumbruch beendet habe, aber die Herausforderung erfordert das nicht ...

n=t=0
for c in input():n+=1;t+=ord(c);print(end=chr(int(.5+t/n)))
Tim Pederick
quelle
1
Wenn Sie n vor dem Drucken inkrementieren, können Sie es vermeiden, es bis zum 1.
24.
1
@ xnor: Gesicht, Handfläche. Handfläche, Gesicht. Vielen Dank für den Hinweis.
Tim Pederick
tun print(end=chr(int(...)), um einige Bytes zu speichern
FlipTack
@ Flp.Tkc: Danke! Antwort aktualisiert.
Tim Pederick
2

JavaScript (ES6), 75 Byte

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>

Ich kann nicht glauben, dass es mit dieser Technik noch keine Antwort von JS gibt ...

ETHproductions
quelle
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

Aktualisiert mit jedem neuen Zeichen die Zeichensumme sund die Anzahl der Zeichen i, um das durchschnittliche Zeichen zu berechnen und anzufügen.

xnor
quelle
Fast genau der gleiche Ansatz wie bei mir, nur Python 2 statt 3 und Stunden zuvor gepostet: +1. (Außerdem habe ich festgestellt, dass ich ein paar Bytes beim Drucken der einzelnen Zeichen gespart habe, anstatt sie für ein Finale zu speichern print. Funktioniert das mit Python 2? Ich vergesse gerade, wie man Zeilenumbrüche in der printAnweisung unterdrückt ... Komma macht es zu einem Leerzeichen Stattdessen, richtig?)
Tim Pederick
Python 2 kann print _,Leerzeichen anstelle von Zeilenumbrüchen hinterlassen, aber keine gute Möglichkeit, das Leerzeichen wegzulassen. Guter Anruf mit dem endArgument von Python 3, das hatte ich vergessen.
Xnor
@TimPederick Vielleicht könnte das Backspace-Steuerelement für ein Terminal, das es verwendet, als Hack zum Löschen des Leerzeichens print'\b'+_,
gerechtfertigt sein
1

Ruby 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
quelle
1
c+=1;(s/c)(s/c+=1) ideone.com/H2tB9W
manatwork
@manatwork Gut gesehen! Vielen Dank! Ich habe die Änderung übernommen.
Cristian Lupascu
1

Java, 100

Ähnlich wie bei vielen anderen Antworten hier summiere und mittle ich in einer Schleife. Nur hier, um Java zu repräsentieren :)

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];}

Mein ursprünglicher Code ist eine 97, aber er gibt nur den geänderten Code zurück, char[]anstatt ihn zu drucken:

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;}

Jetzt ist es gerade lang genug, damit Bildlaufleisten für mich angezeigt werden. Deshalb hier eine Version mit einigen Zeilenumbrüchen, nur weil:

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];
}
Geobits
quelle
Interessant. Können Sie uns auch ein Anrufmuster zeigen? Mein Java ist sehr rostig.
Manatwork
Wie soll man es nennen? Angenommen, es testhandelt sich um ein Zeichen-Array, verwenden Sie einfach f(test);. Wenn es sich um ein String-Objekt handelt, würden Sie es verwenden f(test.toCharArray());. Auch String-Literale sind in Ordnung:f("Hello!".toCharArray());
Geobits
Oh. Sicher. toCharArray()Ich bin dumm, ich habe versucht, es mit einem Casting zu verletzen. Vielen Dank.
Manatwork
Es wäre viel zu einfach, es einfach zu besetzen. Die Java-Götter wären wütend: P
Geobits
1

C 62 Bytes

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

(ideone link)

Die Ergebnisse unterscheiden sich geringfügig von den Beispielen des OP, jedoch nur, weil dieser Code 0,5 nach unten statt nach oben rundet. Nicht mehr!

zimperliches Ossifrage
quelle
1

R 135 127 Bytes

Das wurde sehr schnell lang und ich habe es beim ersten Mal wirklich falsch verstanden :) Ich muss die Fragen richtig lesen.

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

Testlauf

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
quelle
Jemand hat eine betrügerische Herausforderung in die Sandbox gestellt, also habe ich das hier gefunden ... Das ist schon lange her, aber utf8ToIntes hilft! Ich habe ein 68-Byte-Golf davon, wenn Sie es aktualisieren möchten.
Giuseppe
@ Giuseppe Mach weiter und poste es selbst, wenn du möchtest. Ich vermute, dass es sich erheblich von dem unterscheidet, was ich hier gemacht habe.
MickyT
1

Perl 5, 41 Bytes

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

Rennen wie

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

TSQL, 118 Bytes

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

Zeichen werden vertikal zurückgegeben

S
d
c
c
d
_
c
c
c
c
d
d
d
t-clausen.dk
quelle
1

> <> 30 Bytes

i:0(?v
v &l~<
\+l2(?
\&,12,+o;
  • Die erste Zeile liest von stdin und legt die Zeichen auf den Stapel
  • Der zweite entfernt das EOL - Zeichen, nimmt die Größe des Stapels und legt ihn in den & Register
  • In der dritten Zeile werden Zahlen auf dem Stapel hinzugefügt, während zwei oder mehr davon vorhanden sind
  • Die vierte Zeile teilt die resultierende Zahl durch den Wert des Registers, addiert 1/2, gibt den Wert als Zeichen aus und stoppt. Wenn bei der Anzeige eines Zeichens ein Gleitkommawert angezeigt wird, wird dieser von> <> unterschritten. Aus diesem Grund haben wir 1/2 hinzugefügt

Sie können es mit dem Online-Interpreter versuchen, müssen jedoch die folgende Version verwenden, da der Online-Interpreter das Codefeld in ein Rechteck einfügt und ?auf Leerzeichen angewendet wird.

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

05AB1E , 15 Byte [Nicht konkurrierend?]

.pvyDSÇOsg/îç}J

Probieren Sie es online!

Magische Kraken-Urne
quelle
-2 Bytes , die durch das Entfernen Dund }und Ersetzen smit y.
Kevin Cruijssen
1
@ KevinCruijssen für wie alt diese Antwort ist, gibt es viel mehr als das: P. .pist jetzt auch ein 1byter
Magic Octopus Urn
Ah lol, ηxD vergessen
Kevin Cruijssen
1

Japt , 13 Bytes (nicht konkurrierend)

£T±Xc)/°Y r d

Testen Sie es online!

Wie es funktioniert

£   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
quelle
Ah, Nüsse; Ich dachte, der "nicht konkurrierende" Filter wurde aus der Bestenliste entfernt, also habe ich das nicht gesehen, bevor ich das gepostet habe .
Shaggy
1

PHP , 176 Byte

<?=(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]));

Beispiel:

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

Die bisher größte Lösung, aber basierend auf PHP kann sie meiner Meinung nach nicht viel kürzer werden. Durch Entfernen der Zeilenumbrüche können 2 Byte gespart werden.

cb0
quelle
Hmm, guter Punkt. Ich dachte, ich lasse sie zur besseren Lesbarkeit in der Post. Aber ja, das ist Codegolf. Ich werde sie entfernen;)
cb0
1
Neben der kurzen Version können Sie jederzeit eine zusätzliche Version mit Auffüllung zur besseren Lesbarkeit hinzufügen. Ich mache das oft, wenn mein Code zu lang ist, um auf den meisten Monitoren vollständig sichtbar zu sein.
Wheat Wizard
0

JavaScript ES7, 122 Byte

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

Meistens passiert alles in diesem Bereich

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

Der Rest ist Schleifen- / Zeichencodeumwandlung

Aufteilen:

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

Wenn Funktionen nicht erlaubt sind:

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 Bytes


ES5-Snippet:

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
quelle
0

Python 2, 106 Bytes

Es ist nicht kurz genug. Da es sich um Python handelt, das viel zu ausführlich ist, können Sie sogar lesen, was es tut, indem Sie sich den Code ansehen. Aber es funktioniert.

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
quelle
1
"Da es sich um Python handelt, ist es viel zu ausführlich" ... nicht im Vergleich zu Java. Und ich bin anderer Meinung. Weniger ausführlich und es wäre nicht so großartig wie es ist. Verwenden Sie Pyth, wenn Sie weniger ausführlich möchten.
mbomb007
0

Matlab, 43

Verwenden einer anonymen Funktion:

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

Beispiele:

>> 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
quelle
0

JavaScript ES6, 111 Bytes

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

Dies ist ärgerlich lange, auch dank der langen String.fromCharCodeund charCodeAtFunktionen von JavaScript . Das Stack-Snippet enthält unbenutzten, kommentierten, testbaren Code.

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
quelle
0

Faktor 80 Bytes

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