これはn話ですか?


33

に触発されていますか?、私はより難しい挑戦を考案しました。文字列の場合、文字列を考えると、決定のn-話すいずれかのために、n2

N-speakは、各文字をn回繰り返すことで定義されます。でn=4、文字列がHelloに変換されますHHHHeeeelllllllloooo。あなたの目標は、入力がnピーク変換の有効な出力であるかどうかを把握することです。

n=2k場合に有効なn話である文はすべて、k話でも有効であることに注意してください。したがって、解くのが難しい部分はn奇数値になります。

入力

少なくとも2文字で構成される文字列。入力には文字のリストも使用できます。入力では大文字と小文字が区別されます。

出力

Truthy文字列がn-speakのfalsey場合、そうでない場合。

真のケース

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

追加の真実ケースを生成する場合は、このMathGolfスクリプトを使用できます。文字列を引用符で囲み、入力としてnの値を配置します。

偽例

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気に入ってくれて嬉しい!私はあなたの両方の挑戦を楽しんだので、このアイデアを思いつきました。すぐに来るより難しい挑戦があるかもしれません。
10

回答:


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

MathGolfでの14バイトは良いと思いましたが、あなたはそれを押しつぶしました。これとあなたのゼリーの答えの両方の説明が欲しいです。
maxb

2
@maxbそれは本当にちょうどそれが1ではない場合、そのGCDやテストを計算し、グループのランの長さを取る
エリックOutgolfer





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ウィット博士

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バイト、thxから@ Night2!


4

Perl 6の30の 27 26バイト

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

オンラインでお試しください!

GCDトリックも使用しますが、正規表現と一致する各実行の終了位置のインデックスを使用します。n-speakの場合は負の数(真)、それ以外の場合はゼロ(false)を返します。




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

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話です。入力文字列には少なくとも2文字が必要ですが、異なる必要はありません。
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

残念ながら、これはtrueinput aabに戻ります。
maxb

@maxb、チェックしてくれてありがとう。s.に置き換え(s+s).て処理します。
Yウィット博士

よくやった!今けれども私はそれがために失敗したことに気づいたaaaabbaabbbb
maxb

@maxb、おologiesび申し上げます。現在、開始ポストからのすべてのテストケースでテストしました。
Yウィット博士



2

Brain-Flak、96バイト

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

オンラインでお試しください!

他の多くのサブミッションが使用するのと同じGCDトリックを使用します。入力は、n-peakではない場合は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's y!xに変更しました


1

APL(Dyalog Unicode)24 22 バイトSBCS

匿名の暗黙の接頭辞関数。

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

オンラインでお試しください!

 文字列全体を使用して御馳走マップに文字列を囲み
 などを"aaabbb"

⍳∘≢{...  のそれぞれについて、ɩ:ndices 1文字列の集計による
 例えば3

⍺↑⍺ 現在の番号から現在の要素数を取得し、0でパディングします
 など[3,0,0]

(≢⍵)⍴ 周期的にrの文字列の集計の形状にeshapeを
  例えば[3,0,0,3,0,0]

⍵/⍨ それを使用して、文字列の文字を複製します
  "aaabbb"

1↓ 最初のもの(n = 1)

⊂∊ 文字列全体がそのリストのメンバーですか?


入力文字列をnサイズのチャンクに分割し、各チャンク内ですべての文字が等しいことを確認していますか?私はAPLには触れていませんが、間違いなく最も読みやすい「ゴルフ」言語です。
10

@maxb説明を書いている最中です。私はすべての可能なマスク[1,0,0,1,0,0…]などでフィルタリングしています。APLをお教えできることをうれしく思います(習得に時間がかかりません)。APL Orchardにポップするだけです。
アダム


@Cowsquack Clever、そして違うので、投稿してみません{1<∨/≢¨⍵⊆⍨≢¨∪\⍵}か?
アダム

残念ながら、失敗しますaacccaaaaabb
Kritixi Lithos

1

Retina 0.8.2、28バイト

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

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

M!`(.)\1*

テキストを同一の文字の実行に分割します。

.
.

それらをすべて同じ文字に置き換えます。

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

実行の長さのGCDが1より大きいかどうかを確認します。



1

MathGolf、14バイト

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

オンラインでお試しください!

説明

入力文字列のすべての可能な分割を等しい長さのチャンクにチェックし、すべてのチャンクに一意の文字が1つしかないパーティションがあるかどうかをチェックします。

£                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

Perl 5、38 -nバイト

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

オンラインでお試しください!

print"\n"フッターには、出力を分離するために必要とされています。

可能なすべてのを簡単にループしますn。「1-speak」の場合は何も出力せず、n> 1の場合はn-speakの場合は何も出力しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.