波状の言葉を見つけよう!


18

(注:これは、以前の課題である「無限の言葉を見つけよう!」の簡単な派生です!。これは、他の以前のチャレンジFind the Swirling Words!のスピンオフです :))

の定義 波状の言葉の

  1. アルファベット(A〜Z)の波状の単語のすべての文字を曲線でつなぐと、次の図のように、右または左に連続して方向を変えない波のパスを取得します。
  2. A 波状ワードを指定できます。
    • 上げるそれぞれの連続した文字は、以前の1の(アルファベットで)右にある場合。
    • 連続する各文字が前の文字の左(アルファベット上)にある場合は減少します。
  3. すべての偶数接続がダウンしている必要があり、すべての奇数接続がアップしている必要があります。
  4. 大文字/小文字を無視するか、すべてを大文字に変換するか、すべて小文字に変換/変換することができます。
  5. 入力単語は、A〜Zのアルファベット範囲の文字のみで、スペース、句読点、記号は使用できません。
  6. 単語に「SPOON」などの二重文字がある場合、二重文字を1文字に折りたたむ必要があります。「SPOON」>「SPON」です(OからOに行くと距離がゼロになるため)。
  7. Wavy Wordsには、少なくとも3つの異なる文字が含まれます(二重に折りたたまれた後でも)。

ここにいくつかの例があります:

ここに画像の説明を入力してください

仕事:

それがある場合は、標準入力と出力の意志から単語を取る完全なプログラムや機能書く波状の言葉、それがされている場合かどうかを、正の場合は、出力上げまたは減少。出力が可能True/False/Null2/1/01/Null/0-1/0/1NO/WR/WD、など、あなたはそれをどのように表現するかを決めます。

テストケース:

WAVY WORDS:
  ADEPT, BEGIN, BILL, BOSS, BOOST, CHIMP,
  KNOW, SPONGE, SPOON, TROLL, WOLF  

ADEPT  > YES > RAISING
BEGIN  > YES > RAISING
BILL   > YES > RAISING
BOSS   > YES > RAISING
BOOST  > YES > RAISING
CHIMP  > YES > RAISING
KNOW   > YES > RAISING
SPONGE > YES > DECREASING
SPOON  > YES > DECREASING
TROLL  > YES > DECREASING
WOLF   > YES > DECREASING

NOT WAVY WORDS:
  WATCH, EARTH, NINON, FOO, BAR, WAVE, SELECTION,
  YES, NO, DEFINITION, WATER, WINE, CODE, AAAHHHH, I, MM, ABCA

ルール:

  • 最短のコードが優先されます。

オプションのタスク:

リストとして、できるだけ多くのWavy Wordsを英語の辞書で見つけてください。たとえば、ここで英語の単語の完全なリストを参照することができます


どのように写真を作りましたか?
オリバーNi

Illustratorで@Oliverを使っているのは仕事用ですが、GimpやInkskapeなどで同様の結果を得ることができます。
マリオ

NOそしてFOO、あなたのルールで有効な入力ではありません。
-PurkkaKoodari

1
@ Pietu1998彼らはNOT WAVY WORDSセクションにいますが、それは正しいです。–
Kade

1
@xnor#5すべての入力語が説明どおりであり、検証する必要がないと想定できます。#7これは、波形を作成するための文字の最小数です。残りの部分については、必要に応じて出力を決定します。
マリオ

回答:


6

05AB1E11 9バイト(Adnanに感謝)

Dg2›iÇü‹Ù

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

波状のケース:

0-波状の減少

1-波状の増加

波状でない場合:

[0,1] -波状ではなく、最初は減少していますが、パターンを壊した増加/平等があります。

[1,0] -波状ではなく、最初は増加しますが、その後、パターンを壊した減少/平等があります

入力文字列 -長さのためにそもそも波打つことはできません。

説明:

Dg2›iÇü‹Ù   # Full program

D           # Push 2 copies of input.
 g2›i       # If length is greater than 2. 
     Ç      # Push ASCII values for all characters in the string.
      ü     # Push pairwise array.
       ‹    # Vectorize 1 if negative difference, 0 if positive difference.
        Ù   # Uniquify using right most unique values first.
            # Else just print the string back, letting them know it's not valid input.

1
@JonathanAllan Dangit ...コメントと変更を見ただけです... The input words will contain at least 3 distinct characters3文字未満の単語を処理する必要がないことを意味しました。変更に取り組むには、時間がかかる場合があります。これが05AB1Eでできた最初の回答です。
魔法のタコUr

1
@JonathanAllan Fixed :)!しかし、今、あなたは私をbeっている;)。
魔法のタコUr

1
非常に素晴らしい!一つのチップは、ü‹同じですü-0‹:)
アドナン・

