Apakah ini Kata yang Dipesan?


26

(terinspirasi oleh pos ini di membingungkan. PERHATIAN: SPOILER UNTUK PUZZLE YANG DI BAWAH.)

Tombol telepon standar menghubungkan huruf dengan angka sebagai berikut:

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

Kata input yang diberikan didefinisikan sebagai Word yang Diurutkan jika, ketika diterjemahkan ke penekanan tombol dengan menggunakan di atas, angka yang dihasilkan tidak menurun atau meningkat. Dengan kata lain, angka yang dihasilkan tidak dapat meningkat dan turun.

Misalnya, kata yang CATditerjemahkan menjadi 228, yang tidak menurun, dan dengan demikian menjadi Kata yang Terurut. Namun, kata itu DOGadalah 364, yang keduanya meningkat dan menurun, dan dengan demikian bukan Kata Terurut.

Tantangan

Diberi kata, keluaran apakah dipesan atau tidak.

Memasukkan

  • Sebuah kata (tidak harus kata kamus) yang hanya terdiri dari alfabet ASCII ( [A-Z]atau [a-z]), dalam format apa pun yang sesuai .
  • Pilihan Anda jika input semuanya huruf besar atau semua huruf kecil, tetapi harus konsisten.
  • Panjang kata setidaknya 3 karakter.

Keluaran

Nilai kebenaran / falsey yang konsisten untuk apakah kata yang dimasukkan dipesan atau tidak.

Aturan

  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online agar orang lain dapat mencoba kode Anda!
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

Contohnya

Berikut adalah beberapa Kata yang Dipesan (yaitu, benar), dan ada lebih banyak lagi di teka-teki yang membingungkan.

CAT
TAC
AAA
DEMONS
SKID
LKJONMSRQP
ABCDEFGHIJKLMNOPQRSTUVWXYZ

Berikut adalah beberapa Kata yang Tidak Dipesan (mis., Falsey)

DOG
GOD
ROSE
COFFEE
JKLMNOGHI

Terkait dan Terkait Saya tidak yakin ini bukan penipuan, satu-satunya perubahan di antara abc->t9dan tantangan ini adalah memeriksa monotonitas?
nmjcman101

1
@ nmjcman101 Ya, itu terkait, tetapi mungkin ada cara lain (lebih baik?) selain ketat abc->t9.
AdmBorkBork

Itu masuk akal, saya berharap melihat sesuatu mengalahkan metode itu
nmjcman101


Permintaan uji kasus:AAA
Bisnis Cat

Jawaban:


13

Python 2 , 164 148 132 77 byte

-16 Bytes berkat saran Rod di tempat lain . Frickin '-55 bytes berkat Arnold Palmer.

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

Cobalah online!

Input harus dalam huruf besar. Keluaran Trueatau Falseberdasarkan keteraturannya.


Penjelasan

Baris pertama memetakan setiap huruf ke angka.

                               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

Ini bekerja berdasarkan:

          | 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

* Nilai dibulatkan. : P

Baris kedua menghasilkan jika daftar angka dalam urutan naik atau turun.

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


1
Astaga, itu luar biasa. Terima kasih!
manusia

Saya akan mempostingnya sebagai jawaban karena saya menulisnya sebelum semua orang membanjiri jawaban, tetapi Anda mengecam saya :)
Arnold Palmer

8

JavaScript (ES6),  83 ... 71  70 byte

Mengembalikan boolean.

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

Uji kasus


Bagaimana?

Konversi surat

Kami menggunakan parseInt(c, 35)untuk mengonversi setiap huruf dari string input ke beberapa nomor di [ 10 .. 34 ]. Karena itu base-35, "Z" dikonversi menjadiNaN .

Ekspresi * .32 | 0memetakan nomor ini ke dalam interval [ 3 .. 10 ], mengarah ke 8 grup huruf yang benar untuk "A" ke "Y" . Kita perlu || 10mendapatkan nilai yang benar untuk "Z" .

           | 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

Tes pemesanan

Kami melacak tanda-tanda perbedaan antara angka berurutan ke dalam bitmask v , awalnya diatur ke 3 (0b11):

  • bit # 0: dihapus ketika nilai_baru> nilai_ sebelumnya
  • bit # 1: dihapus ketika nilai new_value <prior_value

