编码高尔夫测量师©2019


20

编码高尔夫测量师©2019

与一起使用的Hexdump xxd看起来像这样:

00000000: 666f 6f20 6261 7220 7370 616d 2065 6767  foo bar spam egg
00000010: 730a                                     s.

您的任务是将这种形式的十六进制转储转换为使用的字节数。

规则:

  • 通常的漏洞被禁止。
  • 这是,因此最短的有效答案(以字节为单位)将获胜。
  • 您可以在文本(0a)的末尾添加或不添加换行符。这意味着,如果十六进制转储以换行符(0a)结尾,则该输入可能会将其输出减少一。
  • 空输入(实际上什么都没有:空列表/字符串/等)必须输出0。
  • 输入可以采用任何形式
  • 输入将是有效的ASCII码,没有控制字符
  • 输入必须包含整个hexdump

测试用例:

00000000: 4865 6c6c 6f2c 2077 6f72 6c64 2120 4865  Hello, world! He
00000010: 6c6c 6f2c 2077 6f72 6c64 210a            llo, world!.

返回28或27

00000000: 0a                                       .

返回1或0

00000000: 6368 616c 6c65 6e67 650a                 challenge.

返回10或9

00000000: 4865 6c6c 6f2c 2077 6f72 6c64 21         Hello, world!

返回13


返回0 (实际上什么都不是:空列表/字符串/等)

对于非标准语言,解释会很好。


我们可以假设输入为ascii吗?可以包含控制字符吗?输入规则是什么?某些语言无法处理多行输入。我们可以填充最后一行,以便所有行都一样长吗?为什么要包含空白输入?
Stewie Griffin

@StewieGriffin是的;没有; 是; 因为如果xxd输入了一个空字符串,则不会输出任何内容。
gadzooks02

1
@StewieGriffin您在回答时编辑了评论,所以这里有一个扩展:是;没有; 只要包括整个转储,就可以根据需要输入它;见最后答案;是; 因为如果xxd输入空字符串,则它什么也不输出
gadzooks02

1
@JonathanAllan哦,是的,发现得很好。
gadzooks02

1
计算不包含右侧ASCIIfied数据的十六进制转储格式可能很有趣。每个人都只需要剥离十六进制部分,然后对其余部分进行字节计数。如果在hexdump的最后一行给出了挑战,那将迫使解析十六进制数(位置)并计算该行上的十六进制数字的数目。(就像我在查看objdump反汇编或nasm机器码答案的列表时手工做的一样。)我想我应该将其发布在沙箱中……
Peter Cordes,

Answers:


12

视网膜0.8.2,8字节

.{51}

.

在线尝试!说明:

.{51}

删除每行的前51个字符。(每行只能包含52到67个字符,因此每行始终匹配一次。)

.

计算剩余的非换行符。

如果不需要支持空输入,则为7个字节:

.{52}


在线尝试!说明:

.{52}

删除每行的前52个字符。(每行只能包含52至67个字符,因此每行始终匹配一次。)


比剩余字符(包括换行符)的数量多1。


