Dize ortalama karakterlerini hesapla


24

Görev

Senin görevin ortalama dize karakterleri içeren dize üretmektir. Sonuçtaki ilk karakter, ilk karakterin (ilk karakter olan) ortalama karakteri ve iki ilk karakterin vb.

Ortalama karakter nedir?

Dizeler bayt dizileridir. Dizgideki ortalama karakter dizgideki karakterlerin ASCII değerlerinin ortalamasını hesaplayarak ve karşılık gelen ASCII karakterini alarak bulunabilir.

Örneğin dize "Hello!"bayt dizisi olarak yazılabilir 72 101 108 108 111 33. Ascii değerlerinin ortalaması 533/6 = 88.833 ... ve en yakın tamsayıya yuvarlandığında büyük harf için ascii kod olan 89 alırız Y.

kurallar

  • Girişin yalnızca yazdırılabilir ASCII karakterleri içerdiğini varsayabilirsiniz.
  • Giriş, stdin'den veya komut satırı argümanlarından veya fonksiyon argümanlarından okunabilir.
  • Çıktı stdout olmalıdır. Programınız çalışıyorsa, başka şekilde yazdıracağınız dizeyi de geri getirebilirsiniz.
  • Tüm program veya işlev olmalı, snippet değil
  • Standart boşluklar uygulanır
  • Tamsayılar işlev floor(x+0.5)veya benzer işlev tarafından yuvarlanır .

Nasıl kazanırım?

Bu , kazanmadaki en kısa cevap (bayt cinsinden).

Örnekler

  • Hello!HW^adY
  • testtmop
  • 4243
  • StackExchangeSdccd_ccccddd

Düzenlenmiş soru Şimdi açık olmalı: yarıları yukarı doğru yuvarlamak zorundasınız.
Hannes Karppila

1
" Giriş, stdin'den veya komut satırı argümanlarından okunabilir ": veya fonksiyon argümanları (fonksiyonlara izin verdiğinizden beri), değil mi?
Luis Mendo

Tabii ki, tekrar düzenlendi.
Hannes Karppila

2
Sizi bir kez daha rahatsız ettiğim için özür dilerim, ancak işlevlerin çıktıyı STDOUT'a yazdırması gerekiyor mu yoksa istenen dizeyi geri verebilirler mi?
Dennis,

Üzgünüz, daha önce düzenlemeyi unuttum. Şimdi iyi olmalı.
Hannes Karppila

Yanıtlar:


11

Brainfuck 106 bayt

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

Bu benim bir kod golfüne ilk katılmam, lütfen nazik ol! İşe yarıyor ama beyin sıkıntısı kayan noktalarla başa çıkamıyor (bildiğim kadarıyla değil), bu nedenle yuvarlanan değer her zaman en alttaki değerdir (algoritmamı daha sonra düzeltebilir).

Ayrıca, algoritma 2 ile 2 arasındaki değerlerin ortalamasını alır, bu da bazı noktalarda yanlış olabileceği anlamına gelir. Ve çıktının sonunda da bir sayı basan bir hatayı düzeltmem gerekiyor.


9

Pyth, 16 bayt

smCs+.5csaYCdlYz

Oldukça basit. s+.5Yuvarlama yerine kullanmak , nedense round(0.5, 0)Python'da 0'dır.


1
Python 3 daha az önyargıya neden olan, hatta yarısına doğru yuvarlar. Soru açıkça yarıların nasıl yuvarlanması gerektiğini belirtmiyor, bu yüzden OP'den açıklama istedim.
Dennis,

Düzenlenmiş soru 0.5yuvarlak olmalıdır 1.
Hannes Karppila

7

S, 15 12 bayt

İfade olarak 12 bayt

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

veya işlev olarak 15 bayt

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

Yararlanır

  1. Bir dizgiyi (karakter listesi) bir tamsayı listesine dönüştürmek için "i" $
  2. bir listenin çalışma ortalamasını yüzdürme listesi olarak hesaplayan avgs işlevi
  3. "c" $, yüzer listesini bir karakter listesine dönüştürmek için kullanılır ve bunu yapmadan önce her yüzgeci otomatik olarak en yakın tam sayıya yuvarlar [yani ("c" $ 99.5) = ("c" $ 100) ve ("c "99,4 ABD Doları) = (" c "99 ABD Doları)]

Q, burada işlev sargısını mı gerektiriyor yoksa sadece tam ifadeyle kurtulabilir "c"$avgs"i"$misin? Bir çözümün bundan daha kolay elde edilebileceğini sanmıyorum. :)
JohnE

