会说话吗?


46

在一个较早的挑战中,我要求打高尔夫球的人制作出可以复制字符串中每个字符的字符串。例如:

TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!

挑战仅在于检测某些文本是否符合双重发音字符串的定义。

  • 偶数个字符。
  • 分成两对时,每对都包含两个相同的字符。

挑战

  • 这是代码高尔夫球,只需几个字节即可完成。
  • 使用您选择的任何语言。
  • 请提供在线翻译的链接。
  • 该代码将接受一些文本。
    • 为简单起见,输入将仅包含可打印的ASCII字符
  • 它将返回有关输入是否为双向通话的指示。它可能是:
    • 一个布尔值
    • 字符串(“ true”,“ false”,“ yes”,“ no”等)
    • 整数0或1

测试用例:

  • aba-错误
  • abba-错误
  • aabb-是的
  • aaabb-错误
  • tthhiiss-是的
  • ttthhhiiisss-错误

6
输入长度是否小于2可能会出错吗?
科尔

3
建议的测试用例:abba应该是假的
Giuseppe

2
建议的测试用例:aabbbb应该是真实的
Khuldraeseth na'Barya

2
@val好吧,我不会用标准I / O争辩
AJFaraday

2
建议的测试用例:0应该是假的。
640KB

Answers:



24

头脑操,20字节

感谢Jo King,节省了1个字节。

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

在线尝试!

可读的输出!

一次输入两个字符,如果任何一对都不匹配,则从磁带上的1移开。EOF被视为0,因此会自动处理。

如果字符串不是双向输出,则输出为空字节,否则为0x01。可读版本将这些字符输出为字符,成本为14个字节。


如果我可以拒绝评论,则可以拒绝上面的评论。
A _

@PerpetualJ A)这是一个非常受欢迎的esolang,我不敢相信您还没有听说过B)那不是
投票

@RedwolfPrograms根据SE规则,如果该帖子对您有所帮助,则应该投票赞成,它有助于教给我一种我从未听说过的语言的名称。另外,这是一个值得赞扬的好解决方案。
PerpetualJ

1
@PerpetualJ同意这是一个很好的解决方案,但是有很多带有有趣名称和无聊解决方案的esolang(大多数是BF变体)
Redwolf Programs

17

MATL,4个字节

Heda

输入是一个字符串,用单个qoutes括起来。输出是0说两句,1否则。

在线尝试!

说明

以输入'TThhiiss iiss ddoouubbllee ssppeeaakk!!'为例。

H    % Push 2
     % STACK: 2
     % Implicit input (triggered because the next function requires two inputs): string 
     % STACK: 'TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!', 2
e    % Reshape as a 2-column matrix of chars, in column-major order. Pads with char(0)
     % if needed. Note that char(0) cannot be present in the input
     % STACK: ['This is double speak!';
               'This is double speak!']
d    % Difference of each column
     % STACK: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
a    % Any: gives 0 if and only if all elements are 0
     % STACK: 0
     % Implicit display

12
嗯...谁是“赫达”?:D
的Outgolfer埃里克

7
“ Heda”是德语的“嘿!你!”
QBrute

14

05AB1E6 5 2 字节

ιË

输入为字符列表。

通过移植@Shaggy的Japt答案 -3个字节,因此请确保对他进行投票

在线尝试验证更多测试用例

说明:

ι   # Uninterleave the (implicit) input-list of characters
    #  i.e. ["t","t","t","t","e","e","s","s","t","t","!","!","!"]
    #   → [["t","t","e","s","t","!","!"],["t","t","e","s","t","!"]]
 Ë  # Check if both inner lists are equal
    #  → 0 (falsey)
    # (after which the result is output implicitly)


10

视网膜,9字节

(.)\1

^$

在线尝试。

说明:

删除所有成对的相同字符:

(.)\1

检查是否还没有字符:

^$

1
您可以通过将其^$用作最后阶段来提供更传统的输出。
尼尔

@Neil当然,谢谢!确实看起来更好。我一直认为输出false为真和true假是很奇怪的(但是如果它保存一个字节并且允许它,我仍然会使用它)。;)但是,由于这是输出期望结果的等字节解决方案,因此更好。
凯文克鲁伊森

8

果冻,3个字节

ŒœE

在线尝试!


1
嘿,我喜欢这个!我花了80秒钟来做同样的事情,就像是“嘿,让我们现在学习果冻”,然后我学会了。我正要发布此消息,但查看果冻答案是否已经存在...然后看到此^^我的步骤:¹©s2L€=2Ạa®s2E€Ạ... ḢƝs2E€Ạ...但是我无法设法得到想要的东西,然后我看到了Œœ大声笑
V.Courtois


6

PHP58 56个字节

function f($s){return!$s?:$s[0]==$s[1]&f(substr($s,2));}

