それは秩序だった言葉ですか?


26

(Puzzlingに関するこの投稿に触発されました。注意:そのパズルのネタバレは下にあります。)

標準の電話キーパッドは、次のように文字と数字を関連付けます。

1 ->
2 -> ABC
3 -> DEF
4 -> GHI
5 -> JKL
6 -> MNO
7 -> PQRS
8 -> TUV
9 -> WXYZ
0 ->

上記を使用してキーパッドプレスに変換したときに、結果の数値が非減少または非増加である場合、特定の入力単語は順序付き単語として定義されます。言い換えれば、結果の数は増加減少もできません。

たとえば、単語はにCAT変換され228ます。これは減少しないため、順序付けされた単語です。ただし、単語DOG364であり、これは増加と減少の両方であるため、順序付けされた単語ではありません。

チャレンジ

単語が与えられたら、それが順序付けられているかどうかを出力します。

入力

  • ASCIIアルファベット([A-Z]または[a-z])文字のみで構成される適切な形式の単語(必ずしも辞書の単語である必要はありません)。
  • 入力がすべて大文字またはすべて小文字の場合の選択ですが、一貫性が必要です。
  • 単語の長さは少なくとも3文字になります。

出力

入力語が順序付けられている(真実)か、順序付けされていない(偽)かについての一貫した真実/偽の値。

ルール

  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 可能であれば、他の人があなたのコードを試すことができるように、オンラインテスト環境へのリンクを含めてください!
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

ここにいくつかの順序付けされた単語(つまり、真実)があり、リンクされたパズルパズルにはもっとあります。

CAT
TAC
AAA
DEMONS
SKID
LKJONMSRQP
ABCDEFGHIJKLMNOPQRSTUVWXYZ

ここにいくつかの非順序語(すなわち、偽)があります

DOG
GOD
ROSE
COFFEE
JKLMNOGHI

関連関連 これがだまされていないかどうかはわかりませんが、唯一の変更点abc->t9は単調性をチェックすることです。
nmjcman101

1
@ nmjcman101はい、それらは関連していますが、厳密には他の(より良い?)方法があるかもしれませんabc->t9
AdmBorkBork

それは理にかなっています、私は何かがその方法を打つことを期待しています
-nmjcman101


テストケースのリクエスト:AAA
Business Cat

回答:


13

パイソン2164の 148 132 77バイト

他の場所でRodが提案した-16バイトのおかげ。アーノルドパーマー氏のおかげで、-55バイトの途方もない結果が得られました。

n=[min(int((ord(i)-58)/3.13),9)for i in input()]
print sorted(n)in[n,n[::-1]]

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

入力は大文字でなければなりません。出力TrueまたはFalseその順序に基づいています。


説明

最初の行は、各文字を数字にマップします。

                               for i in input()   # iterate over the input string
            ord(i)                                # take the ASCII ordinal
                  -58                             # subtract 58
           (         )/3.13                       # divide by 3.13
       int(                )                      # chop off the fractional part
   min(                     ,9)                   # choose the minimum between the number and 9
n=[                                            ]  # assign the resulting list to n

これは以下に基づいて機能します。

          | A   B   C  | D   E   F  | G   H   I  | J   K   L  | M   N   O  | P   Q   R   S  | T   U   V  | W   X   Y   Z