haklısın - işlev paketleyicisine gerek yok, "c" $ avgs "i" $ "Merhaba!" iyi çalışıyor
scottstein37

Bence "c"c ve "i"i olarak değiştirerek 2 bayt kaydedebilirsiniz .
kirbyfan64sos

ne yazık ki, bunun işe yaradığını sanmıyorum. Döküm için sembol tipi gösterimini kullanmak için, kod.kx.com/wiki/JB:QforMortals2/… uyarınca 'char ve `int kullanmak zorunda kalacağım " c "ve" i "yerine 10h ve 6h'yi kullanmayı düşündüm ; bu, herhangi bir baytı kurtarmaz - 10 saat, "c" ile aynı uzunluktadır ve "i" yerine 6 saat kullanılması, sonunda aynı uzunlukta olmalarını gerektirir.
scottstein37


4

Perl: 31 30 karakter

(29 karakter kod + 1 karakter komut satırı seçeneği.)

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

Örnek çalışma:

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

3

C # 189 135 134 106 Bayt

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

Burada görülebilir

İlk kez golfçü


2

K, 36 bayt

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

Kullanımı:

  `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

_cive _icsırasıyla ascii'yi chars'e veya tam tersine dönüştürür. {(+/x)%#x}bir ortalama hesaplamak için klasik bir K deyimdir. Genel olarak oldukça basit.

Düzenleme: ah, spec yanlış. 0: sonucu stdout'a yazdırmak için gereklidir. Girişinde açıklama bekliyorum. Dennis'in sorusu.


Eğer K5 kullanıyorsanız, bu 35 bayt kısaltılabilir: {[s]`0:`c${_.5+(+/u)%#u:x#s}'1+!#s}.
kirbyfan64sos

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

`c$_.5+{(+\x)%+\~^x}`i$24. için daha kısa olabilir ( `c$`i${(+\x)%+\~^x}`i$) ancak REPL'iniz ( johnearnest.github.io/ok/index.html ) float'tan int'ye kadar kullandığınızda doğru yuvarlanmaz. Bu ak çözümü aramaktan çekinirim _cive _icsöyleyebildiğim kadarıyla K5'in özelliklerinde hiçbir yerde 0:bulunmamakla birlikte, stdout'a yazdırmaz ancak bunun yerine diskten bir txt dosyası okur.
tmartin

@tmartin: düzeltmek- _cive _ictamamen K5'te gibi formlarla değiştirilir `c$. Gönderdiğim orijinal çözüm K2 / K3'ü temel alan Kona ile uyumlu. Genelde özellikle OK ile çözümler göndermemeye çalışıyorum çünkü anlambilim hala değişiyor ve kısmen yanlış.
JohnE,

