渦巻く言葉を見つけよう!


41

方法や理由を聞かないでください。プロジェクトのコーディング中に、いくつかの単語の文字がアルファベットを参照する特定のパターンを持っていることに気づき、単語の各文字をアルファベットの鉛筆でつなぎ、スパイラル、それから私は最初のスパイラルが時計回りであり、他が反時計回りであり、他の特性に気づいたので...私はそれらを渦巻く言葉と命名しました!

A 旋回ワードを指定できます。

  1. 時計回りまたは反時計回り
  2. 求心性または遠心性

ここに渦巻く言葉のいくつかの例があります:

渦巻く言葉の図

タスク1:

標準入力から単語を取得し、スワーリングワードである場合に出力する完全なプログラムまたは関数を、読み取り可能な形式、拡張テキスト、3文字、フラグなどで記述します。

さまざまな単語のテストケースと出力例(ただし、結果の表示方法は決定できます):

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

ルール:

  1. 最初の2つの文字間の接続がなければならないまで、全ての偶数接続がなければならない(グラフィックスのように)ダウン全ての奇数の接続がなければならず、アップ
  2. 大文字/小文字を無視するか、すべてを大文字に変換するか、すべてを小文字に変換/変換することができます。
  3. 入力単語は、AZのアルファベット範囲の文字のみであり、スペース、句読点などは使用できません。
  4. 単語に「GROOVE」などの二重文字がある場合、二重文字を「GROOVE」>「GROVE」の1文字にまとめる必要があります。
  5. 入力語には、少なくとも3つの異なる文字が含まれます。「MOM」、「DAD」、「LOL」などの単語は有効な単語ではありません。
  6. 「IRIS」のように、同じ文字で複数回渡すことができます。
  7. 最短のコードが優先されます。

タスク2:

より多くの評判を得るには、最長の旋回語を見つけてください。その特徴は、上記の規則に従って英語の辞書で見つけることができます。たとえば、ここで英語の単語の完全なリストを参照することができます

ハッピーコーディング!


15
素敵な図!:)(そして素敵な挑戦も。;))
マーティンエンダー

「渦巻き」を省略すると、入力が「渦巻きではない」ときに暗示されるため、有効な出力形式になりますか?
マーティンエンダー

@MartinEnderはい、渦巻いているかどうかは理解できるので、「not」の場合は空、「yes」の場合は「1」などにすることができます(ダイアグラムとチャレンジが気に入ってくれて嬉しいです!:))
マリオ

1
@TimmyDしかし、すべてのでこぼこの言葉が渦巻いているわけではありません。:)
マーティンエンダー

2
@Lynn感謝と提案をありがとう、私は将来のために改善しようとします。「ダブルが削除されたときに何をするか」などの質問を人々に期待するために、「ダブルを削除する」ルールを追加しました。>「L」から「L」への距離はゼロなので、ダブルを1つの単一の文字と見なすことができます。
マリオ

回答:


11

MATL33 31 30バイト

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

入力は大文字です(または小文字ですが、混在していません)。