----------+------------+------------+------------+------------+------------+----------------+------------+-----------------
ord(x)    | 65  66  67 | 68  69  70 | 71  72  73 | 74  75  76 | 77  78  79 | 80  81  82  83 | 84  85  86 | 87  88  89  90
----------+------------+------------+------------+------------+------------+----------------+------------+-----------------
x - 58    | 7   8   9  | 10  11  12 | 13  14  15 | 16  17  18 | 19  20  21 | 22  23  24  25 | 26  27  28 | 29  30  31  32
----------+------------+------------+------------+------------+------------+----------------+------------+-----------------
x ÷ 3.13* | 2.2 2.6 2.9| 3.2 3.5 3.8| 4.2 4.5 4.8| 5.1 5.4 5.8| 6.1 6.4 6.7| 7.0 7.3 7.7 7.9| 8.3 8.6 8.9| 9.3 9.6 9.9 10.2
----------+------------+------------+------------+------------+------------+----------------+------------+-----------------
int(x)    | 2   2   2  | 3   3   3  | 4   4   4  | 5   5   5  | 6   6   6  | 7   7   7   7  | 8   8   8  | 9   9   9   10
----------+------------+------------+------------+------------+------------+----------------+------------+-----------------
min(x, 9) | 2   2   2  | 3   3   3  | 4   4   4  | 5   5   5  | 6   6   6  | 7   7   7   7  | 8   8   8  | 9   9   9   9

*値は四捨五入されます。:P

2番目の行は、数値のリストが昇順または降順の場合に出力されます。

print                                             # print whether...
      sorted(n)                                   # n sorted...
               in[n,n[::-1]]                      # is equivalent to n or n reversed


1
聖なる牛、それは素晴らしい。ありがとう!
完全に人間

みんなが答えを殺到する前にそれを書いたので、答えとして投稿するつもりでしたが、あなたは私を狙撃しました:)
アーノルドパーマー

8

JavaScript(ES6)、 83 ... 71  70バイト

ブール値を返します。

x=>[...x].every(c=>v&=~(k=x,x=parseInt(c,35)*.32|0||10,x<k?2:x>k),v=3)

テストケース


どうやって?

文字変換

parseInt(c, 35)入力文字列の各文字を[ 10 .. 34 ]の数値に変換するために使用します。base-35であるため、「Z」NaN代わりに変換されます。

* .32 | 0はこの数値を間隔[ 3 .. 10 ]にマッピングし、「A」から「Y」までの8つの正しい文字グループを導きます。"Z"の|| 10正しい値を取得する必要があります。

           | A  B  C| D  E  F| G  H  I| J  K  L| M  N  O| P  Q  R  S| T  U  V| W  X  Y   Z
-----------+--------+--------+--------+--------+--------+-----------+--------+------------
parseInt   |10 11 12|13 14 15|16 17 18|19 20 21|22 23 24|25 26 27 28|29 30 31|32 33 34 NaN
-----------+--------+--------+--------+--------+--------+-----------+--------+------------
*.32|0||10 | 3  3  3| 4  4  4| 5  5  5| 6  6  6| 7  7  7| 8  8  8  8| 9  9  9|10 10 10  10

注文テスト

最初に3(0b11)に設定されたビットマスクvへの連続した数値の差の兆候を追跡します。

  • ビット#0:new_value> previous_valueのときにクリア
  • ビット#1:new_value <previous_valueの場合にクリア

前の値は、入力と同じ変数xに格納されます。これにより、文字のみを含む文字列は数字より大きくも小さくもないため、最初の反復(実際には以前の値が存在しない)はビットをクリアしません。

('CAT' > 5) === false
('CAT' < 5) === false

両方の記号が検出されない限り、単語は順序付けられ、v = 0になり、every()失敗します。


ああ、各文字の番号を取得するための素敵なトリック:)私はそれを借りるべきかどうか、それは私があなたと結びつくことを意味するので、引き裂かれています、それは正しくないようです。
シャギー

6

ゼリー28、27、25、23、22、21、19、 18のバイト

_>
O‘ç82ç88:3IṠḟ0E

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

これは書くのがとても楽しかったです!

説明:

                # Define a helper link, decrement a if a > b
_               # Subtract
 >              # Boolean greater than
                # Main link:
O               # The ordinals (ASCII points) of the input
 ‘              # Minus one
  ç82           # Decrement if greater than 82
     ç88        # Decrement if greater than 88
        :3      # Divide each number by 3
          I     # Consecutive differences
           Ṡ    # Sign (-1 if < 0, 0 if == 0, and 1 if > 0)
            ḟ0  # Remove all 0's
              E # All elements are equal?