1
Ah anlıyorum, bana mantıklı geliyor. Bunun başka bir K5 çözümü olduğunu düşündüm. İşte bir 28 char kona çözümü`0:_ci_0.5+{(+\x)%1.+!#x}_ic
tmartin

2

Mathematica, 75 bayt

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

2

Julia, 85 81 bayt

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

Bu, bir dizgeyi kabul eden ve ASCII kod noktalarının bir vektörünü oluşturan adsız bir fonksiyon yaratır. Tam sayılara yuvarlanan, karakterlere dönüştürülen, bir dizgeye eklenen ve STDOUT'a yazdırılan her sıralı grup için araçlar alınır.


2

Ruby, 46

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

ideone .

W0lf için özür dilerim, cevabım göndermeye değer gibi görünüyordu.

$<.bytesstdin'deki her byte üzerinde tekrar eder, bu yüzden her döngüde yuvarlanma ortalamasını yazdırırız. '% c', aşağı kaydırıp ASCII'yi alarak bir şamandırayı bir karaktere dönüştürür, bu nedenle tek yapmamız gereken doğru şekilde döndürmek için 0.5 eklemek. $.0 ile başlatılan bir sihirli değişkendir - satır sayısını kaydetmesi beklenir, ancak burada bayt sayısını istediğimizden sadece elle arttırırız.


2

Mathcad, 60 "bayt"

görüntü tanımını buraya girin

Mathcad, her biri metin, matematiksel bir ifade, program, arsa veya komut dosyası içeren bir bileşen olan "bölgeler" den oluşan 2D çalışma sayfalarına dayanan matematiksel bir uygulamadır.

Bir matematiksel veya programlama talimatı bir palet araç çubuğundan seçilir veya bir klavye kısayolu kullanılarak girilir. Golf oynamak için, bir işlem ("bayt"), bir ad veya ifade oluşturmak için gerekli olan klavye işlemlerinin sayısı olarak alınır (örneğin, değişkeni 3'e ayarlamak için, şunu yazacağız: = 3. : = tek bir tuşa basma olduğunu ":"., gibi bir ve 3'te 3 toplam veren vardır "bayt" programlama için operatör bu yüzden tekrar yazarak ctl'i-shft- # (veya programlama araç çubuğunda tek bir tıklama) gerektirir eşdeğerdir 1 bayt.

Mathcad'da kullanıcı, metin olarak yazmak yerine klavye kısayollarını kullanarak (veya Programlama Araç Çubuğundan seçerek) programlama dili komutlarına girer. Örneğin, ctl-], sırasıyla koşuya ve vücudun tek bir satırına girmek için iki "yer tutucusuna" sahip bir while döngüsü operatörü oluşturur. Yazma = bir Mathcad ifadesinin sonunda Mathcad'ın ifadeyi değerlendirmesine neden olur.

(Baytları say.) Bir kullanıcı girişi perspektifinden bakarak ve bir Mathcad giriş işlemini (klavyede genel olarak klavyede olmayan bir kdr kısayolu yoksa fare tıklamasıyla) bir karaktere eşitleyerek ve bunu bir bayt olarak yorumlayarak. csort = 5 bayt, diğer değişken / fonksiyon adları gibi karakteristik karakter yazdığınız gibi. For işleci 11 karakter (3 boş "yer tutucu" ve 3 boşluk dahil) ancak ctl-shft- #, dolayısıyla = 1 bayt (bazı dillerde belirteçlere benzer) tarafından girilen özel bir yapıdır. Yazma '(alıntı) dengeli parantezler oluşturur (genellikle) bu nedenle 1 bayt sayılır. İndeksleme v = 3 bayt (v [k) yazın.


2

Python 3, 66 bayt

Vb round()yerine kullanırsam int(.5+, bir karakter kaydeder, ancak teknik olarak bu zorluğa uygun değildir: Python'un round()turları yukarı doğru değil, en yakın hatta tam sayıya düşer. Ancak, tüm örnek girişlerinde doğru çalışıyor.

Ayrıca çıktıyı yeni bir çizgiyle sonlandırmadığım için kendimi biraz kirli hissediyorum, ancak bu zorluğu gerektirmiyor ...

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

1
Yazdırmadan önce n değerini
artırırsanız

1
@ xnor: Yüz, avuç içi. Palm, yüz. Gösterdiğin için teşekkürler.
Tim Pederick

print(end=chr(int(...))bazı baytları kaydetmek için yap
FlipTack

@ Flp.Tkc: Teşekkürler! Cevap güncellendi.
Tim Pederick

2

JavaScript (ES6), 75 bayt

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>

Henüz bu teknikle JS cevabı olmadığına inanamıyorum ...


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

Her yeni karakterde, ortalama karakteri hesaplamak ve eklemek için karakter toplamını sve karakter sayısını günceller i.


Neredeyse aynen benimkiyle aynı yaklaşım, 3 yerine sadece Python 2 ve saat önce yayınlandı: +1. (Ayrıca, ben de en son biri için bunları saklamak yerine geldi gibi birkaç bayt her bir karakteri baskı kurtardı bulundu print. Python 2 ile bu işe? I nasıl bastırmak satırsonlarına sadece şimdi unutacak printaçıklamada ... virgül bir boşluk yapar yerine, doğru?)
Tim Pederick

Python 2, print _,yeni satır yerine boşluk bırakmak için yapabilir , ancak bu alanı atlamak için iyi bir yol yoktur. Python 3'ün endargümanı ile iyi görüşme , bunu unutmuşum.
xnor

@TimPederick Belki de geri silme kontrolü, alanı silmek için bir hack olarak, kullanan bir terminal için haklı görülebilir:print'\b'+_,
xnor


1

Java, 100

Buradaki diğer pek çok cevap gibi, bir döngüde toplanıp ortalaması alıyorum. Java'yı temsil etmek için buradayım :)

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

Orijinal kodum 97, ancak char[]yazdırmak yerine yalnızca değiştirilenleri döndürür :

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

Şimdi ise sadece bu yüzden burada, sırf bazı satır sonları ile bir versiyonu benim için görünmesini kaydırma çubukları için yeterince uzun:

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

İlginç. Bize bir çağrı örneği de gösterebilir misiniz? Java'm çok paslı.
Manatwork

Nasıl aranır gibi? testBir karakter dizisi olduğunu varsayarsak , sadece kullanın f(test);. Eğer bir String nesnesiyse, kullanırsın f(test.toCharArray());. Dize değişmezleri de böyle iyidir:f("Hello!".toCharArray());
Geobits

Ah. Emin. toCharArray()Beni aptal, bazı oyuncularla ihlal etmeye çalıştım. Teşekkür ederim.
Manatwork

Sadece atmak için çok kolay olurdu. Java tanrıları çok
kızardı

1

C, 62 bayt

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

(ideone bağlantısı)

Sonuçlar OP'nin örneklerinden biraz farklıdır, ancak yalnızca bu kod yukarı yerine 0.5 aşağı yuvarlandığından. Artık değil!


1

R, 135 127 Bayt

Bu çok çabuk oldu ve ilk kez gerçekten yanlış anladım :) Doğru soruları okuman gerekiyor.

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

Test sürüşü

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

biri kum havuzuna dupe meydan okuması gönderdi, bu yüzden bunu buldum ... Bu çok uzun zaman önceydi, ama utf8ToIntyardımcı olacak! Güncellemek istiyorsanız, bunun 68 baytlık golfü var.
Giuseppe

@Giuseppe Devam edin ve isterseniz kendiniz gönderin. Burada yaptığımdan önemli ölçüde farklı olduğundan şüpheleniyorum.
MickyT

1

Perl 5, 41 bayt

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

olarak çalıştırmak

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

1

TSQL, 118 bayt

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

Karakterleri dikey döndürme

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

1

> <> , 30 bayt

i:0(?v
v &l~<
\+l2(?
\&,12,+o;
  • İlk satır stdin'den okur ve karakterleri yığına koyar
  • İkincisi, EOL karakterini kaldıracak, yığının boyutunu alacak ve &kayıt makinesine yerleştirecektir
  • Üçüncü satır, bunlardan iki veya daha fazlası varken yığına sayı ekleyecektir.
  • Dördüncü satır, elde edilen sayıyı yazıcının değerine böler, daha sonra 1/2 ekler, değeri karakter olarak verir ve durur. Bir karakter görüntülerken bir kayan değerle karşılaşıldığında,> <> katlanır, bu yüzden 1/2 ekledik

Çevrimiçi tercüman üzerinde deneyebilirsiniz ancak daha sonra aşağıdaki sürümü kullanmanız gerekir, çünkü çevrimiçi tercüman kod kutusunu bir dikdörtgene yayar ve ?boşluklar için geçerlidir .

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


1

Japt , 13 bayt (rekabet etmeyen)

£T±Xc)/°Y r d

Çevrimiçi test edin!

Nasıl çalışır

£   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

Ah, fındık; Ben göndermeden önce bu görmedik bu yüzden "rekabetsiz" filtresi, liderlik kaldırılmış düşündük bu .
Shaggy


1

PHP , 176 bayt

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

Örnek:

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

Şimdiye kadarki en büyük çözüm, ancak php'ye dayanarak bence daha az kısaltılamıyor. Yeni satırları kaldırarak 2 bayt kaydedilebilir.


Hmm, iyi nokta. Daha iyi okunabilirlik için onları görevde bırakabileceğimi düşündüm. Ama evet, bu kod golf. Onları kaldıracağım;)
cb0

1
Kısa sürümünüzün her tarafında okunabilirlik için her zaman dolgulu ilave bir sürüm ekleyebilirsiniz. Çoğu zaman kodum çoğu monitörde tamamen görünmeyecek kadar uzun olduğunda bunu yaparım.
Buğday Sihirbazı

0

JavaScript ES7, 122 bayt

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

Çoğunlukla her şey bu bit oluyor

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

Gerisi döngü / karakter kodu dönüşümüdür

Ayrılmak:

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

İşlevlere izin verilmiyorsa:

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 bayt


ES5 Metin Parçacığı:

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 bayt

Yeterince kısa değil. Python olduğundan çok ayrıntılı, koduna bakarak ne yaptığını bile okuyabilirsiniz. Ama işe yarıyor.

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
"Python olduğundan bu çok ayrıntılı" ... Java ile karşılaştırılmaz. Ve katılmıyorum. Daha az ayrıntılı ve olması gerektiği kadar iyi olmaz. Daha az ayrıntılı istiyorsanız, Pyth kullanın.
mbomb007

0

Matlab, 43

İsimsiz bir işlev kullanma:

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

Örnekler:

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

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

Bu, JavaScript’in uzun String.fromCharCodeve charCodeAtişlevlerinden dolayı kısmen can sıkıcı bir durum . Yığın pasajı ungolfed, yorumlu, test edilebilir kod içerir.

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

Faktör, 80 bayt

[ cum-sum [ dup zero? 1 0 ? + / ] map-index [ .5 + floor >fixnum ] map >string ]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.