Nilai sebelumnya disimpan dalam variabel x yang sama dengan input. Ini memastikan bahwa iterasi pertama - di mana tidak ada nilai sebelumnya benar-benar ada - tidak akan menghapus sedikitpun, karena string yang hanya berisi huruf tidak lebih besar atau lebih kecil dari angka apa pun:

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

Sebuah kata diurutkan kecuali kedua tanda ditemui, yang mengarah ke v = 0 dan membuat every()gagal.


Oh, trik yang bagus untuk mendapatkan nomor setiap huruf :) Saya bingung apakah saya harus meminjamnya atau tidak, karena itu berarti saya akan mengikat Anda, yang sepertinya tidak benar.
Shaggy

6

Jelly , 28, 27, 25, 23, 22, 21, 19, 18 byte

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

Cobalah online!

Ini sangat menyenangkan untuk ditulis!

Penjelasan:

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

Terima kasih kepada @ErikTheOutgolfer, @leakynun, dan @BusinessCat untuk semua penghematan byte. :)



3

MATL , 26 25 byte

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

Masukan dalam huruf besar Output adalah 1atau 0.

Cobalah online!

Penjelasan

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

Skor yang sesuai untuk tantangan alfabet: P
DJMcMayhem

@DJMcMayhem Tidak lagi :-D
Luis Mendo

3

Sekam , 22 21 19 18 byte

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

Pengembalian 1untuk input yang benar, 0untuk yang palsu. Input harus dalam huruf besar. Lewati semua kasus uji. Cobalah online!

Penjelasan

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

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

Cobalah online!

Menerima input dalam huruf kecil.

Bagaimana itu bekerja

⌊3681 / x ⌋ berkurang dari

  • 38 hingga 37 pada x ≈ 96.8684210526, sebelumnya a;
  • 37 hingga 36 pada x ≈ 99.4864864865, antara cdan d;
  • 36 hingga 35 pada x ≈ 102,25, antara fdan g;
  • 35 hingga 34 pada x ≈ 105.171428571, antara idan j;
  • 34 hingga 33 pada x ≈ 108.264705882, antara ldan m;
  • 33 hingga 32 pada x ≈ 111.545454545, antara odan p;
  • 32 hingga 31 pada x ≈ 115.03125, antara sdan t;
  • 31 hingga 30 pada x ≈ 118.741935484, antara vdan w;
  • 30 hingga 29 pada x ≈ 122,7, setelah z.

2

C ++, 375 199 195 194 byte

Berkat jawaban JavaScript Shaggy:
-5 byte terima kasih kepada Zacharý

#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);}

Bisakah Anda memindahkan int j=1,i=0,d=0ke loop for?
Zacharý

@ Zacharý Sejak idan ddigunakan di luar blok loop, saya tidak bisa
HatsuPointerKun

i==0||d==0==> i*d==0.
Zacharý

Akan !(i*d)bekerja (menghapus ruang setelah return)
Zacharý

@ Zacharya Ya, itu berfungsi
HatsuPointerKun

1

05AB1E , 30 byte

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

Cobalah online!

-1 terima kasih kepada Magic Octopus Mm .


Apakah Anda menggunakan ¥0K0.SËkarena ¥0‹Ëtidak benar? Saya tidak tahu apakah 0.Sdiperlukan.
Guci Gurita Ajaib

@MagicOctopusUrn Bahkan ¥0K0‹Ëtampaknya berhasil.
Erik the Outgolfer

Ya, jika Anda menghapus 0 itu seharusnya; dalam jawaban saya, saya tidak yakin itu berhasil.
Magic Gurita Guci

@ MagicOctopusUrn Saya menghapus 0s karena jika tidak akan ada negatif palsu. Jawaban Anda mungkin berperilaku berbeda.
Erik the Outgolfer

1

Retina , 65 byte

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

^(<*|>*)>$

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

T`_ADGJMPTW`d

Ubah huruf pertama pada setiap tombol menjadi angka. (Ini dinonaktifkan oleh 1 tetapi itu tidak masalah untuk cek naik / turun. Di sisi lain, nol akan membuat hidup saya lebih sulit, jadi saya meninggalkan satu karakter pengisi.)

}T`L`_L

