文字列の平均文字を計算する


24

仕事

あなたの仕事は、文字列の平均文字を含む文字列を生成することです。結果の最初の文字は、最初の文字の平均文字(最初の文字)であり、2番目の文字は最初の2文字の平均であり、以下同様です。

平均的なキャラクターとは何ですか?

文字列はバイトの配列です。文字列の平均文字は、文字列内の文字のASCII値の平均を計算し、対応するASCII文字を取得することで見つけることができます。

たとえば、文字列"Hello!"はバイトシーケンスとして記述できます72 101 108 108 111 33。ascii値の平均は533/6 = 88.833 ...であり、最も近い整数に丸めると89が得られYます。これはcaptial letterのasciiコードです。

ルール

  • 入力には印刷可能なASCII文字のみが含まれると想定できます。
  • 入力は、stdinから、またはコマンドライン引数として、または関数引数として読み取ることができます。
  • 出力は標準出力でなければなりません。プログラムが機能している場合は、そうでなければ印刷する文字列を返すこともできます。
  • スニペットではなく、プログラム全体または関数でなければなりません
  • 標準的な抜け穴が適用されます
  • 整数は、関数floor(x+0.5)または同様の関数によって丸められます。

どうやって勝ちますか?

これはなので、winsでの最短回答(バイト単位)です。

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

編集された質問。これで明確になるはずです。半分を上に丸める必要があります。
ハンネスカルピーラ

1
" 入力は、stdinから、またはコマンドライン引数として読み取ることができます ":または関数引数として(関数を許可するため)、そうですか?
ルイスメンドー

もちろん、もう一度編集します。
ハンネスカルピーラ

2
もう一度お邪魔して申し訳ありませんが、関数は実際に出力をSTDOUTに出力する必要がありますか、それとも目的の文字列を返すことができますか?
デニス

申し訳ありませんが、それを編集するのを忘れていました。これで問題ないはずです。
ハンネスカルピーラ

回答:


11

Brainfuck 106バイト

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

コードゴルフに参加するのはこれが初めてです。優しくしてください!それは動作しますが、brainfuckはフロートを処理できません(私が知っていることではない)ので、丸められた値は常に一番下です(後でアルゴリズムを修正するかもしれません)。

また、アルゴリズムは値を2 x 2で平均します。つまり、一部のスポットでは真性である可能性があります。また、出力の最後に数字を出力するバグを修正する必要があります。


9

Pyth、16バイト

smCs+.5csaYCdlYz

とても簡単です。Pythonではs+.5何らかの理由round(0.5, 0)で0であるため、丸めの代わりに使用します。


1
Python 3は半分を偶数に丸め、バイアスを減らします。質問では、半分を丸める方法を明示的に指定していないため、OPに明確化を要求しました。
デニス

編集された質問。0.5丸くする必要があります1
ハンネスカルピーラ

7

Q、15 12バイト

式として12バイト

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

または関数として15バイト

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

を活用する

  1. 文字列(文字のリスト)を整数のリストに変換するための「i」$キャスト
  2. リストの移動平均をフロートのリストとして計算するavgs関数
  3. 浮動小数点数のリストを文字のリストに変換するための「c」$キャスト。これにより、各浮動小数点数が最も近い整数に自動的に丸められます"$ 99.4)=(" c "$ 99)]

Qはここで関数ラッパーを必要とします"c"$avgs"i"$か、それとも暗黙の式だけで済ますことができますか?解決策がそれよりずっと簡単になるとは思わない。:)
JohnE

あなたは正しいです-"c" $ avgs "i" $ "Hello!"のような関数ラッパーは必要ありません うまく動作します
scottstein37

"c"`cと"i"` iに変更することで2バイト節約できると思います。
kirbyfan64sos

残念ながら、私はそれが機能するとは思わない。キャストにシンボルタイプ表現を使用するには、code.kx.com / wiki / JB:QforMortals2 / ...に従って `charおよび` intを使用する必要があります。 "c"および "i"の代わりに10hおよび6hの使用を検討しました10バイトは "c"と同じ長さで、 "i"に6hを代入すると末尾のスペースが必要になり、同じ長さになります。
scottstein37


4

Perl:31 30文字

(29文字のコード+ 1文字のコマンドラインオプション。)

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

サンプル実行:

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


2

K、36バイト

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

使用法:

  `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

_ciそして_ic、それぞれ文字及びその逆に変換するASCII。{(+/x)%#x}平均を計算するための古典的なKイディオムです。全体的にかなり簡単です。

編集:ああ、仕様を読み間違えた。`0:結果を標準出力に出力するために必要です。入力に関する説明を待っています。デニスの質問。


