Temukan Kata-Kata Berputar-putar!

41

Jangan tanya saya bagaimana atau mengapa tetapi ketika menulis kode pada proyek saya perhatikan bahwa karakter beberapa kata memiliki pola tertentu yang mengacu pada alfabet, saya menghubungkan setiap karakter kata dengan pensil pada alfabet dan saya mendapatkan dua spiral, maka saya perhatikan bahwa spiral pertama searah jarum jam dan yang lainnya berlawanan arah jarum jam, dan karakteristik lainnya ... jadi saya menamakannya Spiral Words !

Kata Berputar - putar dapat:

  1. Searah jarum jam atau berlawanan arah jarum jam
  2. sentripetal atau sentrifugal

Berikut ini beberapa contoh Kata Berputar - putar :

Diagram Kata Berputar

Tugas 1:

Tulis program atau fungsi lengkap yang akan mengambil kata dari input standar dan akan menampilkan jika adalah Kata Berputar - putar dan karakteristiknya, dalam format yang dapat dibaca, teks tambahan, 3 karakter, bendera, dll.

Uji kasus dan contoh keluaran untuk kata-kata yang berbeda (tetapi Anda dapat memutuskan bagaimana merepresentasikan hasil):

EARTH, GROUP            > NO        // NOT A SWIRLING WORD
OPERA, STAY, IRIS       > SW,CF,CW  // SWIRLING WORD, CENTRIFUGAL, CLOCKWISE
MINER, TAX, PLUG, META  > SW,CF,CC  // SWIRLING WORD, CENTRIFUGAL, COUNTERCLOCKWISE
AXIOM, AXIS, COOK       > SW,CP,CW  // SWIRLING WORD, CENTRIPETAL, CLOCKWISE
WATCH, YETI, PILL       > SW,CP,CC  // SWIRLING WORD, CENTRIPETAL, COUNTERCLOCKWISE

MORE EXAMPLES OF FALSE TEST CASES (NOT SWIRLING WORDS): 
EARTH, GROUP, OUTPUT, WORD, CONNECTION, ODD, MOM, DAD, 
CHARACTER, EXAMPLE, QUESTION, NEWSLETTER, OTHER

Aturan:

  1. Koneksi antara dua karakter pertama harus naik (seperti pada gambar), semua koneksi genap harus turun , semua koneksi aneh harus naik .
  2. Anda dapat mengabaikan huruf besar / kecil atau mempertimbangkan / mengonversi semua menjadi huruf besar atau semua ke huruf kecil.
  3. Kata-kata input hanya karakter dalam rentang alfabet AZ, tanpa spasi, tanpa tanda baca, dll.
  4. Jika sebuah kata memiliki karakter ganda, seperti "GROOVE", Anda harus menutup ganda menjadi satu karakter: "GROOVE"> "GROVE".
  5. Kata-kata input akan mengandung setidaknya 3 karakter berbeda. Kata-kata seperti "IBU", "AYAH", "LOL" bukan kata-kata yang valid.
  6. Dimungkinkan untuk melewati beberapa kali dalam karakter yang sama, seperti "IRIS".
  7. Kode terpendek menang.

Tugas 2:

Untuk mendapatkan lebih banyak reputasi, temukan Kata-kata Berputar terpanjang , dan karakteristiknya, yang dapat Anda temukan di kamus bahasa Inggris, mengikuti aturan di atas. Anda dapat mengambil contoh sebagai referensi daftar lengkap kata-kata bahasa Inggris di sini .

Selamat coding!

Mario
sumber
15
Diagram yang bagus! :) (Dan tantangan yang menyenangkan, juga.;))
Martin Ender
Apakah menghilangkan "Berputar-putar" menjadi format output yang valid, karena tersirat ketika input tidak "tidak berputar-putar"?
Martin Ender
@ MartinEnder Ya, karena dapat dimengerti saat berputar atau tidak, bisa kosong untuk "tidak" dan "1" untuk "ya", dll. (Senang Anda menyukai diagram dan tantangan! :))
Mario
1
@ TimmyD Tapi tidak semua kata-kata bergelombang berputar-putar. :)
Martin Ender
2
@Lynn Terima kasih atas apresiasi dan sarannya, saya akan berusaha meningkatkan untuk masa depan. Saya menambahkan aturan "hapus dobel" untuk mengantisipasi orang-orang bertanya kepada saya hal-hal seperti "apa yang kita lakukan ketika ada dobel?" > Anda dapat menganggap ganda sebagai 1 karakter tunggal karena dari "L" pergi ke "L" adalah nol jarak :) Bukannya saya ingin menambahkan kesulitan yang rumit untuk kepentingannya sendiri.
Mario

