Znajdź wirujące słowa!


41

Nie pytaj mnie, jak i dlaczego, ale podczas kodowania projektu zauważyłem, że znaki kilku słów mają określony wzorzec odnoszący się do alfabetu, połączyłem każdy znak słów ołówkiem na alfabecie i otrzymałem dwa spirale, wtedy zauważyłem, że pierwsza spirala była zgodna z ruchem wskazówek zegara, a druga przeciwnie do ruchu wskazówek zegara, i inne cechy ... więc nazwałem je Wirującymi Słowami !

Wirujące Słowo może być:

  1. zgodnie z ruchem wskazówek zegara lub przeciwnie do ruchu wskazówek zegara
  2. dośrodkowy lub odśrodkowy

Oto kilka przykładów Swirling Words :

Schemat wirujących słów

Zadanie 1:

Napisz pełny program lub funkcję, która pobierze słowo ze standardowego wejścia i wyświetli, jeśli jest to Wirujące Słowo i jego cechy, w czytelnym formacie, rozszerzony tekst, 3 znaki, flagi itp.

Testuj przypadki i przykładowe wyniki dla różnych słów (ale możesz zdecydować, jak reprezentować wyniki):

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

Zasady:

  1. Połączenie między dwóch pierwszych znaków musi być w górę (jak w grafice), wszystkie połączenia muszą być nawet w dół , wszystkie połączenia muszą być nieparzyste się .
  2. Możesz zignorować wielkie / małe litery lub rozważyć / przekonwertować wszystkie na wielkie lub wszystkie na małe.
  3. Słowa wejściowe to tylko znaki z zakresu alfabetu AZ, bez spacji, interpunkcji itp.
  4. Jeśli słowo ma podwójne znaki, takie jak „GROOVE”, musisz zwinąć podwójne znaki do jednego znaku: „GROOVE”> „GROVE”.
  5. Słowa wejściowe będą zawierać co najmniej 3 różne znaki. Słowa takie jak „MOM”, „TATA”, „LOL” nie są prawidłowymi słowami.
  6. Możliwe jest wielokrotne podanie tej samej postaci, np. „IRIS”.
  7. Najkrótszy kod wygrywa.

Zadanie 2:

Aby uzyskać większą reputację, znajdź najdłuższe Wirujące Słowa i jego cechy, które można znaleźć w słowniku angielskim, zgodnie z powyższymi zasadami. Możesz wziąć przykładowo pełną listę angielskich słów tutaj .

Miłego kodowania!


15
Ładne diagramy! :) (I miłe wyzwanie;))
Martin Ender

Czy pominięcie „Swirling” byłoby prawidłowym formatem wyjściowym, ponieważ sugeruje się, że wejście nie „nie wiruje”?
Martin Ender,

@MartinEnder Tak, ponieważ jest zrozumiałe, gdy wiruje lub nie, może być pusty dla „nie” i „1” dla „tak” itp. (Cieszę się, że lubisz diagramy i wyzwanie! :))
Mario,

1
@ TimmyD Ale nie wszystkie wyboiste słowa wirują. :)
Martin Ender

2
@ Lynn Dzięki za uznanie i sugestie, postaram się poprawić na przyszłość. Dodałem zasadę „usuń podwójnie”, aby przewidzieć, że ludzie będą mnie pytać, np. „Co robimy, gdy są podwójne?” > dwoje można traktować jako 1 pojedynczą postać, ponieważ od „L” przejście do „L” wynosi zero odległości :) Nie chodzi o to, że chciałem dodawać trudne trudności dla samego siebie.
Mario,

Odpowiedzi:


11

MATL , 33 31 30 bajtów

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

Wprowadzanie odbywa się wielkimi literami (lub małymi literami, ale nie jest mieszane).