出力は次のとおりです。

  • 単語が渦巻かない場合:出力は生成されません
  • 渦巻いている場合:異なる行に2つの数値が生成されます。
    • 最初の数字1/ -1 は、遠心/求心性を示します。
    • 2番目の数値1/ `-1 'は時計回り/反時計回りを示します。

オンラインでお試しください!または、すべてのテストケースを検証します(すべての入力を取得し、同じ行に2つの出力番号を生成するようにコードを変更しました)

説明

入力'OPERAA'を例としてみましょう。

コードの最初の部分では、二重文字が削除されます。

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'

文字間の距離が減少していないかどうかを確認します(単語が渦巻くために必要な条件)。

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]

次に、文字が前後に移動するかどうかを確認します(これは、単語が渦巻くためのもう1つの条件です)。

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]

最後に、2つの条件が成立するかどうかを確認し、その場合、出力を生成します。

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、117111バイト

6バイトを節約し、起動時に大文字と小文字を区別しないようにしてくれたJHMに感謝します!

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

文字列を取り、フォームにネストされたブール値のリストを返す名前のない関数{{B1,B2},B3,B4}。B4は、単語が渦巻いているかどうかを記録します(そうでない場合、出力の残りはゴミです)。単語が渦巻いている場合、B1は単語が遠心的かどうかを記録し、B2は単語が求心的かどうかを記録し、B3は単語が時計回り(True)か反時計回り(False)かを記録します。

ここでは、ポストプロセス(最初の行)(第2回-第5行にわたって間隔)上記の機能はOPと、それは同じようにすることを長いバージョンがあります:NO単語が渦巻く、との適切な選択されていない場合は{SW,CF,CW}{SW,CF,CC}{SW,CP,CW}、または{SW,CP,CC}場合言葉が渦巻いています:

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

説明はマーティン・エンダーのCJamの回答と同じですが、1つの追加の注意があります:連続する違いのリストは、単語が渦巻くために符号が交互でなければならず、連続する違いのペアのすべての積が負であることを確認することで検出できます(それMax[Most[d]Rest@d]<0がそうです)。

Mathematicaの40,000+ワードすべてで関数を実行するとWordList[]、次の8文字の渦巻く単語が見つかります。これらはそれぞれの渦巻タイプの中で最も長いものです。

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 positiveは、二重文字がな​​く、繰り返し文字がstowaway

しかし、絶対チャンピオンは反時計回りに渦巻く9文字の求心的な言葉vassalageです!


1
あなたは、使用して3バイト節約することができますLetterNumber代わりにToCharacterCode使用して、別の3つのバイトをMost[d]代わりにDrop[d,-1]
ジョンファンミン

5

Scala、110バイト

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

タプル(a,b)を返します

  • a == 1 sが求心性の場合
  • a == 0 sが遠心力の場合
  • a == -1 sが渦巻いていない場合

そして

  • b == true sが時計回りの場合
  • b == false sが反時計回りの場合
  • sが渦巻いていない場合、bはtrueまたはfalseになります。

説明:

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

ゼリー、30 バイト

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

TryItOnline
またはテストケースを参照します(最後Ñは新しいメインリンクを指すようにわずかに変更します)

(チェーンスキルの私の不足は、おそらくここで数バイトかかります)
すべて上位またはすべて下位。
フラグリスト[D、F、S]を返します
。S:回転= 1 /回転しない= 0
F:遠心= 1(円形= 0)求心​​= -1
D:時計回り= 1 /反時計回り= -1
-if S = 0他のフラグは有用な情報を運んでいない場合でも評価されます。

どうやって?

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
ここで私が「初心者症候群」と呼ぶものを経験していると思います。私はあなたとまったく同じように感じています。ここでデニスが助けになるかもしれません。しかし、ゼリーで可能だと思ったからといって、+ 1しました。また、円形ケースを取り外すことができます。もう存在しません。
エリックアウトゴルファー

空のリストの最小値は0それでもそれらのためにまだ機能するので、それらに応えるために6バイトが実際に不要であることが判明したので、循環語についての突破口に感謝します!
ジョナサンアラン

だから、彼らのために働く必要がありますか?あなたはまだcircular(0)あなたの説明の中にあると思います、多分それも同様に削除する時が来たのかもしれません。
エリックアウトゴルファー

必須ではありません-ですが、このコードは、min([])=0 jelly.tryitonline.net /#code = W13huYI&input = という事実により、明示的に削除するために使用していたものを削除した後でも実行されます。期待される入力、それらのケータリングに問題はありません。
ジョナサンアラン

私はあなたに再確認するように頼みました。そして、私はあなたが意味することを理解しましたがmin([])==0、これはまだゴルフに適していると思いました。
エリックアウトゴルファー

3

CJam、39バイト

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

オンラインでお試しください!

入力は大文字でも小文字でもかまいませんが、混在することはできません。

プログラムは、必ずしも遠心的または求心的である必要はないが、そうでなければスパイラルであるという要件を満たす単語を誤って指摘します。これらは、以下のチャートで「円形」として説明されています。

出力を解釈するには、次のチャートを使用します。

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)


説明:

プログラムは実際に、文字間のゼロ以外の差異のシーケンスが正または負で始まるかどうか、符号が交互になる場合、大きさが増加または減少する場合、および継続する場合を評価します。大きさが増減しない場合、プログラムは空の配列を操作することで中断します。主な手順を以下に示します(このコードはスタックの進行状況も示します)。

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バイト

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;

よりきれいな出力のために echo["n","+P","-P","+F","-F"][$s];

拡張版

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

タスク2の短いdoubleルールのない値

4 -F killingness 11バイトは10バイトを実証します

3 + F oppositive 10バイトのロゴゴーグ9バイト

2 -P家臣9バイトsarcocol、sasarara 8バイト

1 + P assession 9バイトapanage、aramaic、argonon、auction、avision、awarded、crenele、exesion、exition、eyewink 7バイト

単語を視覚化する

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

スニペットは、私が作成した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>


偉大な渦巻くワードビューアー!:)たぶん、半円ではなく半楕円で文字を接続しようとすることができます。それはよりコンパクトで、より「動的」に見えます。とにかく見栄えがいい!
マリオ

@マリオは、'.(.8*$radius).'代わりに要因のみを必要'.($radius).'とし、あなたがプログラムと交換($radius).' 0 0 0する場合($radius).' 0 0 '.(($w[$i-1]<$w[$i]?1:0)^(($i-1)%2)).'、修正の方向がありません
ヨルグヒュルサーマン

2

Haskell、148バイト

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

Ideoneでお試しください。

入力はすべて小文字またはすべて大文字でなければなりません。
出力は、5つのブール値のリストです[SW?, CF?, CP?, CW?, CC?]

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

これは予想よりも長いことが判明しました。特に、繰り返される文字の折りたたみの処理には約40バイトかかります。

最初に、最初の2文字だけを比較して、CWまたはCCテストケースが有効であるbbaか、またはbbc有効であることに気付く前に、このアプローチを無効にしました。


2

Python、152バイト:

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

匿名のラムダ関数。として呼び出しますprint(<Function Name>('<String>'))

入力はすべて小文字または大文字として入力されますが、大文字と小文字混在しません

[]単語が渦巻き状でない場合は何も含まない配列()を出力し、そうでない場合は次の形式の配列を出力します:

  • 最初の要素はTrue/FalseですCentrifugal/Centripetal
  • 2番目の要素はTrue/FalseですClockwise/Counterclockwise

オンラインでお試しください!(イデオン)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.