差异不应该有差异


40

您的公司最近雇用了一大批非常敬业的系统管理员。他们认为仅观看计算机屏幕是非常有限的(我的意思是60Hz的刷新率还不够),因此他们将CPU数据总线连接到DAC,并通过服务器机房在扬声器上播放,以便可以听到至20kHz。一个问题:他们是系统管理员,而不是电气工程师,而且他们的扬声器设置不断出现故障。他们认为,这是由于软件工程师在大型机上编译的代码中字节值的突然变化引起的。系统管理员现在正在举办一个小竞赛,以了解谁可以编写最适合其扬声器设置的代码。

挑战

您的任务是创建一种所选语言的程序函数,该程序函数的连续字节之间的差异应尽可能小(请参见“计算”部分)。该程序将负责计算自己的分数。

输入值

ASCII字符串stdin或与您的语言最接近的等效字符串,或者在创建函数时作为函数输入。由于您的程序必须以自身为输入来计算分数,因此,如果程序包含任何Unicode,则它应支持Unicode。否则,ASCII就足够了。可以假定输入的长度至少为2个字节。

计算方式

字符串的每个字符都将使用ASCII标准转换为等效的数字。然后,所有字符之间的差异将首先平方,然后求和。例如,该字符串abd的得分为1²+2²=5

输出量

输出将是您输入的标题。这意味着它应该以a开头#或以换行符和-(破折号)开头。然后,它应该输出您的编程语言的名称,后跟一个逗号,一个空格,然后是代表计算结果的整数。例如

#C++, 98

将是有效的输出。应该给出输出,stdout或者给出与您的语言最接近的等效输出,或者作为函数的返回值。

计分

您的分数将是程序的计算值,并以程序本身作为输入。

编辑:现在应该处理换行符,对不起,以前的人们

是一个Pyth脚本,用于验证分数计算。


1
该程序是否需要解释其自身代码以外的任何内容?为了澄清,两个连续的相等字符的值为0?
Daniel M.

10

1
@bopjesvla很好。任意字符串,但您可以假定它们可以放入Universe中。或者在您的计算机上。
Sanchises

11
元制中第一个创建有效答案的人将获胜!
ETHproductions 2015年

3
现在为时已晚,但是防止一元样式回答的一种选择是将相等字符之间的差异定义为1。这也会使逻辑稍微有趣一些。
Reto Koradi

Answers:


19

CJam,1051 827 643 569 545 407 327 279 279 235 233 229

