这是n说话吗?


33

受到启发吗?,我提出了更艰巨的挑战。给定一个字符串,对于任何,确定该字符串是否为n-speakñ2

通过重复每个字母次来定义语音。当,字符串转换为。您的目标是弄清楚该输入对于任何n语音转换是否有效。ññ=4HelloHHHHeeeelllllllloooo

应当注意,对于,任何有效的n口语句子也是有效的k口语。因此,要解决的困难部分将是奇数值。ñ=2ķñ

输入值

至少包含2个字符的字符串。输入也可以是字符列表。输入区分大小写。

输出量

Truthy如果字符串是n说话,则为falsey否。

例子

真实情况

HHeelllloo,,  wwoorrlldd!!
TTTrrriiipppllleee   ssspppeeeaaakkk
QQQQuuuuaaaaddddrrrruuuupppplllleeee    ssssppppeeeeaaaakkkk
7777777-------ssssssspppppppeeeeeeeaaaaaaakkkkkkk
999999999
aaaabb
aaaaaaaabbbbcc
aaaaabbbbb
@@@

如果要生成其他真实情况,可以使用此MathGolf脚本。将字符串放在引号内,并将的值作为输入。ñ

虚假案件

Hello, world!
TTTrrriiipppllleee   speak
aaaaaaaaaaaaaaaab
Ddoouubbllee  ssppeeaakk
aabbab
aaaabbb
a (does not need to be handled)
(empty string, does not need to be handled)

当然,由于这是代码高尔夫球,请准备好修剪一些字节!


建议的测试案例:aabbab
亚当

建议的测试用例:aaaabbb
640KB,

我明天将它们都添加,很好的建议。
maxb

4
对于您使用并扩展了我的挑战,我感到非常荣幸和荣幸:)
AJFaraday

@AJFaraday很高兴您喜欢它!我很喜欢您的两个挑战,这使我有了这个想法。即将面临更大的挑战。
maxb

Answers:


16

APL(Dyalog Unicode),12个字节

与运行 ⎕io←0

1≠∨/⍸2≠/∊00

在线尝试!

和阿达姆一起打高尔夫球

在输入上(示例:"aaccccaaaaaabb"""用于表示字符串(字符数组)和''表示字符)

∊0⍞0 用0环绕并展平, 0 'a' 'a' 'c' 'c' 'c' 'c' 'a' 'a' 'a' 'a' 'a' 'a' 'b' 'b' 0

2≠/ 进行成对不相等 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1

得到索引为0的索引 0 2 6 12 14

∨/ 计算GCD, 2

1≠ 这不等于1吗?


10

Java 10,85个字节

s->{var r=0>1;for(int i=0;++i<s.length();)r|=s.matches("((.)\\2{"+i+"})*");return r;}

正则表达式从@Arnauld的JavaScript答案移植而来。

在线尝试。

说明:

s->{                          // Method with String parameter and boolean return-type
  var r=0>1;                  //  Result-boolean, starting at false
  for(int i=0;++i<s.length();)//  Loop `i` in the range [1, input-length):
    r|=                       //   Change the result to true if:
      s.matches("((.)\\2{"+i+"})*");
                              //    The input-String matches this regex
                              // NOTE: String#matches implicitly adds a leading ^ and 
                              //       trailing $ to match the full String
  return r;}                  // After the loop, return the result-boolean

正则表达式说明:

^((.)\2{i})*$                 // Full regex to match, where `i` is the loop-integer
^           $                 // If the full String matches:
  (.)                         //  A character
     \2{i}                    //  Appended with that same character `i` amount of times
 (        )*                  //  And that repeated zero or more times for the entire string


7

JavaScript(ES6),53个字节

源自@wastl中使用的正则表达式

s=>[...s].some((_,n)=>s.match(`^((.)\\2{${++n}})*$`))

在线尝试!


递归版本,55字节

s=>(g=n=>s[++n]&&!!s.match(`^((.)\\2{${n}})*$`)|g(n))``

在线尝试!

已评论

s => (                    // s = input string
  g = n =>                // g is a recursive function taking a repetition length n
    s[++n] &&             // increment n; abort if s[n] is not defined
    !!s.match(            // otherwise, test whether s consists of groups of:
      `^((.)\\2{${n}})*$` //   some character, followed by n copies of the same character
    )                     //
    | g(n)                // or whether it works for some greater n
)``                       // initial call to g with n = [''] (zero-ish)

7

05AB1E,5个字节

γ€g¿≠

在线尝试!


我以为我在MathGolf中的14乘是不错的选择,但是您只是喜欢它。对于这个问题和您的果冻答案,我都希望能有一个解释。
maxb