Kocok semua huruf yang tersisa hingga 1 dan ulangi sampai semuanya dikonversi menjadi angka.

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

Konversikan digit menjadi unary, tetapi hanya sekali menjalankan angka yang identik. Nilai-nilai unary dipisahkan dengan <...

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

... tetapi jika LHS ternyata lebih besar dari RHS, perbaiki <to >.

1

Hapus 1s yang tidak lagi diperlukan.

^(<*|>*)>$

Periksa apakah kata tersebut sudah dipesan. (Trailing >berasal dari digit terakhir yang selalu membandingkan lebih besar dari ruang kosong yang mengikutinya.)


Itu keren sekali. Terima kasih atas penjelasannya.
AdmBorkBork

1

Pyth , 23 byte

Salah satu jawaban Pyth non-sepele pertama saya! Disimpan 6 byte berkat @LeakyNun. Solusi awal di bawah ini.

/{_BKmhS,9/a58Cd3.13zSK

Test Suite.

Pyth , 29 byte

KmhS+9]/-Cd58 3.13w|qKSKqK_SK

Test Suite.


Penjelasan

/{_BKmhS,9/a58Cd3.13zSKQ - Q berarti input yang dievaluasi dan tersirat pada akhirnya

 {- Deduplicate
  _ - Membalikkan
   B - Bifurcate, Buat daftar dua elemen, [B, A (B)]
    K - Variabel dengan penugasan otomatis ke:
     mz - Peta di atas input:
      hS - Minimum (elemen pertama daftar yang diurutkan)
        , - Buat daftar dua elemen, [A, B] dengan elemen-elemen ini:
         9 - Angka numerik 9
          / - Divisi bilangan bulat dari:
           a58Cd - Perbedaan absolut antara 58 dan ord (current_element)   
                3.13 - Huruf numerik 3.13
                    SK - K disortir
/ Q - Hitung kemunculan input di [K, K [:: - 1]]                


1

05AB1E , 21 17 byte

Kode

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

Menggunakan penyandian 05AB1E .

Cobalah online! atau Verifikasi semua kasus uji!

Penjelasan

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

Ini sekarang pada dasarnya memetakan surat-surat berikut ke nomor-nomor berikut:

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 byte

Bekerja dengan string case campuran. Pengembalian 1untuk kebenaran atau 0untuk kepalsuan.

s=>(s=(a=[...s].map(c=>(parseInt(c,36)-3)/3.13%10|0||9))+"")==a.sort()|s==a.reverse()
  • 10 byte disimpan berkat Rod .

Cobalah

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)alih "2..9"[parseInt(c,36)-10]- alih menyimpan beberapa byte
Rod

Terima kasih, @Rod; sangat bagus. Saya harus menyimpannya untuk digunakan di masa depan.
Shaggy


Terima kasih, @ThePirateBay, tetapi, sayangnya, itu gagal untuk input AAA.
Shaggy

1

Gaia , 29 27 25 17 byte

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

Cobalah online!

Penjelasan

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

1

05AB1E , 13 byte

ÇÍžq÷8
7:Ô¥dË

Setiap kali saya melihat pertanyaan numpad, saya harus membuat jawaban berdasarkan pi.

Cobalah secara online atau verifikasi semua kasus uji

Ç                    # ASCII code of each letter in the input
 Í                   # add 2
  žq÷                # divide by pi
     8 7:            # replace 8 with 7
         Ô           # remove duplicates
          ¥          # deltas
           d         # each >= 0 ?
            Ë        # are all elements equal?


0

C # (.NET Core) , 133 byte

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

Cobalah online!

Saya merasa seperti ada beberapa ruang untuk diselamatkan, tetapi C # bukan bahasa yang ringkas jadi mungkin tidak. Tidak Disatukan:

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
}

Secara khusus saya pikir ada cara yang lebih pendek untuk mengekspresikan pemeriksaan akhir untuk validitas, mungkin cara untuk menyamakannya dengan Zip. Menemukan cara untuk mengekspresikan Ziptanpa perlu penyimpanan sementara untuk Skipitu juga akan menghemat sesuatu, tapi saya ragu ada sesuatu yang lebih ringkas untuk itu.