Hehehe ...男、私はPythonを学び、05AB1Eを拡張するのを手伝う必要があるかもしれません。この言語は印象的です。ヒントをありがとう!
魔法のタコUr

5

ゼリー、10 バイト

OIṠḟ0µL’aQ

TryItOnline!またはすべてのテストケースを実行する

戻り値:
[1]波状のために増加
[-1]減少波状のために
(そうでない何かを[][0][-1,1]、または[1,-1]

(不要として宣言:各々のための単一の値に対してOIṠḟ0µL’aQS(11バイト)が返され1-1および0それぞれ)。

どうやって?

OIṠḟ0µL’aQ - Main link: s
O          - cast to ordinals
 I         - incremental differences
  Ṡ        - sign (-1 for decreasing, 0 for no change, 1 for increasing)
   ḟ0      - filter out zeros
     µ     - monadic chain separation
      L    - length
       ’   - decremented
        a  - and
         Q - unique items

どちらの場合も、3つの異なる出力を使用できますか?
xnor

それらが異なる限り、「あなたはそれをどのように表現するかを決める」とはいを意味しました。ただし、ルール#5についての質問は、これ(およびおそらく他のすべてのエントリ)を無効にする可能性があります。
ジョナサンアラン

必要に応じてソリューションを追加しました。
ジョナサンアラン

リストを合計することはできませんか?
xnor

ああ、もちろん、> _ <ありがとう。
ジョナサンアラン

3

Python 2、54バイト

lambda s:[2<len(set(s))<s[::b]==sorted(s)for b in-1,1]

入力を文字のリストとして受け取ります。出力:

[False, True] for ascending
[True, False] for descending
[False, False] for neither

ソートされた入力文字列が元の文字列と同じか、逆の文字列かを確認します。1と-1のステップサイズでスライスすることにより、そうします。同時に、単語に少なくとも2つの異なる文字があるかどうかを確認します。

「エラーで終了」をどちらの場合でも出力に使用できる場合、51バイトまで下げることができます。

lambda s:[s,s[::-(len(set(s))>2)]].index(sorted(s))

それは文字列として指定されていないので、かなり確信して、あなたは、文字のリストを取ることができます:meta.codegolf.stackexchange.com/a/2216/8478
ジョナサン・アラン

3

Python 3、77 75バイト

lambda x:(len(set(x))>2)*(list(x)==sorted(x)or(list(x)==sorted(x)[::-1])*2)

すべての文字が同じ大文字であると仮定します。

戻り値:

  • 0 波状でない場合
  • 1 波状に進む場合
  • 2 後方に波状の場合

@ETHproductionsのおかげで不要なスペースを削除しました


2
PPCGへようこそ。最初の回答はいいですね。ただし、文字列に少なくとも3つの異なる文字があることも確認する必要があります。そうでない場合、それは何であれ波状の言葉ではありません。
ETHproductions

ああ、そう。波状の言葉の定義をもっとよく見るべきだった。修繕。
C.スミス

いいね!私はPythonの専門家ではありませんが、の両側のスペースを削除できると思いますor
ETHproductions

うん、あなたは正しい。式を括弧で囲んだ後、それらを削除するのを忘れました。キャッチしてくれてありがとう!
C.スミス

3

R、96 95バイト

function(x,d=diff(rle(utf8ToInt(x))$v))if(any(d>0)&any(d<0)|sum(1|d)<2)3 else`if`(all(d<1),2,1)

戻り値:

  • 1 波打つため
  • 2 波状で減少している
  • 3 波状でない

説明した

  • d=diff(rle(utf8ToInt(x))$v)d最初に文字列をそのASCII値に変換することにより変数を生成しますutf8ToInt。これを使用して、便利にベクトルを返します。その後、を使用してランレングスエンコーディングを実行しrleます。rle(...)$vシーケンスの非反復値を返します(つまり、すべての実行を折りたたみます)。最後に違いを取ります。
  • if(any(d>0)&any(d<0)|sum(1|d)<2)3:差の少なくとも1つが正で、少なくとも1つの負である場合、または差のシーケンスが2要素より少ない(3文字未満の元の単語に相当する)場合、その単語は波状ではなく戻ります3
  • else``if``(all(d<1),2,1):その他、すべての差が負の場合2、波状で減少して戻り、そうでない1場合は波状で上昇します。

R-fiddleですべてのテストケースを試してください(テストケース用にベクトル化できるように名前が付けられていることに注意してください)。


3

JavaScript(ES6)、84 81バイト

s=>(new Set(t=[...s]).size>2)*(!t.some((c,i)=>c>s[i+1])-!t.some((c,i)=>c<s[i+1]))

入力がすべて同じケースであると仮定します。1波状を上げる、波状-1を減らす、0または波状でない-0(両方とも偽)場合の戻り値。編集:@RobertHickmanのおかげで3バイト保存されました。


私は新しい機能の専門家ではありませんが、削除できますnewか?
チョイス

@Cyoce迷惑なことに、新しい機能を使用するにはが必要ですnew
ニール

@Neilは、Set()関数内で別の変数を初期化しt=[...s]、その2つの場所で[... s]の代わりにtを使用することでバイトを節約できると信じています。
ロバートヒックマン

3

Javascript(ES6)、84 80 78バイト

i=>new Set(s=[...i]).size>2?[i,s.reverse().join``].indexOf(s.sort().join``):-1

波状の増加が0の場合、減少は1で、-1は波状ではありません。

2バイトの節約を支援してくれた@Neilに感謝します。


1
new Set(s=[...i])2バイト節約できます。(i反復、配列への変換、配列の反復、セットへの変換によって機能します。複雑ですが、ゴルフをしているときはそのようなことは心配しません。)
ニール


2

パイソン2、53の 52 50バイト

引用符で囲まれた入力を期待します。例えば "watch"

名前のないラムダとして:

lambda s:(sum(map(cmp,s[1:],s))+1)/min(len(s)-1,3)

各文字の差の符号を合計し、整数で除算しlen-1ます。すべてが1(増加している)合計がlen-1表示される1場合、減少-1および混合の1場合と同様に-1、合計はlen-1表示されるよりも小さくなります0

-1バイトに変更cmp,s[1:],s[:-1])するcmp,s[1:],s)+1


