Bu n-konuşmak mı?


33

İlham verici mi Konuşuyor? , Daha zor bir mücadele tasarladım. Dize ise bir dize göz önüne alındığında, tespit n konuşması herhangi, n2 .

N-speak, her harf kez tekrarlanarak tanımlanır . İle , dize dönüştürülür . Amacınız, girişin herhangi bir n-konuşması dönüşümü için geçerli bir çıktı olup olmadığını belirlemektir.nn=4HelloHHHHeeeelllllllloooo

için geçerli n-speak olan herhangi bir cümlenin de geçerli k-speak olduğuna dikkat edilmelidir . Böylece, çözülmesi zor kısımlar tuhaf değerleri olacaktır .n=2kn

Giriş

En az 2 karakterden oluşan bir dize. Giriş, bir karakter listesi de olabilir. Giriş büyük / küçük harf duyarlıdır.

Çıktı

Truthydize n-konuş ise, falseyaksi takdirde.

Örnekler

Gerçek vakalar

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

Ek truthy vakaları oluşturmak istiyorsanız, bu MathGolf betiğini kullanabilirsiniz . Tırnak içindeki dize ve değerini yerleştirin girdi olarak.n

Yanlış davalar

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

Tabii ki, bu kod golf olduğu için, bazı baytları kırpmaya hazır olun!


Önerilen test davası:aabbab
Adám

Önerilen test durumu:aaaabbb
640KB

İkisini de yarın ekleyeceğim, iyi öneriler.
maksb

4
Gerçekten onur duydum ve meydan
okumamı

@AJFaraday beğendiğinize sevindim! Her iki zorluğundan da zevk aldım, bu da bana bunun için fikir verdi. Yakında daha da zor bir mücadele olabilir.
Ağustos’ta

Yanıtlar:


16

APL (Dyalog Unicode) , 12 bayt

İle çalışır ⎕io←0

1≠∨/⍸2≠/∊00

Çevrimiçi deneyin!

Adám ile birlikte golf oynadı .

Giriş üzerinde (örneğin: "aaccccaaaaaabb"kullanılarak ""bir dizi (karakter dizisi belirtmek için) ve ''bir char belirtmek için)

∊0⍞0 0s ile surround ve düzleştirmek, 0 'a' 'a' 'c' 'c' 'c' 'c' 'a' 'a' 'a' 'a' 'a' 'a' 'b' 'b' 0

2≠/ Eşit olmayan eşit yapmak, 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1

0 endeksli endeksleri almak, 0 2 6 12 14

∨/ GCD'yi hesaplamak, 2

1≠ bu 1'e eşit değil mi?


10

Java 10, 85 bayt

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

Regex, @Arnauld'un JavaScript yanıtından alınmıştır .

Çevrimiçi deneyin.

Açıklama:

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

Regex açıklaması:

^((.)\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 bayt

@Wastl tarafından kullanılan normal ifadeden türetilmiş mi Çift konuşma mı? .

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

Çevrimiçi deneyin!


Özyinelemeli sürümü, 55 bayt

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

Çevrimiçi deneyin!

Yorumlananlar

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 bayt

γ€g¿≠

Çevrimiçi deneyin!


MathGolf'taki 14 baytımın iyi olduğunu düşündüm, ama sen onu ezdin. Hem bunun için hem de Jelly'in cevabın için bir açıklama istiyorum.
maks.

2
@maxb Gerçekten sadece grup çalışmasının uzunluğunu alır, GCD'lerini hesaplar ve 1 değilse test eder.
Outgolfer Erik

6

Python 2 , 73 70 69 67 bayt

lambda s:s in[''.join(c*n for c in s[::n])for n in range(2,len(s))]

Çevrimiçi deneyin!

-4 bayt, Jitse sayesinde


2
Sen değiştirerek 3 bayt kaydedebilirsiniz set(...)ile{...}
Jitse

1
Ayrıca, alanı boşaltabilirsiniz. ...1 in[...
Jitse

@Jitse teşekkürler :)
TFeld


5

QuadS , 16 bayt SBCS

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

Çevrimiçi deneyin!

1≠ 1'den farklı

∨/ GCD

 sonucu

(.)\1* PCRE 0 veya daha fazla tekrarı izleyen herhangi bir karakter aranıyor

⊃⍵L ve maç uzunluklarının ilki (yani maçın uzunluğu) iade edilmesi



4

T-SQL 2008 sorgusu, 193 bayt

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

Çevrimiçi deneyin


"Thai_Bin'i harmanla" gerçekten gerekli mi?
Dr Y Wit,

1
@DrYWit bağlıdır, veritabanı büyük / küçük harf duyarlı olarak ayarlanmış olabilir. Ancak büyük / küçük harfe duyarlı veritabanları popüler bir seçim değildir. Bu, HASHBYTES veya belki VARBINARY kullanılarak daha farklı şekilde ele alınabilir, ancak bu bayt cinsinden daha maliyetlidir
t-clausen.dk

4

PHP ,76 75 bayt

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

Çevrimiçi deneyin!

İlk girişim, biraz saf yinelemeli bir yaklaşım.

Ungolfed:

// 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 bayt , thx ila @ Night2!


4

Perl 6 , 30 27 26 bayt

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

Çevrimiçi deneyin!

Ayrıca GCD numarasını kullanır, ancak regex ile eşleşen her çalışmanın bitiş konumu dizinini kullanır. N-konuş, eğer sıfır (falsey) ise negatif bir sayı (truthy) verir.




3

Brachylog , 5 bayt

ġz₂=Ṁ

Çevrimiçi deneyin!

Giriş değişkeninden girdi alır ve başarı veya başarısızlık sonucu çıkılır.

İlk başta bunun benim çözümümden daha kısa olacağını düşündüm. , ama sonra bunun 1'lik bir grup uzunluğu deneyebileceğini ve deneyebileceğini fark ettim .ġ

ġ        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 bayt

ò¦ mÊrÕÉ

Dene

ò¦ 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 bayt

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

Çevrimiçi deneyin!

açıklama

{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
        }
      }
    }
  }

