计算字符串的平均字符


24

任务

您的任务是产生包含字符串平均字符的字符串。结果的第一个字符是第一个字符的平均字符(即第一个字符)和两个第一个字符的第二个字符的平均值,依此类推。

什么是普通字符?

字符串是字节数组。平均字符串的可以通过计算平均字符的ASCII值的字符串,并采取相应的ASCII字符被发现。

例如,字符串"Hello!"可以写为字节序列72 101 108 108 111 33。ASCII值的平均值为533/6 = 88.833 ...,将其四舍五入为最接近的整数时,我们得到89,这是大写字母的ASCII码Y

规则

  • 您可以假定输入仅包含可打印的ASCII字符
  • 输入可以从stdin读取,也可以作为命令行参数或函数参数读取
  • 输出必须是标准输出。如果您的程序是函数,则还可以返回否则将打印的字符串。
  • 它必须是整个程序或函数,而不是摘要
  • 适用标准漏洞
  • 整数按函数floor(x+0.5)或类似函数进行取整。

我怎么赢?

这是,因此获胜时的最短答案(以字节为单位)。

例子

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

编辑的问题。现在应该很清楚:您必须将一半向上舍入。
汉尼斯·卡皮拉

1
输入可以从stdin读取或作为命令行参数 ”:或作为函数参数(因为您允许使用函数),对吗?
路易斯·门多

当然,再次编辑。
汉尼斯·卡皮拉

2
抱歉再次困扰您,但是函数实际上是否必须将输出打印到STDOUT还是它们可以返回所需的字符串?
丹尼斯

抱歉,忘记了编辑。现在应该可以了。
汉尼斯·卡皮拉2015年

Answers:


11

Brainfuck 106字节

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

这是我第一次参加代码高尔夫球,请保持温柔!它确实有效,但是brainfuck无法处理浮点数(我不知道),因此舍入后的值始终是最底值(以后可能会修复我的算法)。

同样,该算法将值平均乘以2,这意味着在某些位置可能是不准确的。而且我还需要修复在输出末尾打印数字的错误。


9

Pyth,16个字节

smCs+.5csaYCdlYz

非常简单。使用s+.5而不是舍入,因为某些原因round(0.5, 0)在Python中为0。


1
Python 3将一半取整为偶数,这会减少偏差。这个问题没有明确说明应如何将两半取整,因此我已要求OP做出澄清。
丹尼斯

编辑的问题。0.5四舍五入应该1
汉尼斯·卡皮拉2015年

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” $强制转换以将浮点数列表转换为字符列表,并在这样做之前自动将每个浮点数舍入为最接近的整数[即(“ c” $ 99.5)=(“ c” $ 100)和(“ c “ $ 99.4)=(” c“ $ 99)]

Q是否需要在这里使用函数包装器?还是可以只使用默认表达式"c"$avgs"i"$?我认为没有比这更简单的解决方案了。:)
JohnE 2015年

您是正确的-不需要函数包装,例如“ c” $ avgs“ i” $“ Hello!” 工作正常
scottstein37

我认为您可以通过将"c"`c和"i"`i 更改为2个字节。
kirbyfan64sos

不幸的是,我认为那没有用。要使用符号类型表示进行转换,我必须按照code.kx.com/wiki/JB:QforMortals2/…使用`char和`int。 我考虑使用10h和6h代替“ c”和“ i”这样就不会节省任何字节-10h与“ c”的长度相同,而6h替代“ i”则需要尾随空格,也使它们的长度相同。
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

3

C#189135134106字节

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

可以在这里看到