2
@maxb这真的只是需要组游程的长度,计算它们的GCD和考验,如果不是1
埃里克Outgolfer



5

字节,16 字节SBCS

1≠∨/⍵
(.)\1*
⊃⍵L

在线尝试!

1≠ 与1不同

∨/ GCD

 结果的

(.)\1* PCRE搜索任何字符,后跟0个或多个重复

⊃⍵L 并返回第一个匹配长度(即匹配长度)



4

T-SQL 2008查询,193个字节

DECLARE @ varchar(max)='bbbbbbccc';

WITH C as(SELECT number+2n,@ t
FROM spt_values
WHERE'P'=type
UNION ALL 
SELECT n,stuff(t,1,n,'')FROM C
WHERE left(t,n)collate Thai_Bin=replicate(left(t,1),n))SELECT 1+1/~count(*)FROM C
WHERE''=t

在线尝试


“ collat​​e Thai_Bin”真的必要吗?
Y Wit博士

1
@DrYWit它取决于,数据库可以设置为区分大小写。但是区分大小写的数据库不是一个流行的选择。使用HASHBYTES或VARBINARY可以更好地进行处理,但这以字节为单位更加昂贵
t-clausen.dk,

4

PHP76 75字节

while(($x=strspn($argn,$argn[$n+=$x],$n))>1&&($m=max($m,$x))%$x<1);echo!$x;

在线尝试!

第一次尝试,是一种天真的迭代方法。

取消高尔夫:

// get the length of the next span of the same char
while( $s = strspn( $argn, $argn[ $n ], $n ) ) {

    // if span is less than 2 chars long, input is not n-speak
    if ( $s < 2 ) {
        break;
    }

    // k is GCD
    $k = max( $k, $s );

    // if span length does not divide evenly into GCD, input is not n-speak
    if( ( $k % $s ) != 0 ) {
        break;
    }

    // increment current input string index
    $n += $s;

}

-1个字节,谢谢@ Night2!


4

Perl 6的30 27 26个字节

{1-[gcd] m:g/(.)$0*/>>.to}

在线尝试!

也使用GCD技巧,但使用与正则表达式匹配的每次运行结束位置的索引。如果说n,则返回一个负数(真),否则返回零(假)。




3

Brachylog,5个字节

ġz₂=Ṁ

在线尝试!

通过输入变量获取输入,通过成功或失败获取输出。

起初我以为这实际上比我的解决方案简短吗?,但后来我意识到ġ可以并且将尝试将组长度设置为1。

ġ        It is possible to split the input into chunks of similar length
 z₂      such that they have strictly equal length, and zipped together
    Ṁ    there are multiple results
   =     which are all equal.

3

Japt ,8字节

ò¦ mÊrÕÉ

试试吧

ò¦ mÊrÕÉ     :Implicit input of string
ò            :Partition by
 ¦           :  Inequality
   m         :Map
    Ê        :  Length
     r       :Reduce by
      Õ      :  GCD
       É     :Subtract 1
             :Implicit output of boolean negation

3

Kotlin,78个字节

{s->(2..s.length/2).any{i->s.chunked(i).all{z->z.length==i&&z.all{z[0]==it}}}}

在线尝试!

说明

{s->                      Take a string as input
  (2..s.length/2)         The each string needs two parts at least, prevents the case "aaa" is 3-speak
    .any{i->              If there is any n (in this case i) that is n-speak return true
      s.chunked(i)        Split into length i substrings
      .all{z->            All substrings z
        z.length==i       Should be completely full, ie. "aaa"->["aa","a"]
        &&                And
        z.all{            All chars (it)
          z[0]==it        Should be the same as the first char
        }
      }
    }
  }

也许描述不清楚,但是“ aaa”是有效的3口语。输入的字符串应至少包含两个字符,但不必相同。
maxb

@maxb,好的,很酷。那应该是-2个字节。感谢更新。我会解决,明天
Brojowski

3

Scala,80字节

s=>"(.)\\1*".r.findAllIn(s).map(_.size).reduce((x,y)=>(BigInt(x) gcd y).toInt)>1

在线尝试!

PS。原始解决方案基于split功能,但更长(83字节)。

s=>(s+s).split("(.)(?!\\1)").map(_.size+1).reduce((x,y)=>(BigInt(x) gcd y).toInt)>1

不幸的trueaab,这返回输入。
maxb

@maxb,感谢您的检查。s.替换(s+s).为处理。
Y Wit博士

做得好!虽然现在我注意到它对aaaabb和失败aabbbb
maxb

@maxb,抱歉,现在我从开始就测试了所有测试用例。
Y Wit博士