Jawaban:

11

MATL , 33 31 30 byte

lydhg)dt|dZSXz&=wZSdh?4M1)3M1)

Input dalam huruf besar (atau dalam huruf kecil, tetapi tidak dicampur).

Output adalah:

  • Jika kata itu tidak berputar-putar: tidak ada output yang dihasilkan
  • Jika berputar: dua angka diproduksi dalam garis yang berbeda:
    • Angka pertama 1/ -1 menunjukkan sentrifugal / sentripetal.
    • Angka kedua 1/ `-1 'menunjukkan searah jarum jam / berlawanan arah jarum jam.

Cobalah online! Atau verifikasi semua kasus uji (kode dimodifikasi untuk mengambil semua input dan untuk menghasilkan dua nomor output pada baris yang sama)

Penjelasan

Mari kita ambil input 'OPERAA'sebagai contoh.

Bagian pertama dari kode menghilangkan huruf ganda:

l     % Push 1
      %   STACK: 1
y     % Take input implicitly from below, and duplicate
      %   STACK: 'OPERAA', 1, 'OPERAA'
d     % Convert to code points and compute differences
      %   STACK: 'OPERAA', 1, [1 -11  13 -17 0]
h     % Concatenate horizontally
      %   STACK: 'OPERAA', [1 1 -11  13 -17 0]
g     % Convert to logical
      %   STACK: 'OPERAA', [true true true true true false]
)     % Index
      %   STACK: 'OPERA'

Kami sekarang memeriksa apakah jarak antar huruf tidak menurun (kondisi yang diperlukan untuk kata yang berputar-putar):

d     % Convert to code points and compute differences
      %   STACK: [1 -11  13 -17]
t|    % Duplicate and take absolute value
      %   STACK: [1 -11  13 -17], [1 11  13 17]
d     % Differences
      %   STACK: [1 -11  13 -17], [10 2 4]
ZS    % Signum
      %   STACK: [1 -11  13 -17], [1 1 1]
Xz    % Remove zeros (gives a vertical vector). Needed for words like 'IRIS',
      % where some consecutive distances are equal
      %   STACK: [1 -11  13 -17], [1; 1; 1]
&=    % All pairwise equality comparisons. Gives a matrix. If all the signs 
      % were equal the matrix will contain all ones
      %   STACK: [1 -11  13 -17], [1 1 1; 1 1 1; 1 1 1]

Kami kemudian memeriksa apakah huruf-huruf bolak-balik (ini adalah kondisi lain untuk kata yang berputar-putar):

w     % Swap
      %   STACK: [1 1 1; 1 1 1; 1 1 1], [1 -11  13 -17]
ZS    % Signum
      %   STACK: [1 1 1; 1 1 1; 1 1 1], [1 -1 1 -1]
d     % Differences
      %   STACK: [1 1 1; 1 1 1; 1 1 1], [-2 2 -2]

Terakhir, kami memeriksa apakah kedua kondisi bertahan, dan dalam hal ini menghasilkan output:

h     % Concatenate horizontally
      %   STACK: [1 1 1 1 1 1 1 1 1 -2 2 -2]
?     % If all elements are nonzero
  4M  %   Push first signum array without zeros, from the automatic clipboard
      %     STACK: [1; 1; 1]
  1)  %   Get first element (tells if first difference was positive or negative)
      %     STACK: 1
  3M  %   Push second signum array, from the automatic clipboard
      %     STACK: 1, [1 -1 1 -1]
  1)  %   Get first element (tells if first movement was right or left)
      %     STACK: 1, 1
      %   Implicitly end if
      % Implicitly display
Luis Mendo
sumber
6

Mathematica, 117 111 byte

Terima kasih kepada JHM karena telah menyimpan 6 byte, dan membuatnya case-sensitive untuk boot!

 {o=OrderedQ/@{a=Abs[d=Differences[#&@@@Split@LetterNumber@#]],Reverse@a},d[[1]]>0,Or@@o&&Max[Most[d]Rest@d]<0}&

Fungsi tanpa nama yang mengambil string dan mengembalikan daftar boolean bersarang dalam formulir {{B1,B2},B3,B4}. B4 mencatat apakah kata itu berputar-putar (dan jika tidak, sisa outputnya adalah sampah). Jika kata itu berputar, maka B1 mencatat apakah kata itu sentrifugal, B2 mencatat apakah kata itu sentripetal, dan B3 mencatat apakah kata itu searah jarum jam (Benar) atau berlawanan arah jarum jam (Salah).

Berikut adalah versi lama yang pasca-proses (baris pertama) fungsi di atas (spasi di atas garis-2-5) untuk membuatnya identik dengan OP: NOjika kata tidak berputar-putar, dan pilihan yang tepat {SW,CF,CW}, {SW,CF,CC}, {SW,CP,CW}, atau {SW,CP,CC}jika kata itu berputar-putar:

If[#3, {SW, If[#[[1]], CF, CP], If[#2, CW, CC]}, NO] & @@
  {o = OrderedQ /@
    {a = Abs[d = Differences[# & @@@ Split@LetterNumber@#]], Reverse@a},
  d[[1]] > 0,
  Or @@ o && Max[Most[d] Rest@d] < 0} &

Penjelasannya sama dengan jawaban CJam Martin Ender, dengan satu catatan tambahan: daftar perbedaan berurutan harus bergantian dalam tanda untuk kata yang berputar-putar, dan itu dapat dideteksi dengan memastikan semua produk dari pasangan perbedaan berurutan negatif (itulah yang Max[Most[d]Rest@d]<0dilakukan).

Menjalankan fungsi pada semua 40.000+ kata dari Mathematica WordList[], kami menemukan 8 huruf kata-kata berputar-putar berikut, yang merupakan terpanjang dari masing-masing jenis berputar-putar:

operetta    {SW, CF, CW}
opposite    {SW, CF, CW}
stowaway    {SW, CF, CW}
assassin    {SW, CP, CW}
assessor    {SW, CP, CW}
baccarat    {SW, CF, CC}
keenness    {SW, CF, CC}
positive    {SW, CF, CC}

(Brownie menunjuk positivekarena tidak memiliki huruf ganda, dan lebih sedikit surat yang diulang daripada stowaway.)

Tapi juara mutlak adalah kata centripetal berputar-putar 9 huruf berlawanan vassalage!

Greg Martin
sumber
1
Anda dapat menyimpan 3 byte dengan menggunakan LetterNumberbukan ToCharacterCodedan 3 byte dengan menggunakan Most[d]bukan Drop[d,-1].
JungHwan Min
5

Scala, 110 byte

def/(s:String)={val ? =s.sliding(2).map(t=>(t(0)-t(1)).abs).toSeq
(Seq(?,?reverse)indexOf(?sorted),s(0)<s(1))}

Mengembalikan tuple (a,b)dengan

  • a == 1 jika s adalah centripetal
  • a == 0 jika s sentrifugal
  • a == -1 jika s tidak berputar-putar

dan

  • b == true jika s searah jarum jam
  • b == false jika s berlawanan arah jarum jam
  • b bisa benar atau salah jika s tidak berputar

Penjelasan:

def/(s:String)={      //define a method called / with a String argument
  val ? =s            //define ? as...
    .sliding(2)       //an iterator for each two consecutive elements
    .map(t=>          //foreach 2 chars
      (t(0)-t(1)).abs //get the absolute value of their difference
    ) 
    .toSeq            //and convert the iterator to a Seq, because iterator doesn't have reverse and sorted methods
  (                   //return a tuple of
    Seq(?,?reverse)     //a Seq of ? and reversed ?
    .indexOf(?sorted)   //and check which of them is sorted ?
  ,                   //and
   s(0)< s(1)          //the difference bewteen the first two elements of the string.
  )
}
corvus_192
sumber
5

Jelly , 30 byte

3Ŀḟ0ṠE
ÑṠḟ0Ṃ
ÑAI
OIḟ0
ÇṠḢ;2Ŀ;Ñ

TryItOnline
Atau lihat kasus uji (dengan sedikit perubahan karena yang terakhirÑakan menunjuk ke tautan utama baru)

(Kurangnya keterampilan chaining saya mungkin menelan biaya beberapa byte di sini)
Semua atas atau semua lebih rendah.
Mengembalikan daftar bendera [D, F, S]:
S: berputar = 1 / tidak berputar = 0
F: sentrifugal = 1 (melingkar = 0) sentripetal = -1
D: searah jarum jam = 1 / berlawanan arah jarum jam = -1
- jika S = 0 bendera lainnya masih dievaluasi meskipun tidak membawa informasi yang berguna.

Bagaimana?

3Ŀḟ0ṠE      - Link 1, isSpinning: s
3Ŀ          - call link 3 as a monad with s
  ḟ0        - filter out zeros
    Ṡ       - sign
     E      - all equal?

ÑṠḟ0Ṃ       - Link 2, centrifugal(-1), circular(0) or centripetal(1): s
Ñ           - call next link (3) as a monad with s
 Ṡ          - sign (+1 for positive changes, -1 for negative changes, 0 for no change)
  ḟ0        - filter out zeros (ignore these for cases like "IRIS")
    Ṃ       - minimum (will be the only value for spinning words)
            -    (circular words like "DAD", now excluded, yield min([])=0)

ÑAI         - Link 3, absolute change of moves over alphabet: s
Ñ           - call next link (4) as a monad with s
 A          - absolute
  I         - differences

OIḟ0        - Link 4, non-zero moves over alphabet: s
O           - ordinal cast
 I          - differences
  ḟ0        - filter out zeros

ÇṠḢ;2Ŀ;Ñ    - Main link: s
Ç           - call last link (4) as a monad with s
 Ṡ          - sign
  Ḣ         - head (clockwise / anticlockwise: 1 / -1)
   ;  ;     - concatenate
    2Ŀ      - call link (2) as a monad with s
       Ñ    - call next link (1) as a monad with s
Jonathan Allan
sumber
1
Saya pikir Anda mengalami apa yang saya sebut "sindrom newbie" di sini. Saya merasakan hal yang persis sama dengan Anda. Mungkin Dennis bisa membantu di sini. Tapi, saya memberi +1, hanya karena saya melihat itu mungkin di Jelly. Anda juga dapat menghapus kasing bundar; itu tidak ada lagi.
Erik the Outgolfer
Terima kasih telah menyodok tentang kata-kata melingkar - ternyata 6 byte untuk melayani mereka sebenarnya tidak perlu karena minimum daftar kosong adalah 0jadi ini masih bekerja untuk mereka juga!
Jonathan Allan
Jadi, itu pasti berhasil untuk mereka? Saya melihat Anda masih memiliki circular(0)penjelasan di dalam Anda, mungkin sudah waktunya untuk menghapusnya juga.
Erik the Outgolfer
Tidak diperlukan, tidak - tetapi kode ini masih melakukan setelah menghapus apa yang saya gunakan untuk membuatnya secara eksplisit melakukannya, karena fakta bahwa min([])=0 jelly.tryitonline.net/#code=W13huYI&input= - Perhatikan bahwa karena kata-kata melingkar sekarang tidak pernah input yang diharapkan, tidak ada masalah dalam melayani mereka.
Jonathan Allan
Saya hanya meminta Anda untuk memeriksa ulang. Dan, saya mengerti maksud Anda min([])==0, tetapi saya pikir ini masih bisa golf.
Erik the Outgolfer
3

CJam , 39 byte

r{2ew::-V}:D~-_:g_0=\D#)!@:zD-:g_0=\(-!

Cobalah online!

Input dapat berupa huruf besar atau kecil, tetapi tidak tercampur.

Program ini secara tidak sengaja menunjukkan kata-kata yang tidak harus sentrifugal atau sentripetal, tetapi sebaliknya memenuhi persyaratan menjadi spiral. Ini digambarkan sebagai "lingkaran" pada bagan di bawah ini.

Untuk menginterpretasikan output, gunakan grafik ini:

SPIRAL (output contains four 1s)
-11-11 : Clockwise Centrifugal
-1111  : Clockwise Centripetal
11-11  : Counter-clockwise Centrifugal
1111   : Counter-clockwise Centripetal

CIRCULAR (output contains two 1s)
-11    : Clockwise Circular
11     : Counter-clockwise Circular

NONSPIRAL (output contains a 0)


Penjelasan:

Program ini benar-benar mengevaluasi apakah urutan perbedaan tidak nol antara karakter dimulai positif atau negatif, jika bergantian dalam tanda, jika besarnya mulai meningkat atau menurun, dan jika terus melakukannya. Jika magnitude tidak bertambah atau berkurang maka program rusak dengan mengoperasikan pada array kosong. Langkah-langkah utama ditunjukkan di bawah ini (kode ini juga akan menunjukkan kemajuan tumpukan):

r{2ew::-V}:D~-   e# take difference of overlapping pairs, removing 0s handles duplicates
               ede# store difference function plus 0 as D, it's multipurpose
_:g_0=\          e# compute signs differences, keep first to show starting direction
               ede# -1 = CLOCKWISE, 1 = COUNTERCLOCKWISE
D#)!@            e# difference of signs includes 0 if not alternating, keep in stack
               ede# 1 = ALTERNATING, 0 = NOT ALTERNATING
:zD-:g           e# signs of difference of absolute values, ignoring 0s (fixed magnitude)
_0=\             e# keep first sign in stack to indicate how the sequence starts
               ede# -1 = INCREASING, 1 = DECREASING
(-!              e# remove first item from entire list and see if nothing remains
               ede# 1 = EMPTY(MONOTONE), 0 = NONEMPTY
Linus
sumber
3

PHP, 322 Bytes

for(;++$i<strlen($z=preg_replace("#(.)\\1#","$1",$argv[1]));){$t[]=$z[$i-1]<=>$z[$i]?:0;$o[]=$z[0]<=>$z[$i];$i<2?:$k[]=$z[$i-2]<=>$z[$i];}$s=preg_match("#^1?(-11)*(-1)?$#",join($t))?($t[0]!=1?1:2):0;$s+=2*preg_match($r="#^(-1|0)?([01](-1|0))*[01]?$#",join($o));$s*=preg_match($r,join($k));count_chars($z,3)[2]?:$s=0;echo$s;

untuk Output yang lebih cantik echo["n","+P","-P","+F","-F"][$s];

Versi yang diperluas

for(;++$i<strlen($z=preg_replace("#(.)\\1#","$1",$argv[1]));){
    $t[]=$z[$i-1]<=>$z[$i]?:0;
    $o[]=$z[0]<=>$z[$i];
    $i<2?:$k[]=$z[$i-2]<=>$z[$i];
    }
$s=preg_match("#^1?(-11)*(-1)?$#",join($t))?($t[0]!=1?1:2):0; #Clockwise direction or not
$s+=2*preg_match($r="#^(-1|0)?([01](-1|0))*[01]?$#",join($o)); # True centrifugal
$s*=preg_match($r,join($k)); #true or false second test for not
count_chars($z,3)[2]?:$s=0; # word must have >2 different characters
echo$s;# short output
echo["n","+P","-P","+F","-F"][$s]; #long output alternative

Nilai tugas 2 detik tanpa aturan dobel pendek

4 -F killness 11 Bytes memberikan 10 Bytes

3 + F logogog 10 Bytes yang berlawanan 9 Bytes

2-P pengikut 9 Bytes sarcocol, sasarara 8 Bytes

1 + P assession 9 Bytes apanage, aramaic, argonon, auction, avision, diberikan, crenele, exesion, exition, eyewink 7 Bytes

Visualisasikan sebuah kata

header('Content-Type: image/svg+xml; charset=UTF-8');
$w=$_GET["w"]??"OOPERRA";
$w=strtoupper($w);
echo '<?xml version="1.0" encoding="UTF-8"?>'
.'<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'

.'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 -100 420 400">'
.'<title>Swirl Word</title><desc>Viualize a Word</desc>';
echo '<text x="210" y="-50" text-anchor="middle" font-family="arial">'.$w.'</text>';

foreach(range("A","Z")as $x=>$c){
    echo '<text x="'.(15+$x*15).'" y="110" text-anchor="middle" font-family="arial">'.$c.'</text>';
    $r[$c]=15+$x*15;
}
for($i=0;++$i<strlen($w);){
    echo '<path d="M '.($r[$w[$i-1]]).',105 A '.($radius=abs($r[$w[$i]]-$r[$w[$i-1]])/2).' '.($radius).' 0 0 0 '.($r[$w[$i]]).',105" style="stroke:gold; stroke-width:1px;fill:none;" />';
}
echo '</svg>';  

di cuplikan adalah hasil dari SVG yang saya buat

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 -100 420 400"><title>Swirl Word</title><desc>Viualize a Word</desc><text x="210" y="-50"  text-anchor="middle" font-family="arial">KILLINGNESS</text><text x="15" y="110" text-anchor="middle" font-family="arial">A</text><text x="30" y="110" text-anchor="middle" font-family="arial">B</text><text x="45" y="110" text-anchor="middle" font-family="arial">C</text><text x="60" y="110" text-anchor="middle" font-family="arial">D</text><text x="75" y="110" text-anchor="middle" font-family="arial">E</text><text x="90" y="110" text-anchor="middle" font-family="arial">F</text><text x="105" y="110" text-anchor="middle" font-family="arial">G</text><text x="120" y="110" text-anchor="middle" font-family="arial">H</text><text x="135" y="110" text-anchor="middle" font-family="arial">I</text><text x="150" y="110" text-anchor="middle" font-family="arial">J</text><text x="165" y="110" text-anchor="middle" font-family="arial">K</text><text x="180" y="110" text-anchor="middle" font-family="arial">L</text><text x="195" y="110" text-anchor="middle" font-family="arial">M</text><text x="210" y="110" text-anchor="middle" font-family="arial">N</text><text x="225" y="110" text-anchor="middle" font-family="arial">O</text><text x="240" y="110" text-anchor="middle" font-family="arial">P</text><text x="255" y="110" text-anchor="middle" font-family="arial">Q</text><text x="270" y="110" text-anchor="middle" font-family="arial">R</text><text x="285" y="110" text-anchor="middle" font-family="arial">S</text><text x="300" y="110" text-anchor="middle" font-family="arial">T</text><text x="315" y="110" text-anchor="middle" font-family="arial">U</text><text x="330" y="110" text-anchor="middle" font-family="arial">V</text><text x="345" y="110" text-anchor="middle" font-family="arial">W</text><text x="360" y="110" text-anchor="middle" font-family="arial">X</text><text x="375" y="110" text-anchor="middle" font-family="arial">Y</text><text x="390" y="110" text-anchor="middle" font-family="arial">Z</text><path d="M 165,105 A 15 15 0 0 0 135,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 135,105 A 22.5 22.5 0 0 0 180,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 180,105 A 0 0 0 0 0 180,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 180,105 A 22.5 22.5 0 0 0 135,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 135,105 A 37.5 37.5 0 0 0 210,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 210,105 A 52.5 52.5 0 0 0 105,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 105,105 A 52.5 52.5 0 0 0 210,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 210,105 A 67.5 67.5 0 0 0 75,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 75,105 A 105 105 0 0 0 285,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 285,105 A 0 0 0 0 0 285,105" style="stroke:gold; stroke-width:1px;fill:none;" /></svg>

Jörg Hülsermann
sumber
Penampil Kata Berputar-putar Besar! :) Mungkin Anda bisa mencoba menghubungkan karakter dengan setengah elips, bukannya setengah lingkaran. Ini akan lebih kompak dan terlihat lebih "dinamis". Tapi tetap terlihat hebat!
Mario
@ Mario hanya membutuhkan faktor '.(.8*$radius).'alih-alih '.($radius).'dan jika Anda mengganti ($radius).' 0 0 0dengan ($radius).' 0 0 '.(($w[$i-1]<$w[$i]?1:0)^(($i-1)%2)).'program tidak memiliki arah perbaikan
Jörg Hülsermann
2

Haskell, 148 byte

z f=tail>>=zipWith f
g c=and.z c.filter(/=0).map abs.z(-).map fromEnum
(a:b:r)%c|a==b=(b:r)%c|1<3=c a b
f s|a<-[g(>=)s,g(<=)s]=or a:a++[s%(<),s%(>)]

Cobalah di Ideone.

Input harus berupa huruf kecil atau huruf besar semua.
Output adalah daftar lima boolean: [SW?, CF?, CP?, CW?, CC?].

f "positive" -> [True,True,False,False,True]

Ini ternyata lebih lama dari yang diharapkan, terutama menyerahkan runtuhnya karakter yang diulang memakan waktu sekitar 40 byte.

Pada awalnya saya membandingkan hanya dua karakter pertama untuk menghasilkan CWatau CCsebelum memperhatikan bahwa testcases suka bbaatau bbcvalid juga dan mengalahkan pendekatan ini.

Laikoni
sumber
2

Python, 152 byte:

lambda C:[C[-1]in max(C)+min(C),C[1]>C[0]]*all([[i>g,i<g][[h%2>0,h%2<1][C[1]>C[0]]]for i,g,h in filter(lambda i:i[0]!=i[1],zip(C,C[1:],range(len(C))))])

Fungsi lambda anonim. Sebut sebagai print(<Function Name>('<String>')).

Mengambil input karena semua huruf kecil atau huruf besar, tetapi tidak kasus campuran.

Keluaran array yang tidak mengandung apa-apa ( []) jika kata tersebut tidak berputar, atau array dalam format berikut:

  • Elemen 1 adalah True/Falseuntuk Centrifugal/Centripetal.
  • Elemen ke-2 adalah True/Falseuntuk Clockwise/Counterclockwise.

Cobalah secara Online! (Ideone)

R. Kap
sumber