İpin dönme simetrisi


9

Döndürme "bir dizeyi iki parçaya bölerek ve sıralarını ters çevirerek yapılır" . Bir nesne, adı geçen işlemi uyguladıktan sonra değişmeden kalırsa, bir işlem altında simetriktir. Dolayısıyla, bir "dönme simetrisi", bir dizenin "dönme" den sonra değişmeden kalmasıdır.

Boş olmayan dize göz önüne alındığında ssadece harflerden oluşan aiçin zçıkış dizesinin dönme simetrisi en yüksek emir.

testcases:

input        output
a            1
abcd         1
abab         2
dfdfdfdfdfdf 6

Bu . Bayt cinsinden en kısa cevap kazanır. Standart boşluklar geçerlidir.




Bu, dizenin boyutundan daha küçük simetrik rotasyonların sayısını bulmakla aynıdır. @ 0 'ın işaret ettiği gibi, döngüsel bir grup oluştururlar, bu nedenle en yüksek sıralamayı bulmak, grubun büyüklüğünü bulmakla aynıdır. Bu, şu anda oldukça belirsiz olan görevin açıklamasını çok daha açık hale getirecektir.
Ad Hoc Garf Hunter

Yanıtlar:


8

Retina , 15 bayt

(^.+?|\1)+$
$#1

Çevrimiçi deneyin!

Bir alt dizeyi yineleyerek tüm dizeyle eşleşir (ungreedy nedeniyle daha kısa alt dizilere öncelik verilir .+?) ve dizenin tamamını, kullandığımız yineleme sayısıyla değiştirir.


Ah, elbette, ungreedy. Ve burada beni boğuşuyordu .*(.+)$(?<=^(\1)*)...
Neil


3

05AB1E , 8 bayt

gGDÀ})QO

Çevrimiçi deneyin!

açıklama

gG  }      # len(input)-1 times do:
  D        # duplicate
   À       # rotate left
     )     # wrap result in a list
      Q    # compare each to input for equality
       O   # sum


2

Prolog (SWI) , 64 bayt

A+B:-findall(X,(append(X,Y,A),append(Y,X,A)),[_|Z]),length(Z,B).

Çevrimiçi deneyin!

+/2Bir dizeyi (karakter kodları listesi biçiminde) ilk argüman ( A) olarak alan ve ikinci argümanını ( B) en yüksek sıralı simetrik dönüş sırasına göre ayarlayan yüklemi tanımlar .

açıklama

Bu program, bir ip üzerindeki simetrik rotasyon setinin döngüsel bir grup olduğu gerçeğini kullanır ve bu nedenle simetrik rotasyon setinin sırası, en yüksek dereceli simetrik rotasyonun sırasına eşittir. Böylece program girdi dizgisinde toplam simetrik rotasyon sayısını bularak istenen sonucu hesaplayabilir.

Kod Açıklaması

Ağır kaldırma işleminin çoğunluğu findall/3yüklem için yapılan bir çağrı ile yapılır . findall/3Yüklem (ilk bağımsız değişken için bütün olası değerleri bulur Xikinci bir değişken olarak ifade (doğru olduğu durumda), bu (append(X,Y,A),append(Y,X,A))daha sonra bu konuya daha). Son olarak, bu olası değerlerin her birini Xson argümanda ( [_|Z]) bir liste olarak saklar .

Geçirilen ifadesi findall/3ikinci arugment olarak, (append(X,Y,A),append(Y,X,A))kullandığı append/3belirtmek için yüklemi Xbazıları henüz tanımlanmamış ile birleştirilmiş Yeşit olmalıdır A, girdi dizesi ve aynı olduğunu Yile birleştirilmiş Xzorunluluk da eşit olması A. Bu , önden kaldırılıp arkaya eklendiyse, elde edilen dize ile aynı Xolacak şekilde bir önek olması gerektiği anlamına gelir . Bu özelliğe sahip olan s kümesi , simetrik dönüşleri ile neredeyse birebir yazışmalara sahiptir . Her zaman tam olarak tek bir çift sayım vakası vardır, bu da hem boş dizenin hem de öneklerinAAAXAAA0-dönüşüne karşılık gelir A. Bu yana 0bir -ROTATION Asonuçtaki listesinin simetrik uzunluğu her zaman Xs'den findall/3simetrik dönme sayısının birden fazla olacaktır A.

Çift sayım problemini çözmek için findall/3yüklemin üçüncü argümanında desen eşleştirme kullanıyorum . Prolog'da listeler başlarının (ilk eleman) ve kuyruklarının (geri kalanı) çiftleri olarak temsil edilir. Böylece [_|Z]kuyruğu eşit olan bir listeyi temsil eder Z. Bu, uzunluğunun yüklem Ztarafından bulunan önek sayısından daha az olduğu findall/3ve dolayısıyla simetrik dönüş sayısına eşit olduğu anlamına gelir A. Son olarak, uzunluğunu length/2ayarlamak Biçin yüklem kullanın Z.


2

JavaScript (ES6), 42 41 bayt

@ L4m2 sayesinde 1 bayt kaydedildi

s=>s.length/s.match`(.+?)\\1*$`[1].length

Test senaryoları


f=s=>s.length/s.match`(.+?)\\1*$`[1].length
l4m2

1

Japt , 7 bayt

¬x@¥UéY

Çevrimiçi test edin!

açıklama

 ¬ x@   ¥ UéY
 q xXY{ ==UéY}  // Expanded
Uq xXY{U==UéY}  // Variable introduction
                // Implicit: U = input string
Uq              // Split U into chars.
   xXY{      }  // Map each item X and index Y by this function, then sum the results:
       U==UéY   //   Return U equals (U rotated by Y characters).
                // Implicit: output result of last expression



0

Haskell , 49 bayt

g x=sum[1|a<-[1..length x],drop a x++take a x==x]

Çevrimiçi deneyin!

Haskell , 49 bayt

g x=sum[1|(a,_)<-zip[1..]x,drop a x++take a x==x]

Çevrimiçi deneyin!

açıklama

Bu @ 0 'dikkat çeken basit çözümü kullanır. İpin dönüşleri döngüsel bir grup oluşturduğundan, en yüksek dereceli eleman grubun büyüklüğü ile aynıdır, böylece simetrik dönüşlerin sayısını bularak ünitenin sırasını alabiliriz.

Basit kodlar bir liste kavrama yapar ve orijinal dizeyi koruyan devir sayısını sayar.


Sen kullanabilirsiniz drop<>takekullanmak yerine (++)gibi, 3 bayt kaydetmek için bu .
18:28

@BMO (<>), çalıştığım Haskell versiyonunda başlangıçta değil.
Ad Hoc Garf Hunter
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.