Oblicz średnie znaki ciągu


24

Zadanie

Twoim zadaniem jest wytworzenie ciągu zawierającego przeciętne znaki ciągu. Pierwszy znak wyniku byłby średnim znakiem pierwszego znaku (który jest pierwszym znakiem), a drugi znak średnio dwóch pierwszych znaków i tak dalej.

Co to jest przeciętny charakter?

Ciągi to tablice bajtów. Średni znak ciągu można znaleźć, obliczając średnią wartości ASCII znaków w ciągu i biorąc odpowiedni znak ASCII.

Na przykład ciąg "Hello!"może być zapisany jako sekwencja bajtów 72 101 108 108 111 33. Średnia z wartości ascii wynosi 533/6 = 88,833 ... a gdy zostanie zaokrąglona do najbliższej liczby całkowitej, otrzymamy 89, co jest kodem ascii dla litery oznaczonej literą Y.

Zasady

  • Możesz założyć, że dane wejściowe zawierają tylko drukowalne znaki ASCII
  • Dane wejściowe można odczytać ze stdin lub jako argumenty wiersza poleceń lub jako argumenty funkcji
  • Wyjście musi być standardowe. Jeśli twój program działa, możesz również zwrócić ciąg, który w innym przypadku wydrukowałbyś.
  • Musi to być cały program lub funkcja, a nie fragment kodu
  • Standardowe luki zastosowanie
  • Liczby całkowite są zaokrąglane według funkcji floor(x+0.5)lub podobnej funkcji.

Jak wygrać?

To jest , więc najkrótsza odpowiedź (w bajtach) w zwycięstwach.

Przykłady

  • Hello! → HW^adY
  • test → tmop
  • 42 → 43
  • StackExchange → Sdccd_ccccddd

Edytowane pytanie. Teraz powinno być jasne: musisz zaokrąglić połówki w górę.
— Hannes Karppila

1
„Dane wejściowe mogą być odczytywane ze standardowego wejścia lub jako argumenty wiersza poleceń ”: lub jako argumenty funkcji (ponieważ zezwalasz na funkcje), prawda?
— Luis Mendo,

Oczywiście edytowane ponownie.
— Hannes Karppila

2
Przepraszam, że przeszkadzam jeszcze raz, ale czy funkcje rzeczywiście muszą wypisywać dane wyjściowe do STDOUT, czy mogą zwrócić żądany ciąg?
— Dennis

Przepraszam, zapomniałem go wcześniej edytować. Teraz powinno być dobrze.
— Hannes Karppila

Odpowiedzi:


11

Brainfuck 106 bajtów

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

To mój pierwszy udział w golfie kodowym, proszę, bądź delikatny! Działa, ale pieprzenie mózgu nie radzi sobie z liczbami zmiennoprzecinkowymi (nie wiem o tym), więc zaokrąglona wartość jest zawsze dolna (może naprawić mój algorytm później).

Ponadto algorytm uśrednia wartości 2 na 2, co oznacza, że ​​w niektórych miejscach może być niedokładny. I muszę naprawić błąd, który wypisuje również liczbę na końcu danych wyjściowych.


9

Pyth, 16 bajtów

smCs+.5csaYCdlYz

Całkiem proste. Używanie s+.5zamiast zaokrąglania, ponieważ z jakiegoś powodu round(0.5, 0)w Pythonie jest 0.


1
Python 3 zaokrągla połowę w stronę parzystej, co wprowadza mniejszą tendencję. Pytanie nie określa wprost, w jaki sposób należy zaokrąglać połówki, dlatego poprosiłem o wyjaśnienie w PO.
— Dennis

Edytowane pytanie. 0.5zaokrąglone powinno być 1.
— Hannes Karppila

7

Q, 15 12 bajtów

12 bajtów jako wyrażenie

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

lub 15 bajtów jako funkcja

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

wykorzystuje

  1. rzut „i” $ do konwersji ciągu (listy znaków) na listę liczb całkowitych
  2. funkcja avgs, która oblicza średnią bieżącą listy jako listę liczb zmiennoprzecinkowych
  3. rzut „c” $ do konwersji listy liczb zmiennoprzecinkowych na listę znaków i który automatycznie zaokrągla każdą liczbę zmiennoprzecinkową do najbliższej liczby całkowitej przed zrobieniem tego [tj. („c” 99,5 $) = („c” 100 $) i („c „99,4 USD) = („ c ”99 USD)]

Czy Q wymaga tutaj otoki funkcji, czy potrafisz uciec od zwykłego wyrażenia "c"$avgs"i"$? Nie sądzę, aby rozwiązanie mogło stać się o wiele prostsze. :)
— JohnE