すべてのバイトを節約してくれた@ ErikTheOutgolfer、@ leakynun、@ BusinessCatに感謝します。:)


3

05AB1E、36バイト

v.•1нJ©½è`ÇHø¹á₂N¸°…ÈáÀ•#Dʒyå}k}¥0‹Ë

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


4
あなたは置き換えることができます.•1нJ©½è`ÇHø¹á₂N¸°…ÈáÀ•#によってA•22ā₂•S£
アドナン

3
書式設定リッピング@Adnan
漏れ修道女

3
@LeakyNun <s> rip実際</ s>が修正されました
Adnan

4
書式設定リッピング@Adnan
漏れ修道女

4
@LeakyNunリッピング
アドナン

3

MATL26 25バイト

1Y21K250B-Y{c&m8\dZSu|s2<

入力は大文字です。出力は1または0です。

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

説明

1Y2      % Push 'ABC...XYZ'
1        % Push 1
K        % Push 4
250B     % Push 250 in binary, that is, [1 1 1 1 1 0 1 0]
-        % Subtract (from 4, element-wise): gives [3 3 3 3 3 4 1 4]
Y{       % Convert to cell array, splitting into chunks of those lengths
c        % Convert to char matrix. Gives a 4-column matrix. Chunks of length 3
         % are right-padded with a space
&m       % Implicit input. Push (linear) index of membership in char matrix
8\       % Modulo 8. Converts linear index into 0-based row index
d        % Consecutive differences
ZS       % Sign
u        % Unique
|        % Absolute value
s        % Sum
2<       % Less than 2? Implicit display

アルファベットチャレンジの適切なスコア:P
DJMcMayhem

@DJMcMayhemもうない:-D
ルイスメンドー

3

ハスク22 21 19 18バイト

±S€Ẋ▲`Ṫo±≤"DGJMPTW

1虚偽の入力に対して、真実の入力に対して返します0。入力は大文字でなければなりません。すべてのテストケースに合格します。 オンラインでお試しください!

説明

±S€Ẋ▲`Ṫo±≤"DGJMPTW  Implicit input x, e.g. "CAT"
     `Ṫo±≤"DGJMPTW  This part transforms x into a "canonical form" corresponding to the numpad digits
     `Ṫ             Table with flipped arguments
       o±≤          on sign of less-than-or-equal
                    (In Husk, ≤ returns extra information we don't want, so we take sign of the result to get 0 or 1.)
          "DGJMPTW  of this string and x.
                    This gives, for each char in x, a bit array of comparisons with the chars in the string:
                    y = [[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[1,1,1,1,1,1,0]]
   Ẋ▲               Maxima of adjacent pairs: [[0,0,0,0,0,0,0],[1,1,1,1,1,1,0]]
 S€                 1-based index in y as sublist: 2
±                   Sign: 1

3

Python 2、60バイト

a=[3681/ord(c)for c in input()]
print sorted(a)in[a,a[::-1]]

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

小文字の入力を受け入れます。

使い方

⌊3681/ X ⌋減少から

  • 38〜37でX ≈96.8684210526、前a
  • 37〜36でX ≈99.4864864865、の間cd
  • 36〜35でX ≈102.25、の間fg
  • 35〜34でX ≈105.171428571、間ij;
  • 34〜33でX ≈108.264705882、間lm;
  • 33〜32において、X ≈111.545454545、間op;
  • 32〜31において、X ≈115.03125、間st;
  • 31〜30におけるX ≈118.741935484、間vw;
  • 30の29へのXの後、≈122.7 z

2

C ++、375 199 195 194バイト

ShaggyのJavaScriptの回答に
感謝します:Zacharýのおかげで-5バイト

#include<string>
int o(std::string a){std::string m="22233344455566677778889999";for(auto&b:a)b=m[b-65];int j=1,i=0,d=0;for(;j<a.size();++j){if(a[j]>a[j-1])++i;if(a[j]<a[j-1])++d;}return!(i*d);}

int j=1,i=0,d=0forループに移動できますか?
ザカリー

@Zacharý ループブロックの外側で使用されるためidできません
-HatsuPointerKun

i==0||d==0==> i*d==0
ザカリー

だろう!(i*d)動作しますか?(後にスペースを削除return
ザカリー

@Zacharýはい、動作します
HatsuPointerKun

1

05AB1E、30バイト

A3 8×Ƶ0+S£¹δåā>‚øε`*}.«+¥0K0‹Ë

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

-1 Magic Octopus Urnに感謝します。


間違っている¥0K0.SËため使用しました¥0‹Ëか?0.Sが必要かどうかわかりません。
魔法のタコUr

@MagicOctopusUrn実際に¥0K0‹Ëは動作しているようです。
エリックアウトゴルファー

ええ、0を削除する場合は、そうする必要があります。私の答えでは、それが機能するかどうかはわかりません。
魔法のタコUr

@MagicOctopusUrn 0を削除します。そうしないと、偽陰性が発生します。ただし、あなたの答えは異なる振る舞いをするかもしれません。
エリックアウトゴルファー

1

網膜、65バイト

T`_ADGJMPTW`d
}T`L`_L
(.)\1*
$1$*1<
(1+)<(?!\1)
$1>
1

^(<*|>*)>$

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

T`_ADGJMPTW`d

各キーの最初の文字を数字に変更します。(これは1ずつずれていますが、昇順/降順のチェックには関係ありません。一方、ゼロは私の人生をより難しくするので、フィラー文字を1つ残しました。)

}T`L`_L

残りのすべての文字を1つずつシャッフルし、すべて数字に変換されるまで繰り返します。

(.)\1*
$1$*1<

数字を単項に変換しますが、同一の数字の実行ごとに1回だけにします。単項値は<...で区切られています

(1+)<(?!\1)
$1>

...しかし、LHSがRHSよりも大きい場合、<toを修正し>ます。

1

1不要になったsを削除します。

^(<*|>*)>$

単語が順序付けられていることを確認します。(末尾>は最後の桁に由来し、常に後続の空のスペースよりも大きく比較されます。)


それはいいね。徹底的な説明をありがとう。
AdmBorkBork

1

Pyth、23バイト

私の最初の重要なPyth回答の1つです!@LeakyNunのおかげで6バイト節約されました。最初の解決策は次のとおりです。

/{_BKmhS,9/a58Cd3.13zSK

テストスイート。

Pyth、29バイト

KmhS+9]/-Cd58 3.13w|qKSKqK_SK

テストスイート。


説明

/{_BKmhS,9/a58Cd3.13zSKQ-Qは評価された入力を意味し、最後に暗黙的です

 {-重複排除
  _-リバース
   B-分岐、2要素リストの作成、[B、A(B)]
    K-次への自動割り当てがある変数:
     mz-入力上のマップ:
      hS-最小(ソート済みリストの最初の要素)
        、-これらの要素を含む2要素リスト[A、B]を作成します。
         9-数値リテラル9
          /-整数の除算:
           a58Cd-58とord(current_element)の絶対差   
                3.13-数値リテラル3.13
                    SK-Kソート済み
/ Q-[K、K [::-1]]の入力の出現回数をカウントします                


1

05AB1E21 17バイト

コード

A•22ā₂•Sās×J‡Ô¥dË

05AB1Eエンコードを使用します。

オンラインでお試しください!またはすべてのテストケースを検証してください!

説明

A                   # Push the lowercase alphabet
 •22ā₂•             # Push the number 33333434
       S            # Split into an array
        ā           # Get the range of indices [1 .. length]
         s×         # Swap and string multiply
           J        # Join that array
            ‡       # Transliterate

これにより、基本的に次の文字が次の数字にマッピングされます。

abcdefghijklmnopqrstuvwxyz
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
11122233344455566667778888

             Ô      # Remove consecutive duplicates
              ¥     # Compute the delta's of the list
               d    # Check if the number is greater or equal to 0
                Ë   # Check if all elements are the same

1

JavaScript(ES6)、107 97 95 92 88 85バイト

大/小文字混合ストリングで機能します。1真実か偽か0を返します。

s=>(s=(a=[...s].map(c=>(parseInt(c,36)-3)/3.13%10|0||9))+"")==a.sort()|s==a.reverse()
  • Rodのおかげで10バイト節約されました。

それを試してみてください

o.innerText=(f=
s=>(s=(a=[...s].map(c=>(parseInt(c,36)-3)/3.13%10|0||9))+"")==a.sort()|s==a.reverse()
)(i.value="Cat")
oninput=_=>o.innerText=f(i.value)
<input id=i><pre id=o>


1
Math.min((parseInt(c,36)-3)/3.13|0,9)代わり"2..9"[parseInt(c,36)-10]にいくつかのバイトを節約するために
ロッド

ありがとう、@ Rod。非常に素晴らしい。将来の使用のためにそれをファイルする必要があります。
シャギー


@ThePirateBayに感謝しますが、残念ながら、入力に失敗しますAAA
シャギー

1

ガイア29 27 25 17 バイト

ċ⟨):“QX’>¦Σ⁻3/⟩¦o

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

説明

ċ                  Turn the input into a list of code points
 ⟨            ⟩¦   Map this block to each code point:
  )                 Increment it
   :                Copy it
    “QX’            Push [81 88]
        >¦          Check if the code point is greater than each of [81 88]
          Σ         Sum the results
           ⁻        Subtract from the code point
            3/      Integer divide the result by 3
                o  Check if the resulting list is in sorted order (increasing or decreasing)



0

C#(.NET Core)、133バイト

using System.Linq;q=>{var u=q.Select(c=>(int)((c-58)/3.13));var z=u.Zip(u.Skip(1),(a,b)=>a-b);return!(z.Any(d=>d<0)&z.Any(d=>d>0));};

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

保存する余地があるように感じますが、C#は簡潔な言語ではないので、多分そうではありません。ゴルフをしていない:

bool Ordered(string word){

    IEnumerable<int> keys = word.Select(character => (int)((character - 58)/3.13)); 
    // convert characters to keypad number

    IEnumerable<int> differences = keys.Zip(keys.Skip(1), (a, b)=> a-b); 
    // difference between consecutive elements

    return !(differences.Any(diff => diff<0) & differences.Any(diff => diff>0)); 
    // false if both positive and negative differences exist
}

特に、妥当性の最終チェックを表現するより短い方法、おそらくそれをでインライン化する方法があると思いますZip。のZip一時的なストレージを必要とせずに表現する方法を見つけることはSkip何かを節約することにもなりますが、もっと簡潔な何かがあるとは思いません。


0

Pythonの3143の 147 148 149 130バイト

def g(s,f=lambda c:min(int((ord(c)-58)/3.13),9)):x=[f(a)-f(b)for a,b in zip(s,s[1:])];return any(t<0for t in x)*any(t>0for t in x)

今のところできること。粗関数は、文字をASCIIコードに基づいた数字に変換します。間違いなくいくつかの改善点があります。0は真実、1は偽です(ごめん)。Rodのおかげで10バイト、Mr。Xcoderのおかげで3バイト節約できました。

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


x=[f(a)-f(b)for a,b in zip(s,s[1:])]いくつかのバイトを保存するために使用することができます
ロッド

また、min(int((ord(c)-58)/3.13),9)文字を変換するための短い方法です
ロッド


@ロッドあり​​がとう!非常に役立ちます。
C McAvoy

これを有効にするには、出力を入れ替える必要があります。
シャギー



0

CJam、37 31 30 27バイト

q{_"SVZY"#g-i3/}%_$_W%](e=g

オンラインで試す

もちろん、いバージョンは短くなります...

q{        e# For each character in string...
_"SVZY"#g e# Get index of that character in "SVZY". Signum that. (returns 1 or 0 if inside string, -1 if not.)
-i3/      e# Subtract value from character (i.e 'Z' becomes 'Y', 'F' becomes 'G'). Convert to int. Integer divide by 3. (this is just how the math works out for proper mapping of characters to phone digits.)
}%
_$_W%]    e# Put mapped string, sorted version, and reverse sorted version in array.
(         e# Pop mapped string from array onto stack.
e=        e# Count occurences of mapped string in array.
g         e# Signum.

0

C(gcc)183169153117バイト

#define a(b)(int)fmin(*(b c)/3.2,27)
d(char*c){int r=1,p=1;for(;1<strlen(c);)r&=a()<=a(1+),p&=a()>=a(++);return r|p;}

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

古いソリューション:

#define a(b)(int)((int)(b*.32-17.6)*.9)
d(char*c){int l=~-strlen(c),i=0,r=1,p=1;for(;i<l;++i)r&=a(c[i])<=a(c[i+1]),p&=a(c[l-i])<=a(c[l-i-1]);return r+p;}

ThePirateBayのおかげで8バイト節約されました。

古い古いソリューション:

d(char*c){char*a="22233344455566677778889999";int l=strlen(c)-1,i=0,r=1,p=1;for(;i<l;++i){if(a[c[i]-65]>a[c[i+1]-65])r=0;if(a[c[l-i]-65]>a[c[l-i-1]-65])p=0;}return r+p;}

古い古い古いソリューション:

d(char*c){char*a="22233344455566677778889999";int l=strlen(c);int i,r=1,p=1;for(;i<l-1;++i)if(a[c[i]-65]>a[c[i+1]-65])r=0;for(i=l-1;i>0;--i)if(a[c[i]-65]>a[c[i-1]-65])p=0;return r+p;}

0

TI-Basic、92 66バイト

ΔList(int(seq(inString("BC DEF GHI JKL MNO PQRSTUV WXYZ",sub(Ans,I,1))/4,I,1,length(Ans
0≤min(Ansmax(Ans

文字列の各文字を0〜7の整数に変換し、連続する各要素間の差を取得します。次に、最小と最大の差が同じ符号を持っている(またはどちらかが0である)かどうかをチェックします。


ΔList(int(4^-1seq(inString("DEF GHI JKL MNO PQRSTUV WXYZ",sub(Ans,I,1))+3,I,1,length(Ans1バイト節約できると思います。
リルトシアスト

0

Zsh73 69 57バイト

@ anders-kaseorgの3681/code変換を使用して-12バイト

for c (${(s::)1})((y=3681/#c,A|=y<p,D|=p&&p<y,p=y,!D|!A))

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

悪用するいくつかのこと:

  • ((statement,statement,...))最後のステートメントがゼロ以外の場合に真理を返す一連の算術式です。
  • ループの戻り値は、ループの最後のステートメントの戻り値です。
  • 算術演算子の優先順位はかっこなしの1つのペアのみ が使用されたため、非常に便利でした。バインドが1バイトより少ない場合は、1バイトを節約できます。!&
  • 未設定パラメーターは0、算術展開で展開されます。
  • キーパッド番号へのマッピングに使用する関数はCODE / 3.2 - 18(の特別な場合Z)ですが、コード間の変更のみが必要なため、線形調整は行いません。
for c (${(s::)1})           # split into characters
    (( y = #c-90 ? 0^(#c/3.2) : 27,   # this sets y to the keypad number + 18
       A |= y < p,          # set the A flag if we detect it is not ascending
       D |= p && p < y,     # ditto descending, don't compare on first iteration
       p = y,               # save the current character
       !D | !A              # return false if D and A are both set
    ))

真偽値を交換できる場合、2バイトを節約できます。

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