返される1ために"NO"
ジョナサン・アラン

@JonathanAllan LMNOPだからOはNの後にあり、これは1を意味する増加を意味する
カールナップ

はい、ただし、3文字未満のすべての単語(重複する文字を削除した後)は波状でないと定義されました(波状でないテストケースでは「NO」です)。
ジョナサンアラン

@JonathanAllanはこのlen問題を修正しましたが、繰り返し文字がまだ問題である
カールNapf

2

ルビー、54バイト

->w{c=w.chars.uniq;c==(s=c.sort)?2:(c==s.reverse)?1:0}

0単語が波状で1ない場合、後方波状である2場合、および前方波状である場合に返します。


2

Groovy-56バイト

{d = it [0]; c = [0] * 3; it.each {a-> c [(a <=> d)] = 1; d = a}; c [1 ..- 1]}

出力[1,0]波状高めるため、[0,1]波状を減少させるため、[0,0]単一の文字入力用または[1,1]非波状のため。

注:入力はStringまたはchar []であり、すべての文字は大文字と小文字が同じであると想定しています。


2

PHP、96バイト

for(;($t=$argv[1])[++$i];)$s+=$r[]=$t[$i-1]<=>$t[$i];echo(max($r)-min($r)<2)*(0<=>$s)*(1<$s*$s);

または98バイト

$s=str_split($t=$argv[1]);sort($s);echo(-($t==strrev($j=join($s)))|$t==$j)*!!count_chars($t,3)[2];

波状ではない0上昇する-1下降する


-代わりに2*(-1は減少:-1バイト)。*(!!...)括弧は不要です。(-2)
タイタス

$s*$s>1代わりにabs($s)>1(-2)
タイタス

@タイタスはありがとうございます
ヨルクヒュルサーマン

2

PHP、100バイト

$n=$m=$l=str_split($argv[1]);sort($n);rsort($m);echo(($n==$l)-($m==$l))*(count(array_unique($l))>2);

戻り値:

  • -1 波状、減少します。
  • 0 波状でないため。
  • 1 波打つために。

!!array_unique($s)[2]代わりにcount(array_unique($l))>2
ヨルグヒュルサーマン

実際、それに関する問題はarray_uniqueがキーを逆にすることです。したがって、array_uniqueを使用すると、aaabcのような入力は誤って0を出力します。
チョコカオス

1

C、164バイト

main(){char s[99];scanf("%s",s);char *c=&s;int p=*c;while(*c^0){if(p>*c){if(c-&s[0]>1)return 0;while(*c^0){if(p<*c)return 0;p=*c;c++;}return 2;}p=*c;c++;}return 1;}

波状でない場合は0、波状かつ上昇する場合は1、減少する場合は2を返します。


1

ラケット321バイト

(let*((ld(λ(sl)(for/list((i(sub1(length sl))))(-(list-ref sl(add1 i))(list-ref sl i)))))(l(ld(remove-duplicates(map
(λ(x)(char->integer x))(string->list s)))))(am andmap)(N"Not WAVY")(d displayln))(cond[(<(length l)2)(d N)][(am(λ(x)(>= x 0))l)
(d"YES; RAISING")][(am(λ(x)(<= x 0))l)(d"YES; DECREASING")][else(d N)])))