0

Python 3 , 143 147 148 149 130 byte

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)

Yang terbaik yang bisa saya lakukan untuk saat ini. Fungsi kasar mengubah huruf menjadi angka berdasarkan kode ascii. Pasti ada beberapa perbaikan yang harus dilakukan. 0 benar, 1 adalah falsey (maaf). Disimpan 10 byte berkat Rod, 3 lainnya berkat Mr. Xcoder.

Cobalah online!


Anda dapat menggunakan x=[f(a)-f(b)for a,b in zip(s,s[1:])]untuk menyimpan beberapa byte
Rod

juga, min(int((ord(c)-58)/3.13),9)adalah cara yang lebih singkat untuk mengonversi char
Rod


@Rod, terima kasih! Sangat membantu.
C McAvoy

Anda harus menukar output Anda agar valid.
Shaggy

0

Python 2 , 111 103 byte

-8 byte terima kasih kepada @Arnold Palmer: tidak lower()diperlukan

  • Mengambil huruf besar sebagai input.
lambda x:sorted(f(x))in[f(x),f(x)[::-1]]
f=lambda x:['22233344455566677778889999'[ord(i)-65]for i in x]

Cobalah online!


1
Anda dapat menghapus .lower()karena input bisa dalam hal apa pun yang Anda tentukan.
Arnold Palmer

0

PHP 7, 98 + 1 95 + 1 84 + 1 byte

pelabuhan golf jawaban Arnauld .

for(;$c=ord($argn[$i]);$v|=$i++?$p>$k?2:$p<$k:0,$p=$k)$k=($c-58)*.32%10?:9;echo$v<3;

menerima huruf besar; output kosong untuk kepalsuan, 1untuk kebenaran.

Jalankan sebagai pipa dengan -nRatau coba online .

pos asli:

for(;$c=$argn[$i++];$p?$a[]=$p<=>$k:0,$p=$k)$k=(ord($c)-58)/3.13-($c>Y)|0;echo min($a)*max($a)>=0;

0

CJam, 37 31 30 27 byte

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

Cobalah secara Online

Tentu saja versi jelek akhirnya menjadi lebih pendek ...

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) , 183 169 153 117 byte

#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;}

Cobalah online!

Solusi lama:

#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;}

Disimpan 8 byte berkat ThePirateBay.

Solusi lama:

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

Solusi lama lama:

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 byte

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

Mengubah setiap karakter dalam string menjadi bilangan bulat dari 0 hingga 7, dan mengambil perbedaan antara setiap elemen berturut-turut; kemudian periksa apakah perbedaan minimum dan maksimum memiliki tanda yang sama (atau keduanya 0).


Saya pikir ΔList(int(4^-1seq(inString("DEF GHI JKL MNO PQRSTUV WXYZ",sub(Ans,I,1))+3,I,1,length(Ansmenghemat satu byte.
lirtosiast

0

Zsh , 73 69 57 byte

-12 byte dengan menggunakan 3681/codekonversi @ anders-kaseorg .

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

Cobalah online! Cobalah online! Cobalah online!

Beberapa hal yang kami penyalahgunaan:

  • ((statement,statement,...))adalah urutan ekspresi aritmatika yang mengembalikan kebenaran jika pernyataan terakhir adalah nol.
  • Nilai balik dari sebuah loop adalah nilai balik dari pernyataan terakhir dalam satu loop.
  • Prioritas operator aritmatika cukup baik bagi kami, karena hanya sepasang tanpa tanda kurung yang digunakan. Satu byte dapat disimpan jika !terikat kurang dari& .
  • Parameter yang tidak disetel akan diperluas ke 0dalam ekspansi aritmatika.
  • Fungsi yang kami gunakan untuk memetakan ke nomor keypad adalah CODE / 3.2 - 18 (dengan case khusus untuk Z), tetapi karena kita hanya perlu perubahan antar kode, kita tidak melakukan penyesuaian linier.
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 byte dapat disimpan jika nilai kebenaran / falsey dapat ditukar.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.