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
AdmBorkBork
sumber
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
1
Juga sedikit terkait.
totallyhuman
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
benar-benar manusiawi
sumber
4
84 bytes
Arnold Palmer
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.

Arnauld
sumber
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. :)

DJMcMayhem
sumber
3

05AB1E , 36 byte

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

Cobalah online!

Guci Gurita Ajaib
sumber
4
Anda bisa menggantinya .•1нJ©½è`ÇHø¹á₂N¸°…ÈáÀ•#dengan A•22ā₂•S£.
Adnan
3
@Adnan rip format
Leaky Nun
3
@LeakyNun <s> rip memang </s> diperbaiki
Adnan
4
@Adnan rip format
Leaky Nun
4
@LeakyNun rip memang
Adnan
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
Luis Mendo
sumber
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
Zgarb
sumber
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.
Anders Kaseorg
sumber
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);}
HatsuPointerKun
sumber
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 .

Erik the Outgolfer
sumber
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.)

Neil
sumber
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]]                
Tuan Xcoder
sumber
1
23 byte
Leaky Nun
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
Adnan
sumber
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>

Shaggy
sumber
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)
Kucing Bisnis
sumber
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?
Grimmy
sumber
0

Jelly , 32 byte

“¢Ç⁺H’D0ẋj1œṗØA⁸=€×"€9Ḋ¤Fḟ0Iḟ0ṠE

Cobalah online!

Erik the Outgolfer
sumber
Kompresi RIP
Leaky Nun
@ LeakyNun Angka yang dikompresi sebenarnya 32222323sehingga menghemat hanya 2 byte.
Erik the Outgolfer
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.

Kamil Drakari
sumber
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!

C McAvoy
sumber
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
140 byte
Tn. Xcoder
@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!

officialaimm
sumber
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;
Titus
sumber
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.
geokavel
sumber
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;}
Matej Mulej
sumber
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).

Timtech
sumber
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.

Fungsi Gamma
sumber