İyi bağlantılı bir meydan okuma


40

Sıkıldığımda bazen yaptığım bir aktivite, eşleşen çiftlere birkaç karakter yazmaktır. Daha sonra bu karakterleri bağlamak için çizgiler çizerim (üst kısımların üzerinden asla). Örneğin ve sonra satırları şu şekilde çizerim:abcbac

İlk bağlantı

Veyaabbcac

İkinci bağlantı

Bu çizgileri çizdikten sonra, topakların çevresine kapalı ilmekler çizmeye çalışıyorum, böylece döngüm çizdiğim çizgilerin hiçbiriyle kesişmiyor. Örneğin, ilkinde çizebileceğimiz tek döngü her şeyin etrafında, ama ikincisinde sadece nin (veya diğer her şeyin) çevresine bir döngü çizebilirizb

Döngü çizilmiş

Bir süre bununla oynarsak, bazı dizgilerin yalnızca kapalı döngüler harflerin tümünü veya hiçbirini içerecek şekilde çizilebileceğini görürüz (ilk örneğimizde olduğu gibi). Bu tür dizelere iyi bağlanmış dizeler diyeceğiz.

Bazı dizelerin birden fazla şekilde çizilebileceğini unutmayın. Örneğin, aşağıdaki iki yoldan da çizilebilir (ve üçüncü dahil edilmez):bbbb

Yol 1 veya Yol 2

Bu yollardan biri, çizgilerin hiçbiriyle kesişmeden bazı karakterleri içerecek şekilde kapalı bir döngü oluşturulacak şekilde çizilebiliyorsa, dize bağlantısı iyi değildir. ( bağlantısı iyi değil)bbbb

Görev

Senin görevin iyi bağlanmış dizeleri tanımlamak için bir program yazmaktır. Girişiniz, her karakterin eşit sayıda göründüğü bir dizgeden oluşacaktır ve dizgiler iyi bağlanmışsa diğeri çıkıştan farklı iki tutarlı değerden biri olmalıdır.

Buna ek olarak , program iyi bağlantılı dize olmalıdır anlamı

  • Her karakter programınızda eşit sayıda görünür.

  • Kendisini geçtiğinde truthy değerini vermelidir.

Programınız, yazdırılabilir ASCII veya kendi programınızdan gelen karakterlerden oluşan herhangi bir dize için doğru çıktıyı üretebilmelidir. Her karakterin eşit sayıda görünmesi ile.

Cevaplar, uzunlukları bayt cinsinden puanlanır ve daha az bayt daha iyi bir skor olur.

İpucu

Bir dize, birbirine bağlı olmayan boş olmayan bir katı alt dizgime sahipse iyi bir şekilde bağlanmaz, böylece her karakter bu alt dizgede eşit sayıda görünür.

Test Kılıfları

abcbac -> True
abbcac -> False
bbbb -> False
abacbc -> True
abcbabcb -> True
abcbca -> False

1
Test durumda: abcbca -> False.
Ørjan Johansen

Sanırım ipucunuz gereksiz there.
Jonathan Frech

2
Yani açık olmak gerekirse: Bir karakter dizisinin toplam çift sayısının toplam karakter sayısına sahip olup olmadığı, iyi bağlanmış bir karakter dizisi olup olmadığına ilişkin değildir. Bu gereklilik sadece programların kaynak kodları için geçerlidir. Elbette bu sadece bir anlamsallık meselesidir, çünkü programların toplam tuhaf karakterleri olan girilen dizgiler için tanımsız davranışa sahip olmalarına izin verilmektedir (ve en az bir gönderilen program bundan faydalanmaktadır).
Deadcode

Girişte ne tür karakterler olabilir?
xnor

@ xnor mücadeleye ekledim. Umarım bu onu temizler.
Buğday Sihirbazı

Yanıtlar:


19

Regex (ECMAScript 2018 veya .NET), 140 126 118 100 98 82 bayt

^(?!(^.*)(.+)(.*$)(?<!^\2|^\1(?=(|(<?(|(?!\8).)*(\8|\3$){1}){2})*$).*(.)+\3$)!?=*)