''"','#'C'J'a'm',' qYew::-Yf#:+e#'''''''''"
f{-ci'(*''2*\}'^,40>"*/:N"-"][ZZ[\^__`bcdgimpstsz{}~~~"

上面的程序生成实际的源代码,其长度为1,179,112字节。

测试中

使用Java解释器,可以像下面这样生成和测试源代码:

$ alias cjam='java -jar cjam-0.6.5.jar'
$ cjam gen.cjam > diff.cjam
$ cksum diff.cjam 
896860245 1179112 diff.cjam
$ cjam diff.cjam < diff.cjam
#CJam, 229

替代版本

以36分的成本-最终分数265-我们可以将源代码缩短99.92%:

'''()))))(''''(((('''())))))))))))))))))))))))))))('''()))))))))))))))))))))))))))))))))))('''())))))))))))))))))))))))))))))))))))))))))))))))))))))))))('''())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))('''()))))(''''((((((('())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))('())))))))))))))))))))))))))))))))))))))))))))))))))('())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))('())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))('()))))))))))))))))))('()))))))))))))))))))('())))))('())))))))))))))))))))))))))))))))))))))))))))))))))('()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(''(((('()))))))))))))))))))('())))('())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(''((((''''''''''''''''''()+,-.0123456789;<=>?@ABCDEFGHIJKLMOPQRSTUVWXYZ[\]][ZZ[\^__`bcdgimpstsz{}~~~

您可以在CJam解释器中在线尝试该版本。

理念

我们要执行代码

'#'C'J'a'm',' qYew::-Yf#:+

保持分数尽可能低。为了实现这一点,我们将逐个字符地构建字符串(在操作前后有一些空操作)并评估结果。

幸运的是,'(推送字符文字),((减量)和)(增量)是连续的ASCII字符,因此推送任意字符相对便宜。

  • 之后的ASCII字符'可以按推送'()…)(,其中的数量)取决于代码点。

    例如,+可以按推送'())))(。之间的距离'(与,()是1。尾部)(互相抵消; 它们的唯一功能是为后续'(对应下一个字符)连续字符铺平道路。

    以这种方式推送的角色会将得分提高4分。

  • 之前的ASCII字符'可以按推送''(…(,其中的数量(取决于代码点。

    例如,#可以按推送''(((('和之间的距离(是1。

    以这种方式推送的角色会将得分提高2分。

  • ''(…(实际上,它适用于所有 ASCII字符,因为Character为16位宽并且可以环绕。例如,+可以''将推送为,然后推送65,532 (s。

    该技术在1.2兆字节的代码版本中使用。

  • '可以将字符按按下'',使乐谱不受影响。

e# Push these characters on the stack: ','#'C'J'a'm',' qYew::-Yf#:+e#'''''''''

''
'()))))(
''
''((((
''
'())))))))))))))))))))))))))))(
''
'()))))))))))))))))))))))))))))))))))(
''
'())))))))))))))))))))))))))))))))))))))))))))))))))))))))))(
''
'())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(
''
'()))))(
''
''(((((((
'())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(
'())))))))))))))))))))))))))))))))))))))))))))))))))(
'())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(
'())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(
'()))))))))))))))))))(
'()))))))))))))))))))(
'())))))(
'())))))))))))))))))))))))))))))))))))))))))))))))))(
'()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(
''((((
'()))))))))))))))))))(
'())))(
'())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(
''((((
''
''
''
''
''
''
''
''
''()

+                         e# Concatenate the two topmost single quotes.
,                         e# Push the length of the resulting string (2).
-.0123456789              e# Push that number.
;                         e# Discard it from the stack.
<                         e# Compare a single quote with 2. Pushes 0.
=                         e# Compare a single quote with 0. Pushes 0.
>                         e# Compare a single quote with 0. Pushes 1.
?                         e# Ternary if. Discards a single quote and 1.
@                         e# Rotate the remaining three single quotes.
ABCDEFGHIJKLMOPQRSTUVWXYZ e# Push 25 items on the stack.
[\]                       e# Swap the last two and wrap them in an array.

e# So far, we've pushed the elements of "','#'C'J'a'm',' qYew::-Yf#:+e#'''"
e# followed by the elements of [10 11 12 13 14 15 16 17 18 19 20]
e# and ["" "" "" 3.141592653589793 "" "" " " 0 0 0 -1 1 [3 2]].

]    e# Wrap the entire stack in an array.
[    e# Begin an array. Does nothing.
ZZ   e# Push 3 twice.
[    e# Begin an array. Does nothing.
\^   e# Swap both 3s and push the bitwise XOR. Pushes 0.
__   e# Push two copies.
`    e# Inspect the last copy. Pushes the string "0".
b    e# Convert "0" from base 0 to integer. Pushes 48.
cd   e# Cast 48 to Character, then Double. Pushes 48.0.
gi   e# Apply the sign function, then cast to integer. Pushes 1.
mp   e# Check 1 for primality. Pushes 0.
s    e# Cast the result to string. Pushes the string "0".

e# We now have three elements on the stack: an array, 0, and "0"

t    e# Set the element at index 0 of the array to the string "0".
s    e# Cast the array to string.

e# This pushes the string consisting of the characters
e#     0,'#'C'J'a'm',' qYew::-Yf#:+
e# and
e#     e#'''10111213141516171819203.141592653589793 000-1132
e#
e# When evaluated this does the following:
e#   0,                Push an empty array. Does not affect output.
e#   '#'C'J'a'm','     Push the characters of "#CJam, ".
e#   q                 Read all input from STDIN.
e#   Yew               Push the overlapping slices of length 2.
e#   ::-               Reduce each pair of characters to their difference.
e#   Yf#               Square each difference.
e#   :+                Add the results.
e#   e#…               Comment. Does nothing.

z    e# Zip. This wraps the string on the stack in an array.
{}~  e# Execute an empty block.
~    e# Unwrap the array.
~    e# Evaluate the string.

6
........... wat
DLosc

看起来这种语言是为应对这一严峻挑战而构建的。真好!
多米诺骨牌

3
该死的。我以为我最终提出了一个挑战,使CJam处于劣势,因为它通常是“早期”符号和“后期”字母的组合。但是,不,您出现并再次破坏它了...干杯!
Sanchises

7

Haskell,152827 95742 91196 83921 77447 71742

a=(.);_ZYXWVUTSRQPONMLKJIHGFEDCBA=("#Haskell, "++)`a`show`a`sum`a`fmap(^2)`a`(tail>>=zipWith(-))`a`fmap fromEnum`a`(""++)

用法(注意:"必须转义):

_ZYXWVUTSRQPONMLKJIHGFEDCBA   "a=(.);_ZYXWVUTSRQPONMLKJIHGFEDCBA=(\"#Haskell, \"++)`a`show`a`sum`a`fmap(^2)`a`(tail>>=zipWith(-))`a`fmap fromEnum`a`(\"\"++)"

"#Haskell, 71742"

我将空字符串""放在输入字符串的前面,以帮助Haskell解释器确定类型。没有它,类型推断将失败,代码太多态。剩下的一切照常进行:将每个字符映射到ascii,列出邻居差异,平方,和和前置语言名称。


6

> <>,​​30227

0&ii:0(?v:@-:*&+&20.
'#><>, '<;n&oooooo

加,标题加倍了我的得分;用我自己的程序来说,n&oooooo!我会花一些时间使它变得更好。我也知道这个分数可能不正确,因为我不能真正在在线解释器中输入换行符,而且我不确定是否有办法在正式的解释器中填充输入堆栈。

绝不进行完全优化,而是充分利用了> <>中命令的相对接近度(至少就ASCII字符而言)。我无法轻松地将换行符作为输入提交,因此我使用了Pyth评分检查器,但它与我使用的一堆随机测试用例相匹配,因此就可以了。

这是一个得分为30353(应该是正确的,因为它是一行):

0&l1=66+*77++0.$:@-:*&+&10.' ,><>#'oooooo&n;

不错,在> <>中具有竞争力!
Sanchises

5

爪哇,66465 65506 62434

令人惊讶的短。接受一个char数组而不是一个字符串。

ABCD->{int A98=0,GFEDCBA=1,A987;for(;GFEDCBA<ABCD.length;A98=A98+(A987=ABCD[GFEDCBA]-ABCD[GFEDCBA++-1])*A987-0);return"#Java, "+A98;}

我使用了一个程序来生成最佳的变量名。


您将如何在程序中使用它?(我对Java 8功能还不是很熟悉)
aditsu


哦,所以您必须为其定义目标功能接口……不完全是一流的对象。
aditsu

@aditsu如果需要,还可以使用Function <char [],String>。
TheNumberOne

哦,我明白了…… ((Function<char[],String>) ABCD->{…}).apply(…),谢谢。没有类型上下文,这些lambda似乎是不完整的。
aditsu


4

Windows PowerShell ISE主机,62978 63894 67960 77050

PARAM($4)($4.LENGTH-2)..0|foreach{$9=+$4[$_]-$4[$_+1];$0+=$9*$9};'#'+$HOST.NAME+', '+$0

编辑-通过删除$A变量而不是通过字符串向后计数以及将一些关键字转换为CAPS来保存一些点

Edit2-通过使用$($HOST.NAME)而不是保存了更多点PowerShell

Edit3-通过交换变量名称并更改输出的生成方式来保存更多点。

使用以数字命名的变量,因为它们“更接近”,$因此我们的代价更少。

使用常规高尔夫技术很有趣。例如,|%{$是22534,而|foreach{$只有8718。

在不更改技术的情况下,这可能接近最佳。


1
正是我所希望的。干杯!
Sanchises

4

MATLAB,19214 39748 39444 38785 37593

@(A9876543210)sprintf('#MATLAB, %d',diff(A9876543210)*diff(A9876543210'))

感谢Luis Mendo进一步减少了差额!

感谢NumberOne通过更改输入变量名称来减少噪声计数!

如何运作

  1. 声明一个匿名函数,该函数存储ans在MATLAB 的默认变量中
  2. 该函数接收存储在其中的字符串,A9876543210并打印出该字符串的相邻平方差的和。
  3. diff在数组中查找成对的相邻差,并生成的数组length(A9876543210)-1。通过diff在字符串数组上使用,它将转换为一个double数组,在该数组中生成每个字符的ASCII码,并且连续对的差异导致另一个数组。
  4. 要找到平方差的总和,您只需简单地获取此差分数组及其转置的点积。这样做diff(A9876543210)'实际上比生产更多的噪音A9876543210.'(感谢路易斯Mendo!)
  5. 结果打印到屏幕上。

在PPCG中,通常允许未命名的功能。因此您可以删除A=
Luis Mendo 2015年

此外,norm(diff(B))^2时间更短
Luis Mendo 2015年

@LuisMendo-试过了。它打印出科学表示法,不尊重语法%d
rayryeng-恢复莫妮卡2015年

为什么使用B变量名?A=@(A)...是有效的MATLAB,因为它A是作用域的。
Sanchises

3
A-> A9876543210
TheNumberOne

4

QBasic,38140

YAY FOR SHOUTY语法

LINE INPUT A9876543210$:AAA=ASC(A9876543210$):WHILE A<LEN(A9876543210$):AA9876543210=AAA:A=1+A:AAA=ASC(MID$(A9876543210$,A)):A98765432100=A98765432100+(AA9876543210-AAA)*(AA9876543210-AAA):WEND:?"QBasic,";A98765432100

(已通过QB64测试。)

这是一个完整的程序,可以输入字符串并输出答案。这里唯一的限制是该程序不能接受多行输入(LINE INPUT只要是单行,就可以处理任何内容)。

消除混淆:

LINE INPUT line$
b=ASC(line$)
WHILE i<LEN(line$)
    a=b
    i=i+1
    b=ASC(MID$(line$,i))
    score=score+(a-b)*(a-b)
WEND
PRINT "#QBasic,"; score

方便地,传递一个多字符字符串来ASC给出第一个字符的ASCII值。同样方便的是,数字变量会自动初始化为零。


我以前从未在QBasic中进行编码,所以如果我输入错误,请原谅我,但是是否可以用大写字母替换变量以节省一些额外的积分?
ASCIIThenANSI,2015年

@DLosc啊,好的。我正在阅读去混淆的版本作为实际程序。:|
ASCIIThenANSI,2015年

3

蟒蛇2,91026

lambda A:"#Python 2, "+`sum((ord(A9876543210)-ord(A98765432100))**2for A9876543210,A98765432100 in zip(A,A[1:]))`

定义一个采用字符串并返回分数的匿名函数。在线尝试

其中大多数是非常简单的功能实现:使用zip Awith A[1:]获得字母对列表,然后ord用生成器表达式减去其s,square和sum。

观察该生成器表达式中的两个变量是永远只能跟以下特点:),,和空间。这三个变量的ASCII值都非常低,因此我们应该以尽可能低的ASCII值结尾每个变量。可以在Python中结束变量的最低字符是0。此外,每一次我们将一个较大的跳跃分成两个较小的跳跃的机会,都会降低得分:A0花费289,但A90只有145,并且只有A987654321073。

(这种做法并没有帮助λ变量A,可能是因为它后面[的一个发生。)


3

JSFuck,144420642

从以下位置进行构建:

t=arguments[0];n=0;for(u=1;u<t.length;++u)n+=(f=t.charCodeAt(u)-t.charCodeAt(u-1))*f;return'#JSFuck, '+n

将其粘贴到JSFuck.com的小输入框中,以将其编译为JSFuck。结果是一个112701个字符的长脚本,所以我不能在这里放它。该脚本的最后两个字符是括号,将输入放在它们之间。

...)[+!+[]])('abd')

该程序需要在我的计算机上花费将近20秒钟来进行自我评估。


说明

我有更多时间来处理这个问题,所以我坐下来尝试优化变量名。以下是值得使用的变量名称,按其得分顺序排列。

u     ([][[]]+[])[+[]]                    17237
n     ([][[]]+[])[+!+[]]                  17437
f     (![]+[])[+[]]                       18041
t     (!![]+[])[+[]]                      18041
a     (![]+[])[+!+[]]                     18241
r     (!![]+[])[+!+[]]                    18241
d     ([][[]]+[])[!+[]+!+[]]              23405
N     (+[![]]+[])[+[]]                    23669
e     (!![]+[])[!+[]+!+[]+!+[]]           29217
i     ([![]]+[][[]])[+!+[]+[+[]]]         33581
l     (![]+[])[!+[]+!+[]]                 24209
s     (![]+[])[!+[]+!+[]+!+[]]            29217
uu    ([][[]]+[])[+[]]+([][[]]+[])[+[]]   36983

这是我已翻译为JSFuck的JavaScript:

score = 0;
for (u = 1; u < input.length; ++u)
  score += (difference = input.charCodeAt(u) - input.charCodeAt(u-1)) * difference;
return '#JSFuck, ' + score;

我仔细研究了JSFuck.com的翻译器,并弄清了它的评估功能是如何工作的。选中“ Eval源”后,该代码将成为自执行的JSFuck函数。但是,要获取输入,我们需要从函数内部访问arguments [0]。这将我们最终的JS代码带到...

t=arguments[0];n=0;for(u=1;u<t.length;++u)n+=(f=t.charCodeAt(u)-t.charCodeAt(u-1))*f;return'#JSFuck, '+n

(如果您想知道为什么我的前一个版本的得分比这个更低,那是因为它是一个JSFuck程序,它返回了一个需要被评估为JS的字符串。这也是为什么我没有将其保留在帖子中)


abs是不必要的。我想这可能会有所作为... :)
Sanchises

6
我发现分数令人困惑。您应该删除空格。特别是因为程序的输出应该是JSFuck, 102280181
mbomb007

@sanchises确实,我实际上忘记了首先放在第二个平方上,这就是为什么要使用Math.abs的原因。将修复。
多米诺骨牌

@ mbomb007哦,好,那也可以解决。
多米诺骨牌

3

果酱,23663 19389 11547

"#CJam,"32A;clYew[]ULC;;;;::- 0$.*:+

在线尝试

开始觉得可以通过策略性地添加更多字符来无休止地推动这一过程。但是我认为我已经开始达到收益递减的地步,所以我现在就停下来。例如,在我有的情况下ULC;;;,我可以向后使用整个字母,后跟26 ;,但是收益越来越小。

到目前为止,我剩下的最大差距是在初始字符串中的m和之间,。我没有找到任何合理的方法可以摆脱它。我敢肯定有办法。但是如果我把它推到极限,它可能看起来像丹尼斯的解决方案...


3

JAVASCRIPT,33911

$0123456789ABCDEFGHIJKLMNOPQRS=>/**/('#')+('JAVASCRIPT,')+(" ")+(($)/**/=0,($0123456789ABCDEFGHIJKLMNOPQRS[`split`]``[`map`]/**/(($$,$$$)/**/=>/**/($)/**/=Math[`pow`]/**/($0123456789ABCDEFGHIJKLMNOPQRS[T=`charCodeAt`]/**/($$$)+-($0123456789ABCDEFGHIJKLMNOPQRS[T]/**/(($$$)/**/>=6-5?/**/($$$)+-1:0.)),2)+($))),($))

到目前为止,这是我在代码高尔夫中做过的最愚蠢的优化之一。

支持Neil提出“评论垃圾邮件”建议= P


我认为您只需/**/在适当的位置插入即可节省5180 。
尼尔

3

JAVASCRIPT,31520

这个解决方案与我的另一个解决方案相比非常荒谬,非常不同,因此我觉得应该得到自己的回答。

A=>/**/(($)/**/=/**/(''),('000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000100000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000100000000000000000000000000000000000000001000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000100000000000000000000000000000000000000001000000000000000000000000000000000000000010000000000000000000000000000000000000000000100000000000000000000000000000000000000100000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000100000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010/-,+*)(')/**/[`split`]``[`reduce`]/**/(($$,$$$,$$$$)/**/=>/**/($$$)/**/>7.-07?/**/(($)+=/**/((/**/String[`fromCharCode`]/**/)(($$$$)+-($$))),($$$$))/**/:/**/($$)),/**/eval/**/($))

这是7306个字符,其中大多数是实际程序编码到该0/1字符串中,其余的只是对它进行解码。它通过获取每个“ 1”的索引减去上一个“ 1”的索引来获得必需的字符值而工作。然后将结果字符串评估为实际函数,该函数本质上是解决问题的标准高尔夫球程序(本身仅约105个字符)。


2

R,68911 57183 53816 52224

从STDIN中获取一个字符串,然后通过raw将其转换为整数。求差,平方并求和所得的向量。结果以字符串形式返回。感谢@nimi提供了变量名提示。

'&&'=sum;'&&&'=diff;'&&&&'=as.integer;'&&&&&'=charToRaw;'&&&&&&'=readline;'&&&&&&&'=paste;'&&&&&&&'('#R,','&&'((A='&&&'('&&&&'('&&&&&'('&&&&&&'()))))*A))

@nimi谢谢你,被2卡住了,试图使其简短:)
MickyT 2015年

2

Mathematica,33552

A=ToExpression;A@ExportString[A@Characters@(**)"001000100010001101001101011000010111010001101000011001010110110101100001011101000110100101100011011000010010110000100000001000100011110000111110010101000110111101010011011101000111001001101001011011100110011101011011001000110010111000100011001001100100000001000100011010010110011001100110011001010111001001100101011011100110001101100101011100110100000001010100011011110100001101101000011000010111001001100001011000110111010001100101011100100100001101101111011001000110010101000000001000110101110100100110"(**),(**)"Bit"(**)]

此代码求值一个未命名的函数,该函数计算输入字符串的“噪声”。它利用了二进制数据的ASCII表示本质上是“无噪声”的事实。您看到的二进制数据是字符串

"#Mathematica, "<>ToString[#.#&@Differences@ToCharacterCode@#]&

单单是一个有效的答案,满分为37848。

其他一切

A=ToExpression;A@ExportString[A@Characters@(**)"001..110"(**),(**)"Bit"(**)]

只是解码二进制字符串并将其解释为Mathematica代码。请注意,Mathematica的空注释(**)非常“低噪声”,并且实际上从"s中消除了噪声。


2

Java8:117170 100508 99062 98890

借助lambada表达式和变量的内联分配可以稍微缩短此代码。

A->{int B=0,D=0,E=0;char[] C=A.toCharArray();for(;D<C.length-1;)B+=(E=C[D]-C[++D])*E;return"#java, "+B;}

A-> A9876543210; B-> $ 0123456;C-> A; D-> AA; E-> $ 0123456789
TheNumberOne

2

Java,129300 128400 110930 106581 105101

B->{int A=0,C=A;char[]Z=B.toCharArray();for(;++C<Z.length;A=A+(Z[C]-Z[C-1])*(Z[C]-Z[C-1]));return\"#Java, \"+A;}

实际上,这一挑战使我比使用最短的解决方案更深入地思考要使用和优化的字符。我将继续努力降低电话数量。

这是一个lambda函数,B是表示该函数的字符串。"将其作为字符串传递时,请不要忘记对引号()进行转义。


2

佩斯16391

++C38828542027820dsm^-ChdCed2,Vztz

这里使用的唯一技巧是base-256编码#Pyth,,它的成本远低于字符串本身。

++C38828542027820dsm^-ChdCed2,Vztz    Implicit: d=' ', z=input()
                             ,Vztz    Pair each char in the input with its neighbour
                   m                  Map d in the above to:
                      Chd               ASCII code of 1st char
                         Ced            ASCII code of 2nd char
                     -                  Difference between the two
                    ^       2           Squared
                  s                   Take the sum
  C38828542027820                     '#Pyth,'
++               d                    '#Pyth,' + ' ' + result, implicit print

2

男,47033 52798

A9876543210(A9876543210) F AA9876543210=2:1:$L(A9876543210) S AAA9876543210=$A($E(A9876543210,AA9876543210-1))-$A($E(A9876543210,AA9876543210))**2+AAA9876543210
    Q "#M, "_AAA9876543210

要使用此功能,我们必须对引号和“转义”空格字符(在MUMPS中很重要!)进行转义,如下所示:

>$$A9876543210^MYROUTINE("A9876543210(A9876543210)"_$C(9)_"F AA9876543210=2:1:$L(A9876543210) S AAA9876543210=$A($E(A9876543210,AA9876543210-1))-$A($E(A9876543210,AA9876543210))**2+AAA9876543210"_$C(10,9)_"Q ""#M, ""_AAA9876543210")
#M, 47033

请注意,“ M”是“ MUMPS”的替代名称-执业者之间就哪个是正确的存在分歧。自然,我在这里选择了较短的选项。


您不应该初始化AAAA吗?
SSH

同样由于缺乏操作员优先级,您可以将S AAA = $ A($ E(A,AA-1))-$ A($ E(A,AA))** 2 + AAA-应该降低得分...
SSH

@SSH我假设在调用函数之前有一个干净的符号表(因此我不必塞满NEW东西)。因此,当我开始AAAA(现在AAA9876543210)进行算术运算时,它会被强制执行0(也许这只是Caché实现细节?我没有要测试的GT.M安装程序)。良好地呼吁经营者优先事项;我总是很难从纯粹的从左到右的角度来思考。(我也忘记了M有一个幂运算符-在编写CRUD应用程序时经常不会出现这种情况。)
senshin 2015年

真好!另外,由于是从左到右的执行方式,因此您不需要在** 2之前加上方括号
SSH

@SSH谢谢,不知道这些人是怎么进入那里的。我实际测量的版本没有该版本,因此得分仍然相同。
senshin 2015年

1

红宝石,118402

puts "#Ruby, #{a=0;aa=nil;File.read(ARGV[0]).each_byte{|aaa| aa||=aaa;a+=(aaa-aa)**2;aa=aaa};a}"

它通过命令行读取文件,例如ruby diff.rb /path/to/file。有改进的空间,这是我现在正在努力的事情。


1

C ++ 166345

void n(){int b=0,c,d;string a;cin >>a;for(c=1;c<a.length();++c){d=(a[c]-a[c-1]);b+=d*d;}cout<<"#C++, "<<b;}

1

佩尔93556

chomp($A=<>);$AAA=$AAAA=0;foreach$AAAAA(split'',$A){$AA=ord($AAAAA);$AAA+=($AAAA-$AA)**2 if($AAAA!=0);$AAAA=$AA}print'#Perl, '.$AAA

我会尽量减少这种情况。

事实证明,花括号({}ASCII 123和125)和下划线(_ASCII 95)非常昂贵,因为所有其他字符都在30-70范围内,这就是为什么我要格式化的原因if,以及为什么我使用的$AAAAA不是Perl钟爱的$_

可悲的是,所有与这些符号的变量是只读的,所以我不能把喜欢的组合优势$#$$


1

F#,136718 130303

let(A)=Seq.map;
(stdout.Write(Seq.sum(A(fun(AA)->AA*AA)(A((<||)(-))(((Seq.pairwise(A(int)(stdin.ReadToEnd())))))))))

哪里有一个\n;


1

POSIX Shell,172026

{ while IFS= read -N 1 A; do A1=$(printf %d \'"$A");test "$A1" -eq 0 && break;case $A11 in "")A111=0;;*)A111=$((A1-A11));;esac;A11="$A1";A1111=$((A111**2+A1111));done;echo "# POSIX Shell, $A1111";}

太糟糕了,我无法获得与Pyth检查器(178386)相同的结果...


1.“ Shell”不是一种编程语言。这看起来像Bash。2.您可以简单地从STDIN中阅读。无需阅读源代码本身。
丹尼斯

@Dennis谢谢,编辑...尽管我无法获得相同的结果,但也许仍然存在错误(至少一次,我获得了相同的结果,但未使用“压缩”版本)...
Alois Mahdal

1

卢阿,171078 117896

打高尔夫球:

A=string AA=A.sub AAA=io.read()AAAA=#AAA AAA=AAA..AA(AAA,AAAA,AAAA)AAAAA=0 AAAAAA=A.byte for AAAAAAA=1,AAAA do AAAAAAAA=AAAAAA(AA(AAA,AAAAAAA,AAAAAAA))-AAAAAA(AA(AAA,AAAAAAA+1,AAAAAAA+1))AAAAA=AAAAA+AAAAAAAA*AAAAAAAA end print(AAAAA)

取消高尔夫:

A=string 
AA=A.sub 
AAA=io.read()
AAAA=#AAA 
AAA=AAA..AA(AAA,AAAA,AAAA)
AAAAA=0 
AAAAAA=A.byte 
for AAAAAAA=1,AAAA do 
    AAAAAAAA=AAAAAA(AA(AAA,AAAAAAA,AAAAAAA))-AAAAAA(AA(AAA,AAAAAAA+1,AAAAAAA+1))
    AAAAA=AAAAA+AAAAAAAA*AAAAAAAA 
end 

print(AAAAA)

0

C ++,49031

一个采用c字符串并将结果写入标准输出的C ++宏

<::>(auto(A))<%long(AAA)=0,AA=A<:0:>;while(*++A)<%AAA+=(*A-AA)*(*A-AA);AA=A<:0:>;%>cout<<"#C++, "<<AAA;%>

在线尝试!


-3

C ++,5

    #include <iostream>
    #include <string>
    #include <cmath>
    using namespace std;

    void convertToASCII(string letter)
    {
        int count = 0;
        int ans = 0;
        int *diff = new int[]; //dynamic array

        for(int i=0; i<letter.length(); i++)
        {
            char x = letter[i]; //letter.at(i);

            if(i!=0){
                diff[i-1] = int(x)- int(letter[i-1]);
                count++;
            }
        }

        for(int j=0; j<count; j++){
            ans += pow(diff[j], 2.0);
        }

        cout << "#C++, " << ans << endl;
    }

    int main()
    {
        string plainText;
        cout << "Enter text: ";
        getline(cin, plainText);
        convertToASCII(plainText);
        system ("pause");
        return 0;
    }

7
欢迎来到编程难题和代码高尔夫球!这是一个有效的答案,但是您对此挑战的得分应该是通过程序中的文本运行的结果。您还应该尝试尽可能降低该分数。尝试浏览这些 页面上的提示,以了解如何缩短代码并降低得分。
ETHproductions's
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.