在线尝试!

作为递归函数。

PHP61 56 52个字节

while(''<$l=$argn[$i++])$r|=$l!=$argn[$i++];echo!$r;

在线尝试!

或独立程序。通过输入字符串STDIN,输出是truthy1)如果是双说话,falsey0),如果它不是双重说话。

@ Night2到-4个字节!


1
对于非双重说话的字符串和双重说话的字符串,这似乎输出1。
AJFaraday

@AJFaraday现在尝试- 是双重发言不是双重发言
640KB

6

x86机器码 9 7字节

D1 E9       SHR  CX, 1          ; divide length in half 
AD          LODSW               ; load next two chars into AH/AL 
3A E0       CMP  AH, AL         ; compare AH and AL 
E1 FB       LOOPE -5            ; if equal, continue loop

输入字符串in SI,输入字符串长度in CXZF如果说两次,则输出。

14个字节作为完整的PC DOS可执行文件:

B4 01       MOV  AH, 01H        ; DOS read char from STDIN (with echo) 
CD 21       INT  21H            ; read first char into AL
92          XCHG DX, AX         ; put first char into DL
B4 08       MOV  AH, 08H        ; DOS read char from STDIN (no echo) 
CD 21       INT  21H            ; read second char into AL
3A C2       CMP  AL, DL         ; compare first and second char 
74 F3       JE   -13            ; if the same, continue loop 
C3          RET                 ; otherwise exit to DOS 

通过STDIN管道或交互式输入。将回显“已加倍”的输入,直到检测到未加倍的字符为止,这时将退出(也许弯曲一点I / O规则,但这只是一个额外的答案)。

在此处输入图片说明

使用xxd -r以下命令构建和测试ISDBL2.COM :

00000000: b401 cd21 92b4 08cd 213a c274 f3c3       ...!....!:.t..

原始的24个字节的完整PC DOS可执行文件:

D1 EE       SHR  SI, 1          ; SI to DOS PSP (080H) 
AD          LODSW               ; load string length into AL 
D0 E8       SHR  AL, 1          ; divide length in half 
8A C8       MOV  CL, AL         ; put string length into BL 
        CLOOP: 
AD          LODSW               ; load next two chars into AH/AL 
3A E0       CMP  AH, AL         ; compare AH and AL 
E1 FB       LOOPE CLOOP         ; if equal, continue loop
        DONE: 
B8 0E59     MOV  AX, 0E59H      ; BIOS tty function in AH, 'Y' in AL 
74 02       JZ   DISP           ; if ZF, result was valid double 
B0 4E       MOV  AL, 'N'        ; if not, change output char to N 
        DISP: 
B4 0E       MOV  AH, 0EH 
CD 10       INT  10H 
C3          RET                 ; return to DOS

从命令行输入'Y''N'如果不是,则输出到屏幕。

在此处输入图片说明

使用xxd -r以下命令构建和测试ISDBL.COM :

00000000: d1ee add0 e88a c8ad 3ae0 e1fb b859 0e74  ........:....Y.t
00000010: 02b0 4eb4 0ecd 10c3                      ..N.....

学分:

  • @ErikF -2个字节

2
建议使用LOOPE代替JNZ/ LOOP来节省2个字节。
ErikF

@ErikF,太棒了!完全忘记了!
640KB

6

的Lua67个 66 63 59 33 32字节

-25字节归因于Giuseppe
-1字节归因于val

print(#(...):gsub("(.)%1","")<1)

在线尝试!

删除每个加倍的字符,然后检查结果是否为空。


1
为什么不只是i:gsub("(.)%1","")检查一下i==""呢?
朱塞佩

1
是34个字节,由于我之前从未写过Lua,因此不能完全确定它是否有效,但它似乎可以工作。
朱塞佩

欢迎来到Code Golf Stack Exchange!
朱塞佩

我以为"(.)%1"它本身就包括碰撞,但是我没有想到只需为所有捕获替换一次就足够了。我应该实施您的解决方案还是应该编写自己的答案?谢谢!
HugoBDesigner

1
好主意!arg[1]可以替换(...)为节省一个字节。
val




5

Haskell28 23字节

f(x:y:z)|x==y=f z
f[]=1

在线尝试!

非常简单。重复说话只能是空的,也可以是重复的字符加上重复说话。

现在不那么直接了。根据元共识,通过有无错误产生的输出;没有错误意味着说两次。当前两个字符不同或字符数奇数时,模式匹配将失败。感谢Laikoni节省了这些!


4

V(vim),7个字节

Óˆ±
ø^$

在线尝试!验证测试用例

十六进制转储:

00000000: d388 b10a d85e 24                        .....^$

只有两个正则表达式。说明:

Ó   " Remove all occurrences...
 ˆ  "   Any character
  ± "   Followed by itself
    "   This regex is actually just the compressed form of (.)\1
ø   " Count the number of matches
 ^$ "   An empty line


4

PowerShell39 38字节

!$($args|?{+$p*($p="$_"[$p-eq$_])};$p)

在线尝试!

其中$p包含先前的字符。

没有递归,没有正则表达式 :)。通过splatting字符串将输入作为字符数组输入(请参见TIO链接)。