K5を使用する場合、これは35バイトに短縮できます{[s]`0:`c${_.5+(+/u)%#u:x#s}'1+!#s}
kirbyfan64sos

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

`c$_.5+{(+\x)%+\~^x}`i$24の場合は短くなり`c$`i${(+\x)%+\~^x}`i$ます()が、floatからintにキャストするときにREPL(johnearnest.github.io/ok/index.html)が正しく丸められません。私は以来、このAKソリューションを呼ぶのをためらうだろう_ci_ic私が言うことができる限りK5仕様でどこにもありません、一方、0:stdoutに印刷されませんが、代わりにディスクからtxtファイルを読み込みます。
tmartin

@tmartin:correct- _ci_ic全く同様の形でK5に置き換えられます`c$。私が投稿した元のソリューションは、K2 / K3に基づくKonaと互換性があります。セマンティクスがまだ変化しており、部分的に不正確であるため、私は通常、特にoKでソリューションを投稿しないようにします。
JohnE

1
ああ、私には理にかなっています。これは別のK5ソリューションであると考えました。ここでは28文字のコナ・ソリューションです`0:_ci_0.5+{(+\x)%1.+!#x}_ic
tmartin

2

Mathematica、75バイト

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

2

ジュリア、85 81バイト

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

これにより、文字列を受け入れる名前のない関数が作成され、ASCIIコードポイントのベクトルが作成されます。順次グループごとに平均が取られ、整数に丸められ、文字に変換され、ストリングに結合され、STDOUTに出力されます。


2

ルビー、46

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

ideone

w0lfへの謝罪で、私の答えは投稿する価値があるように思えたほどに異なってしまいました。

$<.bytesstdinの各バイトを反復処理するため、各ループのローリング平均を出力します。'%c'は、小数点以下を切り捨ててASCIIを取得することにより、浮動小数点数を文字に変換するため、0.5を追加するだけで適切に丸められます。$.は0に初期化されて開始される魔法の変数です。行カウントを格納することになっていますが、ここではバイトカウントが必要なので、手動でインクリメントします。


2

Mathcad、60「バイト」

ここに画像の説明を入力してください

Mathcadは、それぞれがテキスト、数式、プログラム、プロット、またはスクリプトコンポーネントである「領域」で構成される2Dワークシートに基づく数学アプリケーションです。

数学またはプログラミングの指示は、パレットのツールバーから選択するか、キーボードショートカットを使用して入力します。ゴルフの目的では、操作(「バイト」)は、名前または式を作成するために必要なキーボード操作の数と見なされます(たとえば、変数aを3に設定するには、a:= 3と記述します。定義演算子:=は単一のキープレス「:」で、aおよび3は合計3「バイト」を与えます。オペレーターのプログラミングはctl-shft-#(またはプログラミングツールバーのシングルクリック)を入力する必要があるため、再び1バイト。

Mathcadでは、ユーザーはテキストで記述するのではなく、キーボードショートカットを使用して(またはプログラミングツールバーから選択して)プログラミング言語コマンドを入力します。たとえば、ctl-]と入力すると、条件を入力するための2つの「プレースホルダー」と本文の1行をそれぞれ持つwhileループ演算子が作成されます。Mathcad式の最後に=を入力すると、Mathcadは式を評価します。

(バイト数をカウント)ユーザー入力の観点からそれを見て、1つのMathcad入力操作(キーボード、kbdショートカットがない場合はツールバーでマウスクリック)を文字と同等にし、これをバイトとして解釈します。csort = 5バイト。他の変数/関数名と同様に文字ごとに入力されます。for演算子は、11文字(3つの空白の「プレースホルダー」と3つのスペースを含む)を占有する特殊な構造ですが、ctl-shft-#によって入力されるため、= 1バイト(一部の言語のトークンと同様)です。'(引用符)を入力すると、(通常)バランスの取れた括弧が作成されるため、1バイトとしてカウントされます。インデックス付けv = 3バイト(タイプv [k)。


2

Python 3、66バイト

etcのround()代わりに使用するとint(.5+、1文字は節約されますが、技術的にはチャレンジに準拠していません。Pythonのround()丸めは、上向きではなく、最も近い偶数の整数になります。ただし、すべてのサンプル入力で正しく機能します。

また、出力を改行で終わらせないために少し汚い気がしますが、チャレンジはそれを必要としません...

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

1
印刷する前にnをインクリメントする場合、1で調整することを避けることができます。
xnor15年

1
@xnor:顔、手のひら。手のひら、顔。それを指摘してくれてありがとう。
ティムペデリック

print(end=chr(int(...))いくつかのバイトを保存する
FlipTack

@ Flp.Tkc:ありがとう!回答が更新されました。
ティムペデリック16

2

JavaScript(ES6)、75バイト

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>

このテクニックではまだJSの答えがないとは思えません...


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

新しい文字ごとに、文字の合計sと文字数を更新してi、平均文字を計算して追加します。


私とほぼ同じアプローチで、3ではなくPython 2のみで、数時間前に投稿されました:+1。(また、最後の1文字を保存するのではなく、各文字を印刷して数バイトを保存したことがわかりましたprint.Python 2で動作しますか?printステートメントの改行を抑制する方法を忘れました...カンマでスペースにします代わりに、正しい?)
ティムペデリック

Python 2はprint _,改行ではなくスペースを残すことができますが、スペースを省略する良い方法はありません。Python 3のend引数を使って良いコールをしましたが、私はそれを忘れていました。
xnor

@TimPederickバックスペースコントロールは、スペースを削除するためのハックとして、それを使用する端末に対して正当化される可能性がありますprint'\b'+_,
。– xnor


1

Java、100

ここでの他の多くの答えと同じように、私はループで合計し、平均しています。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];}

私の元のコードは97ですが、char[]印刷するのではなく、変更したものだけを返します。

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

さて、それはだだけので、ここでは、という理由だけでいくつかの改行を持つバージョンですが、私のために表示されるようにスクロールバーのために十分な長さ:

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

面白い。通話サンプルも見せていただけますか?私のJavaは非常に錆びています。
マナトワーク

それを呼び出す方法のように?testchar配列であると仮定して、単に使用しますf(test);。Stringオブジェクトの場合、を使用しますf(test.toCharArray());。文字列リテラルも同様に問題ありませんf("Hello!".toCharArray());
。– Geobits

ああ。確かに。toCharArray()私は馬鹿だ、私はいくつかのキャストでそれを違反しようとしました。ありがとうございました。
マナトワーク

キャストするのは簡単すぎます。Javaの神々は激怒するだろう:P
Geobits

1

C、62バイト

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

(理想的なリンク)

結果はOPの例と少し異なりますが、これはこのコードが切り上げではなく0.5を切り捨てているためです。もう違います!


1

R、135 127バイト

これはすぐに長くなり、最初は本当に間違っていました:)質問を適切に読む必要があります。

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

試運転

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

誰かがサンドボックスにだまされたチャレンジを投稿したので、私はこれを見つけました...これはかなり前のことですが、utf8ToInt助けになります!あなたがそれに更新したい場合、私はこれの68バイトのゴルフを持っています。
ジュゼッペ

@Giuseppeよろしければ、自分で投稿してください。ここでやったこととはかなり違うと思う。
MickyT

1

Perl 5、41バイト

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

として実行

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

1

TSQL、118バイト

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

文字を垂直に戻す

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

1

> <>、30バイト

i:0(?v
v &l~<
\+l2(?
\&,12,+o;
  • 最初の行はstdinから読み取り、文字をスタックに配置します
  • 2番目はEOL文字を削除し、スタックのサイズを取得して&レジスタに入れます
  • 3番目の行は、2つ以上の番号がある間にスタックに番号を追加します
  • 4行目は、結果の数値をレジスタの値で除算し、1/2を加算して、値を文字として出力して停止します。charを表示するときにfloat値に直面すると、> <>はそれをフロアします。そのため、1/2を追加しました。

オンラインインタープリターで試すことができますが、次のバージョンを使用する必要があります。これは、オンラインインタープリターがコードボックスを長方形に埋め込み?、スペースに適用するためです。

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


1

Japt、13バイト(非競合)

£T±Xc)/°Y r d

オンラインでテストしてください!

使い方

£   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

ああ、ナッツ; 「競合しない」フィルターがリーダーボードから削除されたと思ったので、これを投稿する前にこれを見ませんでした。
シャギー


1

PHP176バイト

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

例:

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

これまでの最大の解決策ですが、phpに基づくと、それほど短くなることはないと思います。改行を削除すると、2バイト節約できます。


うーん、良い点。読みやすくするために、それらをポストに残すかもしれないと思った。しかし、ええ、これはコードゴルフです。それらを削除します;)
cb0

1
短いものと一緒に読みやすくするために、いつでもパディング付きの追加バージョンを含めることができます。コードが長すぎてほとんどのモニターで完全に表示できない場合に、これを頻繁に行います。
小麦ウィザード

0

JavaScript ES7、122バイト

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

ほとんどすべてがこのビットで起こっています

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

残りはループ/文字コード変換です

分割する:

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

機能が許可されていない場合:

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バイト


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バイト

短すぎません。それはpythonなので、あまりにも冗長なので、コードを見ることでそれが何であるかを読むことさえできます。しかし、それは機能しています。

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なので、あまりにも冗長です」... Javaとは異なります。そして、私は同意しません。それほど冗長ではなく、それはそれほど素晴らしいものではありません。冗長性を減らしたい場合は、Pythを使用してください。
mbomb007

0

Matlab、43

無名関数を使用する:

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

例:

>> 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バイト

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

これは、JavaScriptのlong String.fromCharCodeおよびcharCodeAtfunctions のおかげもあって、うっとうしい長さです。スタックスニペットには、コメント化されていないテスト可能なコードが含まれています。

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

係数、80バイト

[ cum-sum [ dup zero? 1 0 ? + / ] map-index [ .5 + floor >fixnum ] map >string ]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.