ゴルフをしていない:

(define (f s)
  (let*  ((ld (lambda(sl)          ; sub-fn to get differences in list elements
                (for/list ((i (sub1(length sl))))
                  (- (list-ref sl (add1 i))
                     (list-ref sl i) ) )))
          (l (ld
              (remove-duplicates
               (map
                (lambda(x)
                  (char->integer x))
                (string->list s)))))
          (am andmap)
          (N "Not WAVY")
          (d displayln))
    (cond
      [(< (length l) 2)(d N)]
      [(am (lambda(x) (>= x 0)) l) (d "YES; RAISING")]
      [(am (lambda(x) (<= x 0)) l) (d "YES; DECREASING")]
      [else (d N)]
      )))

テスト:

(f "ADEPT"); > YES > RAISING
(f "BEGIN"); > YES > RAISING
(f "BILL"); > YES > RAISING
(f "BOSS"); > YES > RAISING
(f "BOOST"); > YES > RAISING
(f "CHIMP"); > YES > RAISING
(f "KNOW"); > YES > RAISING
(f "SPONGE"); > YES > DECREASING
(f "SPOON"); > YES > DECREASING
(f "TROLL"); > YES > DECREASING
(f "WOLF"); > YES > DECREASING

(f "WATCH")
(f "EARTH")
(f "NINON")
(f "FOO")
(f "BAR")
(f "WAVE")
(f "SELECTION")

出力:

YES; RAISING
YES; RAISING
YES; RAISING
YES; RAISING
YES; RAISING
YES; RAISING
YES; RAISING
YES; DECREASING
YES; DECREASING
YES; DECREASING
YES; DECREASING
Not WAVY
Not WAVY
Not WAVY
Not WAVY
Not WAVY
Not WAVY
Not WAVY

1

Java 7、254 240バイト

import java.util.*;int c(String s){char[]a=s.toCharArray(),x=a.clone();Arrays.sort(x);return s.replaceAll("(.)\\1{1,}","$1").length()<3?0:Arrays.equals(a,x)|Arrays.equals(x,(new StringBuffer(s).reverse()+"").toCharArray())?a[0]>a[1]?1:2:0;}

出力0入力文字列が、波打っていない場合1、それは上昇波だ場合、そして2それは減少の波だ場合。

未ゴルフ&テストコード:

ここで試してみてください。

import java.util.*;
class M{
  static int c(String s){
    char[] a = s.toCharArray(),
           x = a.clone();
    Arrays.sort(x);
    return s.replaceAll("(.)\\1{1,}", "$1").length() < 3
            ? 0
            : Arrays.equals(a, x) | Arrays.equals(x, (new StringBuffer(s).reverse()+"").toCharArray())
               ? a[0] > a[1]
                  ? 1
                  : 2
               : 0;
  }

  public static void main(String[] a){
    System.out.print(c("ADEPT") + ", ");
    System.out.print(c("BEGIN") + ", ");
    System.out.print(c("BILL") + ", ");
    System.out.print(c("BOSS") + ", ");
    System.out.print(c("BOOST") + ", ");
    System.out.print(c("CHIMP") + ", ");
    System.out.println(c("KNOW"));

    System.out.print(c("SPONGE") + ", ");
    System.out.print(c("SPOON") + ", ");
    System.out.print(c("TROLL") + ", ");
    System.out.println(c("WOLF"));

    System.out.print(c("WATCH") + ", ");
    System.out.print(c("EARTH") + ", ");
    System.out.print(c("NINON") + ", ");
    System.out.print(c("FOO") + ", ");
    System.out.print(c("BAR") + ", ");
    System.out.print(c("WAVE") + ", ");
    System.out.print(c("SELECTION") + ", ");
    System.out.print(c("YES") + ", ");
    System.out.print(c("NO") + ", ");
    System.out.print(c("DEFINITION") + ", ");
    System.out.print(c("WATER") + ", ");
    System.out.print(c("WINE") + ", ");
    System.out.print(c("CODE") + ", ");
    System.out.print(c("AAAHHHH") + ", ");
    System.out.print(c("I") + ", ");
    System.out.print(c("MM") + ", ");
    System.out.println(c("ABCA"));
  }
}

出力:

2, 2, 2, 2, 2, 2, 2
1, 1, 1, 1
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

int c(char[]s){int t=s[0],f=s.length,a=1,b=1,i;for(i=1;i<f;){if(s[i]-s[i-1]>=0)++a;if(s[i]-s[i++-1]<1)++b;}return a==f?1:b==f?-1:0;}(132バイト)
ナンバーノット

波状上昇の場合は出力1、波状下降の場合は出力-1、波状でない場合は0
Numberknot
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.