Belki de açıklama net değil, ama "aaa" 3-konuşmayla geçerli. Giriş dizgisi en az iki karakter içermelidir, ancak farklı olmaları gerekmez.
Ağustos'ta

@ maxb, tamam harika. Bu -2 bayt olmalı. Güncelleme için teşekkürler. Bunu yarın düzelteceğim
Brojowski

3

Scala , 80 bayt

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

Çevrimiçi deneyin!

PS. Orijinal çözüm splitişleve dayanıyordu, ancak daha uzun (83 bayt).

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

Bu maalesef truegiriş için döner aab.
Ağustos'ta

@ maxb, kontrol ettiğiniz için teşekkürler. bunun üstesinden gelmek için s.ile değiştirildi (s+s)..
Dr Y Wit,

Aferin! Şimdi olsa bunun için başarısız olduğunu fark aaaabbve aabbbb.
Ağustos’ta

@maxb, özür dilerim, şimdi tüm test durumlarınızda başından itibaren test ettim.
Dr Y Wit



2

Brain-Flak , 96 bayt

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

Çevrimiçi deneyin!

Diğer birçok gönderinin kullandığı aynı GCD numarasını kullanır. Girdi n konuşmuyorsa çıkış 0, aksi takdirde pozitif bir tamsayıdır.

# 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 bayt

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))

Girdi verilerinin t (x) tablosunda saklandığı varsayımıyla çalışır, örn.

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

2

K (ngn / k) , 29 23 bayt

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

Çevrimiçi deneyin!

düzenleme: kaldırıldı bazı gereksiz iki nokta (Birli gereklidir ama iki nokta ekleyerek varsayılan böylece belirsizlik varsa o zaman bana açık değil ne zaman biliyorum) ve değiştirilemez mod x-y*x%yiçin ngn / k en y!xi değişken atamayı kaldırmak anlamına geliyordu hangi


1

APL (Dyalog Unicode) , 24 22 bayt SBCS

Anonim zımni önek işlevi.

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

Çevrimiçi deneyin!


 örneğin  tüm dizeyi kullanarak haritayı ele almak için dizeyi içine alın"aaabbb"

⍳∘≢{...  her biri için ɩ dizesindeki karakter taksitli 1 ile ndices:
 örneğin3

⍺↑⍺ mevcut sayıdaki mevcut eleman sayısını,
 örneğin 0s ile doldurma[3,0,0]

(≢⍵)⍴ döngüsel r dize karakterlerin taksitli şekle eshape
  ör[3,0,0,3,0,0]

⍵/⍨ dizenin karakterlerini çoğaltmak için bunu kullanın
  "aaabbb"

1↓ ilkini bırak ( n = 1)

⊂∊ dizenin tamamı o listenin bir üyesi mi?


Giriş dizesini n boyutlu parçalara bölüp tüm öbeklerin içindeki her karakterin eşit olup olmadığını kontrol ediyor musunuz? APL'ye henüz girmedim, ama kesinlikle en okunaklı "golf" dili.
maksb

@ maxb Ben bir açıklama yazma sürecindeyim. Mümkün olan tüm maskeleri [1,0,0,1,0,0…]vb. Filtreliyorum . Size APL'yi öğretmekten mutlu olacağım (öğrenmesi uzun sürmez). Sadece APL Orchard'ına bak .
Adám


@Cowsquack Zeki ve farklı, öyleyse neden göndermiyorsunuz {1<∨/≢¨⍵⊆⍨≢¨∪\⍵}?
Adám

Ne yazık ki başarısızaacccaaaaabb
Kritixi Lithos

1

Retina 0.8.2 , 28 bayt

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Açıklama:

M!`(.)\1*

Metni, aynı karakterlerden oluşan parçalara bölün.

.
.

Hepsini aynı karakterle değiştirin.

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

Koşuların uzunluklarının GCD'sinin 1'den büyük olup olmadığını kontrol edin.



1

MathGolf , 14 bayt

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

Çevrimiçi deneyin!

açıklama

Giriş dizisinin tüm olası bölümlerini eşit uzunluktaki parçalara göre kontrol eder ve bütün parçaların sadece tek bir karaktere sahip olduğu bir bölüm olup olmadığını kontrol eder.

£                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 bayt

<1iFhMr8

Çevrimiçi deneyin!

<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 5 -n , 38 bayt

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

Çevrimiçi deneyin!

print"\n"Altbilgideki çıkışları ayırmak için gereklidir.

Tüm olası ns boyunca basit döngü . "1-konuşma" için hiçbir şey çıkmaz, n-1 için n-konuşma için başka bir şey.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.