7与&`.{52}
Grimmy

@Grimy太棒了...您必须将其发布为自己的答案。
尼尔

起初我没有注意到它,但实际上已经有了一个几乎相同的答案
Grimmy


7

V(vim),7个字节

Î51x
Ø.

在线尝试!

说明:

Î       " On every line...
 51x    "   Delete the first 51 characters
Ø.      " Count the number of remaining characters on any line

十六进制转储:

00000000: ce35 3178 0dd8 2e                        .51x...


5

APL(Dyalog扩展),18字节

完整程序。提示输入字符串列表(即字符列表)。

2÷⍨≢∊(1↓≠⊆⊢)¨49↑¨⎕

在线尝试!

 提示

49↑¨ 每个取49个字符

(…… 对每个应用以下默认功能:

 论点

 切成小段的字符

 与填充字符(空格)不同

1↓ 删除第一个“单词”

ε NLIST(扁平化)

 相符

2÷⍨ 除以二


4

果冻,5 个字节

Ẉ_51S

一个Monadic Link,接受产生整数字节计数的行列表。

在线尝试!

怎么样?

Ẉ_51S - Link: list of lists of characters, H
Ẉ     - length of each (line in H)
  51  - literal fifty-one
 _    - subtract (vectorises)
    S - sum

您可以接受行列表。另外,您是否愿意添加说明?
gadzooks02

太酷了,空输入是一个空列表还是一个空行的列表?(由于情况
乔纳森·艾伦

它和空列表/字符串/等。我已经澄清了这一点。
gadzooks02

谢谢,现在也添加了解释。
乔纳森·艾伦

3

C(gcc)64 55字节

r;s[];f(l){while(*s=0,gets(s),l=strlen(s))r+=l-51;l=r;}

在线尝试!

由于YSC,减少了9个字节!

这是一个受Arnauld JavaScript解决方案启发的更脆弱的版本,可能由于输入过多而失败:

C(gcc),50个字节

s[];f(l){l=read(0,s,1<<31);l=l?l/68*16+l%68-51:0;}

在线尝试!


1
59字节,更改return rl=r
girobuz

2
@JonathanFrech未定义的行为非常适合代码高尔夫!
G. Sliepen

1
@YSC Hm,但是我认为使r global违反了以下规则:如果您定义一个函数来执行某项操作(并且不是main),则应该可以多次调用它。
G. Sliepen

1

2
@girobuz while()与的字节数相同for(;;)。因此;while()for(;;)
乔纳森·弗雷奇

3

Python 3,48 46字节

lambda s:(len(s)or 51)+1-52*len(s.split('\n'))

输入作为字符串传递给函数。该函数增加输入的长度(包括换行符),然后为每行减去52。

在线尝试


2
据我所知,f=可以将其作为`f =`移入标题,仅将lambda保留为代码并保存两个字节:在线尝试!
gadzooks02

@ gadzooks02谢谢,将进行编辑。这f=是我从Python不和谐服务器中习得的习惯。
IFcoltransG



2

05AB1E8 6字节

€g51-O

在线尝试!

输入为字符串列表。

€g     get lengths of each line
51-    subtract 51 from each
O      push the sum of the resulting list
       implicitly print

1
抱歉,输入必须包含整个十六进制转储。(您会跳过每行末尾的字母)
gadzooks02

哦,我的坏。我在智能手机上制作的。没看到十六进制代码后面有什么。我做了一个更正。
多利安

2

IBM / Lotus Notes公式语言,53字节

@Sum(@Length(@Explode(@Right(@Left(i;"  ");": ")))/2)

没有Formula的TIO,因此以下是测试用例的屏幕截图:

enter image description here enter image description here enter image description here enter image description here enter image description here

该公式位于计算字段中,该字段提供“返回”之后的值。

说明

这很好地说明了Formula将无需循环就将函数递归应用于列表的方式。公式位于与可编辑输入字段“ i”相同格式的计算字段中。

  1. 从中间开始。@Left@Right允许使用字符串定界符或许多字符。因此,我们:在两个空格的第一个出现位置的右侧搜索,然后在左侧搜索。由于Formula将换行视为列表分隔符,因此它将对输入中的每一行应用换行符。
  2. @Explode是Formula的等效split功能,默认为空格,;。再次将其应用于字段中的每一行,但是这次将结果合并到一个列表中。
  3. @Length然后将应用于列表的每个成员。在每种情况下,我们将其返回值除以2。
  4. @Sum 整个列表并输出结果。

1
您是否有指向口译员的链接(在线或已下载)?
gadzooks02

不幸的是没有。Formula是与IBM产品绑定的一种专有语言(我在一段时间之前曾在Meta上问过,是否允许在此网站上使用,答案是“是”,但对于Cops&Robbers的挑战却不是)。上次查看时,仍然可以从IBM免费下载Domino Designer(支持Formula)。不幸的是,仅Windows操作系统以及我在家运行Linux时无法确认。这个答案是在我午休时间写的,因为我很不幸仍然支持一些旧的Notes应用程序,并且仍在我的机器上运行Notes :-)
ElPedro

1
顺便说一句,如果您在此站点上搜索Lotus Notes,您会发现我是唯一一个愚蠢的人,他尝试用这种语言打高尔夫球:-)
ElPedro

1

JavaScript(ES6),34个字节

s=>(n=s.length)&&(n/68<<4)+n%68-51

在线尝试!

已评论

s =>                // s = input string
  (n = s.length) && // n = length of s; return 0 right away if n = 0 (special case)
  (n / 68 << 4) +   // otherwise compute the number of full lines and multiply it by 16
  n % 68 - 51       // add the length of the last line minus 51





0

sh,36个字节

使用zsh的默认标志:

for l (${(f)1})((c+=$#l-52))
<<<$[c]

在线尝试!

${(f)1}$1在换行符上分割,并丢弃空行。在$[ arithmetic expansion ]对空的情况下,当循环不落卫士$c

sh,28个字节

-o extendedglob

<<<${#${(F)${(f)1}#?(#c52)}}

在线尝试!

(f)在换行符上进行拆分,${ #?(#c52)}删除前52个字符,(F)在换行符上进行合并,以便按字符计数而不是按列表${# }计数来计数字符。


0

asm2bf,135个字节

高尔夫球版:

lbl 3
mov r2,51
lbl 1
in_ r1
dec r2
jz_ r1,4
jnz r2,1
lbl 2
in_ r1
jz_ r1,4
sub r1,10
jz_ r1,3
inc r3
jmp 2
lbl 4
out r3

评论版本:

lbl 3               ; Main loop - the kinda entry point

    mov r2, 51      ; Loop 51 times.
    lbl 1           ; Loop start.
        in_ r1      ; Read character
        dec r2      ; Decrement the loop accumulator.
        jz_ r1, 4   ; If zero was read, end.
        jnz r2, 1   ; If we still loop, loop again.

    lbl 2           ; Second loop, accumulating the result.
        in_ r1      ; Read a character.
        jz_ r1, 4   ; If character is zero, end the loop and print result.
        sub r1, 10  ; Decrement r1 by 10 for next check.
        jz_ r1, 3   ; If the character - 10 (the newline) is zero, jump to 3
        inc r3      ; Increment character read amount.
        jmp 2
lbl 4
    out r3          ; Print out the result as an ASCII character.
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.