Bu 98 byte versiyonundan daha yavaştır, çünkü ^\1gözetleme kafasından çıkar ve bundan sonra değerlendirilir. Hızı geri kazandıran basit bir switcheroo için aşağıya bakınız. Ancak, bu nedenle, aşağıdaki iki TIO, öncekinden daha küçük bir test senaryosunu tamamlamakla sınırlıdır ve .NET, kendi regex'ini kontrol etmek için çok yavaştır.

Çevrimiçi deneyin! (ECMAScript 2018)
Çevrimiçi deneyin! (.AĞ)

18 baytı (118 → 100) düşürmek için utanmadan, Neil'in regex'inden negatif bir göz alıcıya bir bakış açısı koyma ihtiyacını önleyen (80 byte sınırsız regex veren) gerçekten güzel bir optimizasyon çaldım . Teşekkürler Neil!

Jaytea'nın 69 bayt sınırsız regex'e yol açan fikirleri sayesinde inanılmaz 16 bayt (98 → 82) düşürdüğünde bu modası geçmiş oldu ! Çok daha yavaş, ama bu golf!

O Not (|(iyi bağlantılı regex yapmak için no-op yapma sonucunu var çok yavaş .NET altında değerlendirir. ECMAScript'te bu etkiye sahip değillerdir, çünkü sıfır genişlikteki isteğe bağlı eşleşmeler eşleşme dışı olarak değerlendirilir .

ECMAScript, iddiaların nicelleştirilmesini yasaklar, bu nedenle gereksinimlerinin golf oynamasını zorlaştırır. Ancak, bu noktada o kadar iyi golf oynuyor ki, belirli bir kısıtlamanın kaldırılmasının başka golf olanakları açabileceğini düşünmüyorum.

Kısıtlamaları geçmek için gereken fazladan karakterler olmadan ( 101 69 bayt):

^(?!(.*)(.+)(.*$)(?<!^\2|^\1(?=((((?!\8).)*(\8|\3$)){2})*$).*(.)+\3))

Yavaş, ancak bu basit düzenleme (sadece 2 ekstra bayt için) tüm kayıp hızını ve daha fazlasını geri kazanıyor:

^(?!(.*)(.+)(.*$)(?<!^\2|(?=\1((((?!\8).)*(\8|\3$)){2})*$)^\1.*(.)+\3))

^
(?!
    (.*)               # cycle through all starting points of substrings;
                       # \1 = part to exclude from the start
    (.+)               # cycle through all ending points of non-empty substrings;
                       # \2 = the substring
    (.*$)              # \3 = part to exclude from the end
    (?<!               # Assert that every character in the substring appears a total
                       # even number of times.
        ^\2            # Assert that our substring is not the whole string. We don't
                       # need a $ anchor because we were already at the end before
                       # entering this lookbehind.
    |                  # Note that the following steps are evaluated right to left,
                       # so please read them from bottom to top.
        ^\1            # Do not look further left than the start of our substring.
        (?=
            # Assert that the number of times the character \8 appears in our
            # substring is odd.
            (
                (
                    ((?!\8).)*
                    (\8|\3$) # This is the best part. Until the very last iteration
                             # of the loop outside the {2} loop, this alternation
                             # can only match \8, and once it reaches the end of the
                             # substring, it can match \3$ only once. This guarantees
                             # that it will match \8 an odd number of times, in matched
                             # pairs until finding one more at the end of the substring,
                             # which is paired with the \3$ instead of another \8.
                ){2}
            )*$
        )
        .*(.)+         # \8 = cycle through all characters in this substring
        # Assert (within this context) that at least one character appears an odd
        # number of times within our substring. (Outside this negative lookbehind,
        # that is equivalent to asserting that no character appears an odd number
        # of times in our substring.)
        \3             # Skip to our substring (do not look further right than its end)
    )
)

Değişken uzunluklu görünüme dönüştürmeden önce moleküler görünüş ( 103 69 bayt) kullanarak yazdım :

^(?!.*(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$))

^
(?!
    .*(?*(.+)(.*$))       # cycle through all non-empty substrings;
                          # \1 = the current substring;
                          # \2 = the part to exclude from the end
    (?!                   # Assert that no character in the substring appears a
                          # total even number of times.
        ^\1$              # Assert that our substring is not the whole string
                          # (i.e. it's a strict substring)
    |
        (?*(.)+.*\2$)    # \3 = Cycle through all characters that appear in this
                          # substring.
        # Assert (within this context) that this character appears an odd number
        # of times within our substring.
        (
            (
                ((?!\3).)*
                (\3|\2$)
            ){2}
        )*$
    )
)

Ve regex'imin kendisini iyi bir şekilde bağlamasına yardımcı olmak için yukarıdaki regex'in bir varyasyonunu kullanıyorum:

(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$)\1

regex -xml,rs -oBununla birlikte kullanıldığında , (varsa) her karakterden eşit bir sayı içeren girdilerin katı bir alt dizesini tanımlar. Tabii, benim için bunu yapmak için regex olmayan bir program yazabilirdim, ama bunun neresinde eğlenceli olurdu?


8
wtf hala golf oynuyor
ASCII sadece

@ ASCII-sadece ve hala golf oynamaktadır ...
Quintec

11

Jöle, 20 bayt

ĠẈḂẸẆṖÇ€Ạ
ĠẈḂẸ
ẆṖÇ€Ạ

Çevrimiçi deneyin!

İlk satır dikkate alınmaz. Her karakterin eşit sayıda görünmesi koşulunu yerine getirmek için sadece orada var.

Bir sonraki satır ilk önce Ġendeksleri değerlerine göre döndürür. Eğer sonuçta ortaya çıkan listedeki her bir alt listenin uzunluğunu alırsak ( ), her karakterin görünme sayısını elde ederiz. Bunlardan herhangi birinin eşit olmadığını kontrol etmek için her sayının sonuncusunu alırız ve bir truthy (sıfır olmayan) değeri xists olup olmadığını sorarız.

Bu nedenle, bu yardımcı link bir alt halkanın daire içine alınamayacağını döndürür .

Ana linkte, girişin ( ) tüm alt dizgilerini alırız, sonuncuyu kapatırız (böylece tüm dizginin daire içinde olup olmadığını kontrol edemeyiz) ve yardımcı bağlantıyı ( Ç) ach altlık üzerinde çalıştırırız . Sonuç, ll alt dizgilerin daire içine alınamamasıdır.


Yani, evet, bu benim de çözümüm olurdu, ama, ne yazık ki, sıkıcı ... :(
Outgolfer Erik,

8

J , 34 bayt

2:@':.,|~*'>1(#.,)*/@(1>2|#/.~)\.\

Çevrimiçi deneyin!

FrownyFrog sayesinde -8 bayt

orijinal

J , 42 bayt

(*#'.,012&|@~#')=1#.[:,([:*/0=2&|@#/.~)\.\

Çevrimiçi deneyin!

açıklama

(*#'.,012&|@~#') = 1 #. [: , ([: */ 0 = 2&|@#/.~)\.\

(*#'.,012&|@~#')                                       NB. this evaluates to 1
                                                       NB. while supplying extra
                                                       NB. chars we need.  hence...
                 =                                     NB. does 1 equal...
                   1 #.                                NB. the sum of...
                        [: ,                           NB. the flatten of...
                             (                  )\.\   NB. the verb in parens applied
                                                       NB. to every suffix of every
                                                       NB. prefix, ie, all contiguous 
                                                       NB. substrings
                             ([: */ 0 = 2&|@#/.~)      NB. def of verb in paren:
                                             /.~       NB. when we group by each
                                                       NB. distinct char...
                              [: */                    NB. is it the case that
                                                       NB. every group...
                                           @#          NB. has a length...
                                    0 = 2&|            NB. divisible by 2...

1
@Deadcode Her dize için olduğu gibi tüm dize için tam tersi bir sınama işlemi yapılması gerektiğinden, çoğu çözümün bunu bırakacağı güvenli bir bahis gibi görünüyor . abcİle test etmek , sadece Perl girişi üzerinde "başarısız" olmaz. (Yine de başka sorunları var.)
Ørjan Johansen

1
@ ØrjanJohansen Yanlış anladınız. Toplamda tuhaf bir karaktere sahip karakter dizileri (programların kaynak kodunu diskalifiye eden, iyi bağlanmış dizeler değil) iyi bağlanabilirler ve bu program iyi bağlanmış dizelerden bazıları için falsey döndürür. Soru açıkça tanımsız bu davranışı mümkün kılar, böylece program geçerlidir. Jonah, bence programınızın bunu yapması gerçekten ilginç ve bu şekilde çalışan bir yöntem bulduğunuza hayranım. Bir açıklamayı çok isterim. Bu tür bir programlama tamamen bana yabancı, bu yüzden yorumları ve kodu anlamıyorum.
Deadcode

1:@':.,02|~*'=1(#.,)*/@(0=2|#/.~)\.\
FrownyFrog

1
2:@':.,|~*'>1(#.,)*/@(1>2|#/.~)\.\de geçerli görünmektedir
FrownyFrog

6

Python 3.8 (yayın öncesi) , 66 bayt

lambda l,b={id}:len({str(b:=b^{c})for(c)in l})<len(l)#,<^fmnost{}#

Çevrimiçi deneyin!

Atama İfadeleri Dönemi üzerimizde. Python 3.8'de bulunan PEP 572 ile golf oynamak asla aynı olmayacak. Erken geliştirici önizleme 3.8.0a1'i buraya yükleyebilirsiniz .

Atama ifadeleri :=, bu değeri değerlendirirken değişken bir satıra atamak için kullanmanıza izin verir . Mesela (a:=2, a+1)verir (2, 3). Bu elbette yeniden kullanım için değişkenleri saklamak için kullanılabilir, ancak burada bir adım daha ileri gidip onu bir kavramada bir akümülatör olarak kullanıyoruz.

Örneğin, bu kod kümülatif toplamları hesaplar [1, 3, 6]

t=0
l=[1,2,3]
print([t:=t+x for x in l])

Liste kavrayışındaki her bir geçişte kümülatif toplamın tnasıl arttığına xve yeni değerin, anlama tarafından oluşturulan listede saklandığına dikkat edin.

Benzer şekilde, b:=b^{c}karakter biçerip içermediğini değiştirmek için karakter kümesini günceller cve yeni değerine göre değerlendirir b. Yani, kod [b:=b^{c}for c in l]karakterleri üzerinde dolaşır ciçinde lve her boş olmayan bir önek kez tek bir sayı görülen karakterlerin kümesini biriktirir.

Bu liste, çiftler için kümelenmiş bir anlama yaparak ve uzunluğununkinden küçük olup olmadığını kontrol ederek kontrol edilir s, bu, bazı tekrarların daraltılmış olduğu anlamına gelir. Eğer öyleyse, tekrar, so zamanlar arasında görülen kısımda, her karakterin eşit sayıda sayıyla karşılaştığı ve ipi iyi bağlanmadığı anlamına gelir. Python, kümelerin mutsuz olmalarına izin vermez, bu yüzden iç kümeler onun yerine dizgilere dönüştürülür.

Küme bisteğe bağlı bir argüman olarak başlatılır ve işlev kapsamında başarıyla değiştirilir. Bu işlevi yeniden kullanılamaz hale getireceğinden endişelendim, ancak bu işlemler arasında sıfırlanıyor gibi görünüyor.

Kaynak kısıtlaması için, eşleştirilmemiş karakterler sonunda bir yorumda doldurulur. Ekstra parantezleri yazmak for(c)in lyerine for c in lücretsiz yazar. Herhangi bir set olarak başlayabildiği için zararsız olan idilk kümeye koyduk b, ancak {}Python boş bir sözlük yapacak gibi boş küme yazılamaz . Harfler ive deşleştirmeye ihtiyaç duyanlar arasında idolduğundan , işlevi oraya koyabiliriz .

Kodun, reddedilen booleanları çıkardığına dikkat edin, bu nedenle doğru şekilde Falsekendini verir.



5

Python 2,74 bayt

bmn0=f=lambda s,P={0},d=[]:s<" "if(P in d)else+f(s[f<s:],P^{s[0^0]},[P]+d)

Çevrimiçi deneyin!

PŞimdiye kadar tuhaf sayıda görülen karakter kümesini takip ederek dizge boyunca dolaşır . Liste dgeçmişin tüm değerlerini saklar Pve Phalihazırda mevcut olan akımı görürseniz, do zamandan beri görülen karakterlerde, her karakterin eşit sayıda göründüğü anlamına gelir. Öyleyse, girdilerin tamamının üzerinden geçip geçmediğimizi kontrol edin: öyleyse kabul edin, çünkü dizenin tamamı beklendiği gibi eşleştirildi ve aksi halde reddedildi.

Şimdi kaynak kısıtlaması hakkında. Eşleştirmeye ihtiyaç duyan karakterler, aşağıda vurgulanan çeşitli zararsız yerlere doldurulur:

bmn0=f=lambda s,P={0},d=[]:s<" "if(P in d)else+f(s[f<s:],P^{s[0^0]},[P]+d)
_____              _              _      _    _    ___        ___    

f<sİçin değerlendirir 0grimsi eşleştirme sırasında fişlev adı da olma avantajını, fonu tanımlanan şekilde (fonksiyonu olarak adlandırılır zaman). 0^0Bir absorbe ^sembolü.

0İçinde P={0}Python içinde: talihsiz {}boş dict yerine istediğimiz kadar boş bir dizi değerlendirir ve burada olmayan herhangi bir karakter elemanı koyabilirsiniz ve zararsız olacaktır. Buna rağmen koymak için boş bir şey görmüyorum ve içine koyup 0kopyaladım bmn0, 2 bayta mal oldu. İşlev tanımlandığında ilk argümanların değerlendirildiğine dikkat edin, dolayısıyla kendimizi tanımladığımız değişkenler buraya eklenemez.


4

Perl 6 , 76 bayt

*.comb[^*X+(^*).map(^*)].grep({$_&[&]($_)}).none.Bag{*}.none%2#*^+XBob2rec%#

Çevrimiçi deneyin!

Bir truthy / falsey değerine boole edilebilecek bir Yok Yok Kavşağı döndüren Her Bir lambda. Ben çıkarmadan değil öneriyoruz ?aksi çıktı ziyade alır, gerçi o boolifies dönüş sonucunu büyük .

Bu çözüm sayesinde birçok dahil fonksiyonları, örneğin bağlantısını kaldırdı olmanın gerekli biraz daha karmaşıktır .., all, >>, %%vb kaynak kısıtlaması olmadan, bu 43 byte olabilir:

*.comb[^*X.. ^*].grep(?*).one.Bag{*}.all%%2

Çevrimiçi deneyin!

Açıklama:

*.comb                     # Split the string to a list of characters
      [^*X+(^*).map(^*)]   # Get all substrings, alongside some garbage
                        .grep({$_&[&]($_)})        # Filter out the garbage (empty lists, lists with Nil values)
                                           .none                 # Are none of
                                                .Bag{*}          # The count of characters in each substring
                                                       .none%2   # All not divisible by 2

                                               #*^+XBob2rec%#    And garbage to even out character counts

3

Perl 5 -p, 94, 86, 78 bayt

m-.+(?{$Q|=@q&grp,$\|=$&eq$_^!grep+/^/&(@m=$g=~/\Q$_/g),($g=$&)=~/./g})(?!)-}{

aksi takdirde iyi bağlantı 1 ise, çıkış 0.

78 bayt

86 bayt

94 bayt

Nasıl çalışır

  • -pile }{çıkışa hile biten $\ucunda
  • m-.+(?{.. })(?!)-, boş olmayan tüm alt .+dizgiler üzerinde kod yürütmek için ( önce tüm dizeyle eşleşir, ve sonra da kod arasında çalıştırdıktan sonra (?{.. })başarısız zorla)(?!)
  • $Q|=@q&grp, kaynak kısıtlaması nedeniyle çöp
  • $\|=tamsayı bitsel veya atama, neredeyse bir 1 varsa, $\1 (doğru) olur, varsayılan olarak boştur (yanlış)
  • $&eq$_sbustring'in tüm dizge olduğu durumda ^"tek karakter oluşmaz " ifadesiyle bitli bir şekilde xored düzenlenir.
  • ($g=$&)=~/./geşleştirilen alt dize kopyalamak için $g(sonraki regex eşleşmesinden sonra geçersiz kılınır) ve alt dizenin karakter dizisini döndürür.
  • /^/ 1 olarak değerlendiren çöp
  • grep&(@m=$g=~/\Q$_/g),Alt dizideki her karakter için 1 , $gkendi içinde eşleşen karakter dizisini elde eder, skaler dizisi, boyutuna göre değerlendirir ve greptuhaf oluşumu olan karakter karakterlerini filtrelemeye 1&xeşdeğerdirx%2==1

Bunun kaynak kısıtlamasını sağladığını sanmıyorum: Çok sayıda açık parantez
sayıyorum

@ msh210 Konu bu değil mi? Çift bir sayı varsa, bağlantısı iyi değil
Quintec

İyi ilişkileri olduğu için gereksinimleri @Quintec bir kişi vardır ki şunlardır her karakterin bir çift sayı.
Ørjan Johansen

ilk cevabım şarttı ama golf oynamaya çalıştıktan sonra kaybetti. güncellendi, ancak golf edilebilir.
Nahuel Fouilleul

1
Buradaki tüm kaynaklar, kaynak kısıtlamasını yerine getirir, ayrıca kod iyi bağlanmışsa 0 döndürür ve her karakterin çift sayısı
Nahuel Fouilleul

3

Retina , 150 96 bayt

^(?!(.*)(.+)(.*)$(?<!^\2|^\1(?:(^?(?:(?!\6).)*\6){2})*(|(?!\6).)*(?!.+\6.*\3$)(.){1,}\3)(?!,<)?)

Çevrimiçi deneyin! Link kendisi de dahil olmak üzere test vakaları içerir. Düzenleme: Özgün regex'in @Deadcode'un yardımıyla adil bir bit bıraktığını, ardından kaynak düzenini korumak için biraz daha abartılı bir şekilde geri toplandığını not edin. Açıklama:

^(?!(.*)(.+)(.*)$

\3Aşağıdaki kısıtlamalarla eşleşen hiçbir alt dize bulunmadığını kabul edin.

(?<!^\2|

Alt dizenin tüm orijinal dize olmadığını kabul edin.

^\1(?:(^?(?:(?!\6).)*\6){2})*(|(?!\6).)*(?!.+\6.*\3$)(.){1,}\3)(?!,<)?)

\6Böyle bir karakter olmadığını kabul edin:

  • karakterin kendisi ile (özel) ve alt dizinin sonu arasında görünmüyor
  • alt dizinin başlangıcıyla kendisinin (özel) arasında eşit sayıda görünür

Kaynak mizanpaj kısıtlamasını geçmek için ((((ile (?:(^?(?:(ve ((ile değiştirdim (|(. Hala bir tane kaynak kısıtlamasını vardı ))sol ve karakterleri !()1<{}Ben değişti yüzden arta kalan +içine {1,}ve yararsız sokulan (?!,<)?kalanını tüketmek.


2
Bu sınırlı kaynak gereksinimlerini karşılamıyor gibi görünüyor.
Ørjan Johansen

@ ØrjanJohansen Sonunda geçerli bir çözüm buldum. Orada bir sürü çöp olsa da, bu yüzden daha kısa bir şey olabilir ...
Neil

3

C # (Visual C # Etkileşimli Derleyici) , 208 206 200 198 bayt

x=>!x.GroupBy(c=>c).Any(g=>g.Count()%2>0)&!Enumerable.Repeat(x.Count,x.Count*x.Count).Where(
(l,i)=>i%l>0&!x.Skip(i/l).Take(i%l).GroupBy(c=>c).Any(g=>g.Count()%2>0)
).Any()/*>!oyAnC0EmeablR*WhiS/T*/

Çevrimiçi deneyin!

@KevinCruijssen sayesinde -2 bayt!

Sonunda 200'ün altına düşürdüm, bu yüzden şu an golf oynayabilirim :) Son bir cevaba dayanarak işleri test etmek için ikinci bir TIO oluşturdum.

Çevrimiçi deneyin!

Bu görevi zorlaştıran şeyler:

  • Eşitlik operatörüne ==izin verilmedi
  • Artırma / atama operatörüne ++izin verilmedi
  • Linq All()işlevine izin verilmedi

Aşağıdaki yorum kodu:

// anonymous function that takes an IList as input
x=>
  // the first condition makes sure the string even
  // counts of each character
  !x.GroupBy(c=>c).Any(g=>g.Count()%2>0)&
  // the second condition generates all proper substrings of x
  // and tests for any that contain even character counts
  // the string length `l` is repeated `l*l` times
  !Enumerable.Repeat(x.Count,x.Count*x.Count)
    .Where((l,i)=>
      // check that the substring length is greater than 0
      i%l>0&
      // use skip/take to generate a substring
      // and check for a character count thats odd
      // negate the result meaning we have found
      // a substring that invalidates the input
      !x.Skip(i/l).Take(i%l)
        .GroupBy(c=>c).Any(g=>g.Count()%2>0)
    )
    // if any invalid substrings are found
    // then the result in invalid
    // the comment string at the end is needed
    // to make the program well-linked
    .Any()/*>!oyAnC0EmeablR*WhiS/T*/

İzleyen yorumunuzdaki iki boşluğu kaldırabilirsiniz.
Kevin Cruijssen

@KevinCruijssen - iyi bir :) Zaten bir boşluk eklediğimi unutmuştum. Kaynağa bir tane daha atmak zorunda kaldım.
Dana,


2

Brachylog , 16 bayt

sᶠb∋p~j&sᶠb∋p~j&

Çevrimiçi deneyin!

Baskılar false.truthy örnekleri için ve true.falsy örnekleri için. TIO sürümü kendisini idare etmek için çok yavaştır, ancak iki kez tekrarlanan benzersiz karakterlerin bulunduğu bir dize olduğu için açıkça iyi bağlanmıştır.

açıklama

    Input is a string: "abcacbaa"
sᶠ  Find all substrings: ["abcacbaa","abcacba","abcacb",..,"a"]
b   Behead (now the proper substrings remain): ["abcacba","abcacb",..,"a"]
∋   Take one of them: "abcacb"
p   Permute it: "abcabc"
~j  It is some string repeated twice: "abc"
&   Get the input again: "abcacbaa"
    Then repeat the above.
    If the constraints can be satisfied, the result is true, otherwise false.

1

05AB1E , 22 20 bayt

Œε¢Pà}KŒIKεSIS¢ÈP}àÈ

1Dize iyi bağlanmışsa ve dizenin iyi bağlanmamışsa çıktılar 0.

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

Temel program iyi bağlanmış ve iyi bağlanmamışsa çıktı olarak veren ŒsKεsS¢ÈP}à( 11 bayt ) . Arka (is_even) yarı no-op gibi ters çevirir ve böylece çıkış, iyi bağlantılı dizeleri ve de bağlı olmayan dizileri için. Diğer kısımlar meydan okuma kurallarına uymak için uygun değildir.01È10

Œε¢Pà}K         # No-ops: substrings, map, count, product, maximum, close map, remove
                # Due to the last remove, we're back at the (implicit) input again
Π              # Take the substrings of the input
 IK             # Remove the input itself from that list of substrings
   ε            # Map each substring to:
    S           #  No-op: transform the substring into a list of characters
     IS         #  Get the input-string as a list of characters
       ¢        #  Count the occurrence of each character in the current substring
        È       #  Check which counts are even (1 if truthy; 0 if falsey)
         P      #  Take the product of that
              # After the map: check if any are truthy by taking the maximum
            È   # Semi no-op: check if this maximum is even (0 becomes 1; 1 becomes 0)
                # (and output the result implicitly)
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.