masz rację - nie potrzebujesz opakowania funkcji, ponieważ „c” $ avgs ”i„ $ „Hello!” działa dobrze
— scottstein37

Myślę, że możesz zaoszczędzić 2 bajty, zmieniając "c"na `c i "i"na 'i.
— kirbyfan64sos

nie sądzę, że to działa. Aby użyć reprezentacji typu symbolu do rzutowania, musiałbym użyć `char i` int zgodnie z code.kx.com/wiki/JB:QforMortals2 /... Zastanawiałem się nad użyciem 10h i 6h zamiast „c” i „i”, ale nie zaoszczędziłoby to żadnych bajtów - 10h ma taką samą długość jak „c”, a podstawienie 6h na „i” wymaga spacji końcowej, co czyni je również taką samą długością.
— scottstein37


4

Perl: 31 30 znaków

(Kod 29 znaków + opcja wiersza poleceń 1 znak).

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

Przykładowy przebieg:

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

3

C # 189 135 134 106 bajtów

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

Można zobaczyć tutaj

Pierwszy raz golfista


2

K, 36 bajtów

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

Stosowanie:

  `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

_cii _ickonwertować odpowiednio ascii na znaki i odwrotnie.{(+/x)%#x}jest klasycznym idiomem K do obliczania średniej. Całkiem proste.

Edycja: och, źle odczytałem specyfikację. `0: jest potrzebne do wydrukowania wyniku na standardowe wyjście. Oczekiwanie na wyjaśnienie na temat danych wejściowych. Pytanie Dennisa.


Jeśli używasz K5, może zostać skrócony do 35 bajtów: {[s]`0:`c${_.5+(+/u)%#u:x#s}'1+!#s}.
— kirbyfan64sos

Lub 30:`0:`c$_.5+{(+/x)%#x}'1_|(-1_)\
— JohnE

`c$_.5+{(+\x)%+\~^x}`i$dla 24. Może być krótszy ( `c$`i${(+\x)%+\~^x}`i$), ale twoja REPL ( johnearnest.github.io/ok/index.html ) nie zaokrągla poprawnie podczas rzutowania z float na int. Będę wahał się nazwać ak rozwiązanie, ponieważ _cii _icnigdzie w specyfikacji K5 O ile mi wiadomo, natomiast 0:nie drukuje na stdout lecz odczytuje plik txt z dysku.
— tmartin