第一次高尔夫球手


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转换为char,反之亦然。{(+/x)%#x}是用于计算平均值的经典K习语。总体来说很简单。

编辑:哦,误读了规范。`0:需要将结果打印到标准输出。等待有关输入re的澄清。丹尼斯的问题。


如果使用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:不会打印到标准输出,而是从磁盘读取TXT文件。
tmartin

@tmartin:正确- _ci_ic在K5中被完全替换为`c$。我发布的原始解决方案与基于K2 / K3的Kona兼容。我通常尽量不要发布带有oK的解决方案,因为语义仍然在变化并且部分不准确。
JohnE

1
我明白了,对我来说很有意义。我认为这是另一个K5解决方案。这是28个char kona解决方案`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

Ruby,46岁

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

乙二酮

向w0lf道歉,我的回答最终变得与众不同,以至于似乎值得发表。

$<.bytes遍历stdin中的每个字节,因此我们在每个循环中打印滚动平均值。'%c'通过四舍五入并采用ASCII将浮点数转换为字符,因此我们要做的就是加0.5以使其正确舍入。$.是一个魔术变量,它最初初始化为0-应该存储行数,但是由于这里我们要字节数,所以我们只是手动对其进行递增。


2

Mathcad,60个“字节”

在此处输入图片说明

Mathcad是基于2D工作表的数学应用程序,该工作表由“区域”组成,每个区域可以是文本,数学表达式,程序,绘图或脚本化组件。

从调色板工具栏中选取数学或编程指令,或使用键盘快捷键输入。为了打高尔夫球,将一个操作(“字节”)作为创建名称或表达式(例如,将变量a设置为3时,我们将编写a:= 3)所需的键盘操作数。 :=是单个按键“:”,a和3总共是3个“字节”。操作员编程需要键入ctl-shft-#(或在编程工具栏上单击一下),因此再次等同于1个字节

在Mathcad中,用户使用键盘快捷键输入编程语言命令(或从“编程工具栏”中选择它们),而不是用文本编写它们。例如,键入ctl-]将创建一个while循环运算符,该运算符具有两个“占位符”分别用于输入条件和主体的单行。在Mathcad表达式的末尾键入=会使Mathcad评估该表达式。

(计数字节)从用户输入的角度看待它,并将一个Mathcad输入操作(通常是键盘,如果没有kbd快捷键,则在工具栏上单击鼠标)等同于一个字符,并将其解释为一个字节。csort = 5个字节,因为它按其他字符/函数名称一样按字符输入。for运算符是一种特殊的构造,它占用11个字符(包括3个空白的“占位符”和3个空格),但由ctl-shft-#输入,因此= 1个字节(类似于某些语言中的标记)。键入'(引号)通常会产生括号,因此算作1个字节。索引v = 3个字节(类型v [k)。


2

Python 3,66个字节

如果我使用round()而不是int(.5+etc,它会保存一个字符,但是从技术上讲,它不符合挑战:Python的round()一半将整数舍入到最接近的偶数整数,而不是向上。但是,它可以在所有样本输入上正常工作。

我也因为没有用换行符结束输出而感到有点脏,但是挑战并不需要 ...

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

1
如果您在打印前增加N,您可以避免1.调整它
同或

1
@xnor:脸,手掌。手掌,脸。感谢您指出了这一点。
蒂姆·佩德里克

print(end=chr(int(...))一些字节保存
FlipTack

@ Flp.Tkc:谢谢!答案已更新。
蒂姆·佩德里克

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以计算并附加平均字符。


与我的方法几乎完全相同,仅使用Python 2而不是3,并在数小时前发布:+1。(此外,我发现我保存了一些字节来打印每个字符,而不是将它们存储到最后一个字符print。这在Python 2中可以使用吗?我刚才忘记了如何在print语句中取消换行...逗号使它成为空格而是吧?)
蒂姆·佩德瑞克

Python 2可以print _,留下一个空格而不是换行符,但是没有很好的方法来省略该空格。Python 3的end论点很好,我对此一无所知。
xnor

@TimPederick也许可以为使用它的终端辩解退格控件,以此作为删除该空间的技巧:print'\b'+_,
xnor 2015年


1

爪哇,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很生锈。
manatwork

如在如何称呼它?假设test是一个char数组,只需使用f(test);。如果是String对象,则可以使用f(test.toCharArray());。字符串文字也可以这样:f("Hello!".toCharArray());
Geobits,2015年

哦。当然。toCharArray()我很笨,我试图通过强制转换来违反它。谢谢。
manatwork

仅仅投射它太容易了。爪哇诸神会大怒:P
Geobits

1

C,62字节

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

(ideone链接)

结果与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读取并将字符放入堆栈
  • 第二个将删除EOL字符,取堆栈的大小并将其放入 &寄存器
  • 第三行将在堆栈中添加两个或多个数字
  • 第四行将结果数除以寄存器的值,然后加1/2,将值输出为字符并停止。当显示char时遇到浮点值时,> <>将使其下限,这就是为什么我们添加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.fromCharCodecharCodeAt功能。堆栈代码段包含未注释,可注释的可测试代码。

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 ]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.