Dane wyjściowe to:

  • Jeśli słowo nie wiruje: nie jest generowany żaden wynik
  • Jeśli wiruje: dwie liczby są tworzone w różnych liniach:
    • Pierwsza liczba 1/ -1 wskazuje odśrodkowe / dośrodkowe.
    • Druga liczba 1/ `-1 'wskazuje zgodnie z ruchem wskazówek zegara / przeciwnie do ruchu wskazówek zegara.

Wypróbuj online! Lub zweryfikuj wszystkie przypadki testowe (zmodyfikowany kod, aby pobrać wszystkie dane wejściowe i wygenerować dwie liczby wyjściowe w tym samym wierszu)

Wyjaśnienie

Weźmy 'OPERAA'za przykład przykład.

Pierwsza część kodu usuwa podwójne litery:

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'

Sprawdzamy teraz, czy odległości między literami nie maleją (warunek konieczny do zawirowania słowa):

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]

Następnie sprawdzamy, czy litery przewijają się do przodu i do tyłu (jest to drugi warunek zawirowania słowa):

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]

Na koniec sprawdzamy, czy oba warunki się utrzymują, i w takim przypadku tworzymy wynik:

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

6

Mathematica, 117 111 bajtów

Dzięki JHM za zaoszczędzenie 6 bajtów i rozróżnienie wielkości liter podczas uruchamiania!

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

Funkcja bez nazwy, która pobiera ciąg znaków i zwraca zagnieżdżoną listę wartości logicznych w formie {{B1,B2},B3,B4}. B4 rejestruje, czy słowo wiruje (a jeśli nie, reszta danych wyjściowych to śmieci). Jeśli słowo wiruje, B1 rejestruje, czy słowo jest odśrodkowe, B2 rejestruje, czy słowo jest dośrodkowe, a B3 rejestruje, czy słowo jest zgodne z ruchem wskazówek zegara (Prawda), czy przeciwnie do ruchu wskazówek zegara (Fałsz).

Oto już wersję, że post-procesy (pierwsza linia) Powyższa funkcja (rozmieszczone na 2. do 5. linii), aby identyczne PO: NOjeśli słowo nie jest wirowanie, a odpowiedni dobór {SW,CF,CW}, {SW,CF,CC}, {SW,CP,CW}, lub {SW,CP,CC}jeśli słowo wiruje:

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

Wyjaśnienie jest takie samo jak w odpowiedzi CJama Martina Endera, z jedną dodatkową uwagą: lista kolejnych różnic musi się naprzemiennie znak, aby słowo wirowało, i można to wykryć, upewniając się, że wszystkie produkty par kolejnych różnic są ujemne (to właśnie Max[Most[d]Rest@d]<0robi).

Działając na wszystkich ponad 40 000 słów Mathematica WordList[], znajdujemy następujące 8-literowe zawirowania słów, które są najdłuższymi z ich odpowiednich typów zawirowań:

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 wskazuje positivena brak podwójnych liter i mniej powtarzających się liter niż stowaway.)

Ale absolutnym mistrzem jest 9-literowe słowo wirujące w kierunku dośrodkowym vassalage!


1
Możesz zapisać 3 bajty za pomocą LetterNumberzamiast ToCharacterCodei kolejne 3 bajty za pomocą Most[d]zamiast Drop[d,-1].
JungHwan Min.

5

Scala, 110 bajtów

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

Zwraca krotkę (a,b)z

  • a == 1 jeśli s jest dośrodkowy
  • a == 0 jeśli s jest odśrodkowe
  • a == -1 jeśli s nie wiruje

i

  • b == true jeśli s jest zgodny z ruchem wskazówek zegara
  • b == false jeśli s jest przeciwny do ruchu wskazówek zegara
  • b może być prawdziwe lub fałszywe, jeśli s nie wiruje

Wyjaśnienie:

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

5

Galaretka , 30 bajtów

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

TryItOnline
Lub zobacz przypadki testowe (z niewielką zmianą, ponieważ ostatniÑwskazywałby na nowy główny link)

(Mój brak umiejętności łączenia łańcuchów prawdopodobnie kosztuje tutaj kilka bajtów)
Wszystkie wyższe lub wszystkie niższe.
Zwraca listę flag [D, F, S]:
S: wirowanie = 1 / brak wirowania = 0
F: odśrodkowe = 1 (kołowe = 0) centripetal = -1
D: zgodnie z ruchem wskazówek zegara = 1 / przeciwnie do ruchu wskazówek zegara = -1
- jeśli S = 0 pozostałe flagi są nadal oceniane, mimo że nie zawierają użytecznych informacji.

W jaki sposób?

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

1
Myślę, że doświadczasz tutaj czegoś, co nazywam „syndromem nowicjusza”. Czuję się dokładnie tak samo jak ty. Może Dennis mógłby tu pomóc. Ale dałem +1, tylko dlatego, że widziałem, że to możliwe w Galaretce. Możesz także usunąć okrągłą obudowę; już nie istnieje.
Erik the Outgolfer,

Dzięki za poke na temat okrągłych słów - jak się okazuje, 6 bajtów, aby je zaspokoić, były w rzeczywistości niepotrzebne, ponieważ minimum pustej listy jest, 0więc to nadal działa dla nich!
Jonathan Allan,

Więc to musi dla nich zadziałać? Widzę, że wciąż masz w circular(0)środku swoje wyjaśnienie, być może czas też je usunąć.
Erik the Outgolfer

Nie jest to wymagane, nie - ale ten kod nadal działa po usunięciu tego, czego wcześniej użyłem, aby to zrobić, z uwagi na fakt, że min([])=0 jelly.tryitonline.net/#code=W13huYI&input= - Uwaga: ponieważ okrągłe słowa nigdy nie są teraz oczekiwany wkład, nie ma problemu z wyżywieniem dla nich.
Jonathan Allan,

Poprosiłem właśnie o sprawdzenie. I zrozumiałem, że masz na myśli min([])==0, ale myślałem, że nadal można grać w golfa.
Erik the Outgolfer,

3

CJam , 39 bajtów

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

Wypróbuj online!

Dane wejściowe mogą być pisane wielkimi lub małymi literami, ale nie mieszane.

Program mimowolnie wskazuje słowa, które niekoniecznie są odśrodkowe lub dośrodkowe, ale poza tym spełniają wymagania bycia spiralą. Są one opisane jako „okrągłe” na poniższej tabeli.

Aby zinterpretować dane wyjściowe, skorzystaj z tej tabeli:

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)


Wyjaśnienie:

Program faktycznie ocenia, czy sekwencja niezerowych różnic między znakami zaczyna się od dodatniej, czy ujemnej, czy zmienia się w znaku, czy wielkości zaczynają rosnąć, czy maleć, i czy nadal to robi. Jeśli wielkości nie zwiększają się ani nie zmniejszają, program się psuje, operując na pustej tablicy. Najważniejsze kroki pokazano poniżej (ten kod pokazuje również postęp stosu):

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

3

PHP, 322 bajtów

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;

dla bardziej ładnego wyjścia echo["n","+P","-P","+F","-F"][$s];

Wersja rozszerzona

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

Zadanie 2 sekundowa wartość bez reguły podwójnych podwójnych

4-F zabijanie 11 bajtów pozytywnie na 10 bajtów

3 + F przeciwny 10 bajtów logogogue 9 bajtów

2-P wasalage 9 Bytes sarcocol, sasarara 8 Bytes

Ocena 1 + P 9 Bajty apanage, aramejski, argon, aukcja, avision, nagrodzony, crenele, eksces, exition, eyewink 7 Bajtów

Wizualizuj słowo

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>';  

we fragmencie znajduje się wynik utworzonego przeze mnie pliku SVG

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


Świetna przeglądarka Swirling Words! :) Może możesz spróbować połączyć postacie z pół-elipsami zamiast z półokręgami. Będzie bardziej kompaktowy i będzie wyglądał bardziej „dynamicznie”. Ale i tak wygląda świetnie!
Mario,

@Mario wymaga jedynie czynnik '.(.8*$radius).'zamiast '.($radius).'a jeśli zastąpić ($radius).' 0 0 0z ($radius).' 0 0 '.(($w[$i-1]<$w[$i]?1:0)^(($i-1)%2)).'programu nie ma kierunek fix
Jörg Hülsermann

2

Haskell, 148 bajtów

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%(>)]

Wypróbuj na Ideone.

Dane wejściowe muszą być albo małe albo wszystkie duże.
Wyjście znajduje się lista pięciu logicznych: [SW?, CF?, CP?, CW?, CC?].

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

Okazało się to dłużej niż oczekiwano, zwłaszcza przekazywanie zwiniętych znaków zajmuje około 40 bajtów.

Na początku porównywałem tylko dwa pierwsze znaki , które uległy, CWlub CCzanim zauważyłem, że przypadki testowe lubią bbalub też bbcsą ważne i pokonałem to podejście.


2

Python, 152 bajty:

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

Anonimowa funkcja lambda. Jak zadzwonić print(<Function Name>('<String>')).

Pobiera dane wejściowe jako wszystkie małe lub wielkie litery, ale nie mieszane.

Zwraca tablicę nie zawierającą niczego ( []), jeśli słowo nie jest swir, lub tablicę w następującym formacie:

  • Pierwszy element jest True/Falsedla Centrifugal/Centripetal.
  • Drugi element służy True/Falsedo Clockwise/Counterclockwise.

Wypróbuj online! (Ideone)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.