@tmartin: correct- _cii _icsą całkowicie zastąpione w K5 formularzami podobnymi `c$. Oryginalne rozwiązanie, które opublikowałem, jest zgodne z Kona, która jest oparta na K2 / K3. Zasadniczo staram się nie publikować rozwiązań za pomocą OK, ponieważ semantyka wciąż się zmienia i jest częściowo niedokładna.
— JohnE

1
Ach, rozumiem, ma to dla mnie sens. Uznałem, że to kolejne rozwiązanie K5. Oto rozwiązanie 28 char kona`0:_ci_0.5+{(+\x)%1.+!#x}_ic
— tartart

2

Mathematica, 75 bajtów

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

2

Julia, 85 81 bajtów

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

Tworzy to nienazwaną funkcję, która akceptuje ciąg znaków i tworzy wektor punktów kodowych ASCII. Dla każdej sekwencyjnej grupy są pobierane środki, zaokrąglane do liczb całkowitych, konwertowane na znaki, łączone w łańcuch i drukowane do STDOUT.


2

Ruby, 46

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

ideone .

Z przeprosinami dla w0lf moja odpowiedź okazała się na tyle inna, że ​​wydawało się, że warto ją opublikować.

$<.bytesiteruje się na każdym bajcie w stdin, więc wypisujemy średnią kroczącą w każdej pętli. '% c' przekształca liczbę zmiennoprzecinkową w postać, zaokrąglając w dół i biorąc ASCII, więc wystarczy dodać 0,5, aby poprawnie zaokrąglić. $.to magiczna zmienna, która zaczyna się od zinicjowania na 0 - ma przechowywać liczbę linii, ale ponieważ tutaj chcemy liczby bajtów, zwiększamy ją ręcznie.


2

Mathcad, 60 „bajtów”

wprowadź opis zdjęcia tutaj

Mathcad to aplikacja matematyczna oparta na arkuszach 2D składających się z „regionów”, z których każdy może być tekstem, wyrażeniem matematycznym, programem, fabułą lub komponentem skryptowym.

Instrukcja matematyczna lub programowa jest wybierana z paska narzędzi palety lub wprowadzana za pomocą skrótu klawiaturowego. Do celów gry w golfa przyjmuje się, że operacja („bajt”) to liczba operacji na klawiaturze niezbędnych do utworzenia nazwy lub wyrażenia (na przykład, aby ustawić zmienną a na 3, napisalibyśmy a: = 3. Operator definicji : = to pojedyncze naciśnięcie klawisza „:”, podobnie jak a i 3, co daje w sumie 3 „bajty”. Programowanie dla operatora wymaga wpisania ctl-shft- # (lub pojedynczego kliknięcia na pasku narzędzi programistycznych), więc znowu jest to równoważne z 1 bajt.

W Mathcad użytkownik wprowadza polecenia języka programowania za pomocą skrótów klawiaturowych (lub wybierając je z paska narzędzi programistycznych) zamiast pisać je w tekście. Na przykład wpisanie ctl-] tworzy operator pętli while, który ma dwa „symbole zastępcze” odpowiednio do wprowadzenia warunku i jedną linię treści. Wpisanie = na końcu wyrażeń Mathcada powoduje, że Mathcad ocenia to wyrażenie.

(Policz bajty) Patrząc na to z perspektywy wprowadzania przez użytkownika i zrównując jedną operację wprowadzania Mathcada (zwykle klawiatura, kliknij pasek narzędzi, jeśli nie ma skrótu kbd) do znaku i interpretuj to jako bajt. csort = 5 bajtów, ponieważ jest wpisany char-by-char, podobnie jak inne nazwy zmiennych / funkcji. Operator for to specjalna konstrukcja, która zajmuje 11 znaków (w tym 3 puste „symbole zastępcze” i 3 spacje), ale jest wprowadzana przez ctl-shft- #, stąd = 1 bajt (podobny do tokenów w niektórych językach). Wpisanie „(cytat) tworzy zrównoważone nawiasy (zwykle), więc liczy się jako 1 bajt. Indeksowanie v = 3 bajty (wpisz v [k).


2

Python 3, 66 bajtów

Jeśli użyję round()zamiast int(.5+itp., Zapisuje jedną postać, ale technicznie nie jest zgodna z wyzwaniem: Pythonaround() rundy zmniejszane o połowę do najbliższej parzystej liczby całkowitej, a nie w górę. Działa jednak poprawnie na wszystkich przykładowych danych wejściowych.

Czuję się trochę brudny, że nie kończę produkcji nową linią, ale wyzwanie nie wymaga tego ...

n=t=0
for c in input():n+=1;t+=ord(c);print(end=chr(int(.5+t/n)))

1
Jeśli zwiększysz n przed drukowaniem, możesz uniknąć dostosowania go o 1.
— xnor.

1
@xnor: Twarz, dłoń. Dłoń, twarz. Dzięki za zwrócenie na to uwagi.
— Tim Pederick,

zrobić, print(end=chr(int(...))aby zapisać niektóre bajty
— FlipTack,

@ Flp.Tkc: Dzięki! Odpowiedź zaktualizowana.
— Tim Pederick,

2

JavaScript (ES6), 75 bajtów

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>

Nie mogę uwierzyć, że nie ma jeszcze odpowiedzi JS tą techniką ...


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

Z każdym nowym znakiem aktualizuje sumę znaków si liczbę znaków ido obliczenia i dołączenia przeciętnego znaku.


Prawie dokładnie takie samo podejście jak moje, tylko Python 2 zamiast 3 i opublikowany kilka godzin wcześniej: +1. (Poza tym odkryłem, że zapisałem kilka bajtów, wypisując każdy znak w takiej postaci, w jakiej się pojawił, zamiast przechowywać go w jednym finale print. Czy to zadziała z Pythonem 2? Zapomniałem właśnie, jak tłumić znaki nowej linii w printwyciągu ... przecinek czyni to spacją zamiast tego, prawda?)
— Tim Pederick

Python 2 może zrobić, print _,aby zostawić spację zamiast znaku nowej linii, ale nie ma dobrego sposobu na pominięcie spacji. Dobra rozmowa z endargumentem Pythona 3 , zapomniałem o tym.
— xnor

@TimPederick Może kontrola backspace może być uzasadniona dla terminala, który z niej korzysta, jako włamanie do usunięcia miejsca:print'\b'+_,
— xnor


1

Java, 100

Podobnie jak wiele innych odpowiedzi tutaj, sumuję i uśredniam w pętli. Właśnie tutaj reprezentuję Javę :)

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

Mój oryginalny kod to 97, ale zwraca tylko zmodyfikowany, char[]zamiast go wydrukować:

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

Teraz, to tylko na tyle długo, aby pojawić się paski przewijania dla mnie, więc oto wersja z przerwami linii, tylko dlatego, że:

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

Ciekawy. Czy możesz nam też pokazać próbkę połączenia? Moja Java jest bardzo zardzewiała.
— manatwork

Jak w jak to nazwać? Zakładając, że testjest tablicą znaków, po prostu użyj f(test);. Jeśli jest to obiekt String, wówczas możesz użyć f(test.toCharArray());. Literały łańcuchowe też są w porządku:f("Hello!".toCharArray());
— Geobits

O. Pewnie. toCharArray()Głupi, próbowałem to pogodzić z jakimś castingiem. Dziękuję Ci.
— manatwork

Zbyt łatwo byłoby po prostu rzucić. Bogowie Jawy byliby wściekli: P
— Geobits

1

C, 62 bajty

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

(link ideone)

Wyniki nieznacznie różnią się od przykładów PO, ale tylko dlatego, że ten kod zaokrągla 0,5 w dół zamiast w górę. Nigdy więcej!


1

R 135 127 bajtów

Trwało to bardzo szybko i naprawdę źle pomyliłem się za pierwszym razem :) Muszę poprawnie przeczytać pytania.

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

Testowe uruchomienie

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

ktoś opublikował wyzwanie dupe w piaskownicy, więc znalazłem to ... To był długi czas temu, ale utf8ToIntpomoże! Mam 68 bajtów tego golfa, jeśli chcesz go zaktualizować.
— Giuseppe,

@Giuseppe Śmiało i opublikuj go sam, jeśli chcesz. Podejrzewam, że znacznie różni się od tego, co tutaj zrobiłem.
— MickyT,

1

Perl 5, 41 bajtów

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

Uruchom jako

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

1

TSQL, 118 bajtów

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

Znaki zwracane w pionie

S
d
c
c
d
_
c
c
c
c
d
d
d

1

> <> , 30 bajtów

i:0(?v
v &l~<
\+l2(?
\&,12,+o;
  • Pierwszy wiersz odczytuje ze standardowego wejścia i umieszcza znaki na stosie
  • Drugi usunie znak EOL, weź rozmiar stosu i umieści go w & rejestrze
  • Trzecia linia doda liczby do stosu, gdy będą ich dwa lub więcej
  • Czwarty wiersz podzieli wynikową liczbę przez wartość rejestru, a następnie doda 1/2, wyśle ​​wartość jako znak i zatrzyma się. W obliczu wartości zmiennoprzecinkowej podczas wyświetlania znaku,> <> wyrówna go, dlatego dodaliśmy 1/2

Możesz go wypróbować na tłumaczu online, ale musisz użyć następującej wersji, ponieważ tłumacz online wypełnia pole kodu prostokątem i stosuje się ?do spacji.

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


1

Japt , 13 bajtów (niekonkurujące)

£T±Xc)/°Y r d

Przetestuj online!

Jak to działa

£   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

Ach, orzechy; Myślałem, że filtr „niekonkurujący” został usunięty z tablicy wyników, więc nie widziałem tego przed opublikowaniem tego .
— Shaggy,


1

PHP , 176 bajtów

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

Przykład:

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

Największe jak dotąd rozwiązanie, ale myślę, że oparte na php nie może być znacznie krótsze. 2 bajty można zapisać, usuwając znaki nowego wiersza.


Hmm, dobra racja. Pomyślałem, że mogę zostawić je w poście dla lepszej czytelności. Ale tak, to jest golf golfowy.
— Usunę

1
Zawsze możesz dołączyć dodatkową wersję z dopełnieniem dla czytelności obok swojej krótkiej. Często robię to, gdy mój kod jest zbyt długi, aby był całkowicie widoczny na większości monitorów.
— Wheat Wizard

0

JavaScript ES7, 122 bajty

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

Przeważnie wszystko dzieje się w tym kawałku

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

Reszta to zapętlanie / konwersja kodu znaków

Rozdzielać się:

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

Jeśli funkcje nie są dozwolone:

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 bajty


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


0

Python 2, 106 bajtów

To nie jest wystarczająco krótkie. Ponieważ jest to python, jest zbyt szczegółowe, możesz nawet przeczytać, co robi, szukając kodu. Ale działa.

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))])

1
„Ponieważ jest to python, jest zbyt szczegółowe” ... nie w porównaniu z Javą. I nie zgadzam się. Mniej gadatliwy i nie byłby tak świetny, jak jest. Użyj Pyth, jeśli chcesz mniej gadatliwy.
— mbomb007

0

Matlab, 43

Korzystanie z anonimowej funkcji:

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

Przykłady:

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

0

JavaScript ES6, 111 bajtów

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

Jest to denerwująco długie, częściowo dzięki długiemu JavaScriptowi String.fromCharCodei jego charCodeAtfunkcjom. Fragment kodu zawiera nieoznakowany, skomentowany, testowalny kod.

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>


0

Współczynnik, 80 bajtów

[ cum-sum [ dup zero? 1 0 ? + / ] map-index [ .5 + floor >fixnum ] map >string ]
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.