2

Brain-Flak,96字节

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

在线尝试!

使用许多其他提交所使用的GCD技巧。如果输入不是n语音,则输出为0,否则为正整数。

# For each character in the input
{

  # Add 1 to current run length
  <>({}())<>

  # If current and next characters differ:
  ({}[({})]){

    # Clean up unneeded difference
    {}<>

    # Move current run length to left stack, exposing current GCD on right stack
    ({}<>)

    # GCD routine: repeat until L=0
    {

      # Compute L mod R
      {(({})){({}[()])<>}{}}<>

      # Move R to left stack; finish computing L mod R and push to right stack
      ([{}()]({}<>)<>)

    }

    # Push 0 for new run length
    (<>)<>

  }{}

}

# Output GCD-1
<>{}({}[()])

2

Oracle SQL,182字节

select+1-sign(min(length(x)-(select sum(length(regexp_substr(x,'(.)\1{'||i||'}',1,level)))from t connect by level<length(x))))from(select x,level i from t connect by level<length(x))

它假设输入数据存储在表t(x)中,例如

with t(x) as (select 'HHeelllloo,,  wwoorrlldd!!' from dual)

2

K(ngn / k)29 23字节

{~|/(&/s@&1<s)!s:#'=:x}

在线尝试!

编辑:删除了一些不必要的冒号(我知道什么时候需要一元运算符,但是并不总是清楚我是否存在歧义,所以我默认将冒号包括在内),并将mod更改x-y*x%y为ngn / k y!x,这意味着我可以删除变量赋值


1

APL(Dyalog Unicode)24 22 字节SBCS

匿名默认前缀功能。

⊂∊1↓⍳∘≢{⍵/⍨(≢⍵)⍴⍺↑⍺}¨⊂

在线尝试!

 使用整个字符串将字符串括起来以处理地图,
 例如"aaabbb"

⍳∘≢{......  每个的ɩ通过字符的字符串中的理货ndices 1:
 如3

⍺↑⍺ 从当前数量中获取当前元素的数量,以0填充,
 例如[3,0,0]

(≢⍵)⍴ 周期性ř ESHAPE成字符的帐簿中的字符串的形状
  例如[3,0,0,3,0,0]

⍵/⍨ 用它来复制字符串的字符
  "aaabbb"

1↓ 删除第一个(n = 1)

⊂∊ 整个字符串是该列表的成员吗?


您是否将输入字符串分成n个大小的块,并检查每个块中的所有字符是否相等?我还没有接触过APL,但它绝对是最易读的“高尔夫”语言。
maxb

@maxb我正在写说明。我正在过滤所有可能的遮罩[1,0,0,1,0,0…]等。我将很高兴教您APL(学习时间不长)。刚进入APL果园
阿达姆


@Cowsquack聪明,又不同,那为什么不发布{1<∨/≢¨⍵⊆⍨≢¨∪\⍵}
亚当

不幸的是,它失败了aacccaaaaabb
Kritixi Lithos于

1

视网膜0.8.2,28字节

M!`(.)\1*
.
.
^(..+)(\1|¶)*$

在线尝试!链接包括测试用例。说明:

M!`(.)\1*

将文本分成相同字符的行。

.
.

将它们全部替换为相同的字符。

^(..+)(\1|¶)*$

检查行程长度的GCD是否大于1。



1

MathGolf,14个字节

£─╞möl╠mÅ▀£╙╓┴

在线尝试!

说明

将输入字符串的所有可能的划分检查为相等长度的块,并检查是否存在一个分区,其中所有块仅具有一个唯一字符。

£                length of string with pop
 ─               get divisors
  ╞              discard from left of string/array (removes 1)
   mö            explicit map using 7 operators
     l           push input
      ╠          divide input into chunks of size k
       mÅ        explicit map using 2 operators
         ߜ      number of unique elements of list
           ╙     get maximum number of unique characters per chunk
                 loop ends here
            ╓    get the minimum of all maximums
             ┴   check if equal to 1


1

Pyth,8个字节

<1iFhMr8

在线尝试!

<1iFhMr8Q   Implicit: Q=eval(input())
            Trailing Q inferred
      r8Q   Run length encode Q into [count, character]
    hM      Take first element of each
  iF        Reduce by GCD
<1          Is 1 less than the above? Implicit print

1

Perl -n 5,38个字节

for$i(1..y///c){print/^((.)\2{$i})*$/}

在线尝试!

print"\n"页脚中是需要的输出分离。

直接循环遍历所有可能的ns。对于“ 1-说”不输出任何内容,对于“ n说”不输出任何其他内容,其中n> 1。

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.