PowerShell,48字节

for(;$b-eq$a-and$args){$a,$b,$args=$args}$b-eq$a

在线尝试!

没有递归,没有正则表达式,也没有管道:D。它还通过splatting字符串将输入作为字符数组。$b-eq$a相反$a-eq$b,它用于最后一个字符具有#0代码的情况。


4

PowerShell64 59字节

filter f($n){$a,$b,$r=$n;$a-eq$b-and$(if($r){f $r}else{1})}

在线尝试!

递归函数,无正则表达式。将输入作为char-array(请参见TIO链接)。将前两个元素剥离到$a和中$b,将剩余的元素存储到中$r。如果我们还有剩余元素,请与一起递归$a -eq $b。否则,请检查是否$a -eq $b。输出是隐式的。

-5个字节,感谢mazzy


1
重复数据删除在线尝试!
mazzy

1
@mazzy谢谢!我错过了$before语句块,无法弄清楚为什么它不起作用。
AdmBorkBork



4

莎士比亚编程语言204个 156字节

-48个字节,感谢Jo King(主要是通过更改输出方法)

A.Ajax,.Puck,.Act I:.Scene I:.[Exeunt][Enter Ajax and Puck]Ajax:Open mind.Puck:Open
mind.Is I worse zero?If soSpeak thy.Is you as big as I?If soLet usAct I.

在线尝试!

如果输入是双向,则错误退出,如果输入不是双向,则警告退出(默认情况下允许)。


4

小桶19 17个字符

?{!1<|=[|0.(_)]}1

说明:

?             # read input

{             # while
    !1<       # stack length greater than 1?
|             # end of while condition and beginning of while block
    =         # compare the 2 top values in the stack
    [         # if (the condition is the top of stack)
    |         # end of then block and beginning of else block
        0.    # output 0
        (_)   # clear stack (discard top of stack in for loop stack length times)
    ]         # end if
}             # end while

1             # stack is already empty, push a truthy value

              # implicitly output the stack content if there was no explicit output

在线尝试!


3

R53 34字节

-19字节归功于Giuseppe

function(a)gsub("(.)\\1","",a)==""

在线尝试!


1
我认为gsub("(.)\\1","",a)==""也可以解决问题。许多其他人使用相同的正则表达式。
朱塞佩

@Giuseppe这整个正则表达式对我来说还是很新的。谢谢。
罗伯特·S。

R + pryr使您从此答案中得到了32位的平凡修改。
Khuldraeseth na'Barya

2
如果输入可以作为向量,function(a)!sum(rle(a)$l%%2)则为28
MickyT

3

脑高射炮26,22个字节

({<({}[{}])>{()<>}{}})

在线尝试!

输出1表示false,0表示true。

可读版本:

({
    <({}[{}])>
    {
        ()
        <>
    }
    {}
})

我最初有这个:

{
    ({}[{}])

    {
        <>([()])<>{{}}
    }{}
}
<>({}())

长10个字节。


0 / non0是否算作布尔值?如果是这样,你可以做({({}[{}]){{}}{}})
莱利

3
大声笑在“可读版本”-它是如此可读:P
奎因

@riley不,那是无效的。但是,我发现了一个更好的技巧。
DJMcMayhem

@quinn对我来说似乎可读:P
DJMcMayhem




3

Zsh,36个字节

我对以前挑战的Zsh回答可以在这里找到。

如果说话,则退出真(0),如果说话则退出(1)。(如评论所允许。)

for a b (${(s::)1})r+=${a#$b}
[ $r ]

for a b (${(s::)1})r+=${a#$b}
         ${(s::)1}             # split $1 characterwise
for a b (         )            # take pairs of characters from ${(s::)1}, assign to $a and $b
                      ${a   }  # first character
                      ${ #$b}  # remove second character as prefix
                   r+=         # append to $r as string
[ $r ]                         # exit truthy if $r is non-empty

在线尝试!


3

Prolog(SWI)60 45字节

多亏了不相关的字符串

+[].
+[A,A|T]:- +T.
-X:-string_chars(X,Y),+Y.

在线尝试!

将其从字符串转换为原子列表会破坏得分,但是很好。



1
...看起来您也可以使用atom_chars代替string_chars,即使您将字符串作为输入,而不是原子。但是,如果您可以采用反引号分隔的字符串(即,字符代码列表),则可能无关紧要。
不相关的字符串
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.