Temukan Jalur Swype Terpendek

12

pengantar

Akhir-akhir ini, saya sudah terbiasa mengetik dengan Swype .

Saya perhatikan kata-kata tertentu dapat dihasilkan dengan menggambar garis lurus dari huruf awal Anda ke huruf akhir Anda, atau dengan melewatkan huruf yang diulang.

Misalnya, saya bisa mengetikkan kata balloondengan Menggeser huruf-huruf berikut:

b> a> l> o> n.

Tantangan

Mari kita mendefinisikan Jalur Swype Terpendek , atau SSP, sebagai jumlah minimum segmen garis yang dapat dibedakan yang diperlukan untuk mengetik string. Segmen garis adalah garis lurus terus menerus antara dua, atau lebih, huruf. Setiap perubahan arah memulai segmen garis baru - meskipun beberapa kata mungkin di-Swip dengan menggambar hanya satu garis lurus.

Gunakan tata letak keyboard QWERTY sederhana ini :

q w e r t y u i o p
a s d f g h j k l
  z x c v b n m

Dalam contoh di atas, kata balloonakan memiliki SSPdari 4yang termaktub dalam urutan di bawah ini:

1) Start at `b` (line segments = 0)
2) slide to `a` (line segments = 1)
3) slide to `l` (line segments = 2)
4) slide to `o` (line segments = 3)
5) slide to `n` (line segments = 4)

String qwertymemiliki SSP= 1 karena tidak ada perubahan arah yang diperlukan saat Swyping kata ini.

Memasukkan

Satu string kata yang berisi apa saja a-zmelalui STDIN, argumen fungsi, atau baris perintah.

Keluaran

Cetak melalui STDOUT, return, atau alternatif terdekat bahasa Anda, nomor yang nmewakili string SSP.

Satu trailing newline opsional di outut. Celah standar tidak diijinkan. Pengajuan terpendek dalam byte menang.

Catatan

  • Perubahan arah memulai segmen garis baru.
  • Surat yang diulang hanya dihitung satu kali (misalnya: bookkeeperharus diperlakukan sebagai bokeper).
  • Biasanya, Swpye mengoreksi surat yang terlewat dengan melihat surat tetangga dan mengisi tebakan terbaiknya. Untuk tantangan ini, anggap tidak ada penambahan bahasa alami, teks prediksi atau koreksi kesalahan.
  • A-ZInput huruf besar diperlakukan seperti rekan-rekan huruf kecil mereka.
  • Abaikan angka apa pun 0-9dalam input.
  • Jalur diagonal diperbolehkan - yaitu, garis lurus yang mencakup huruf o, k, n, misalnya, dihitung sebagai 1segmen. Aturan ini berlaku untuk setiap lereng diagonal (misalnya: huruf c, h, isejalan).

Contohnya

Input          Output
---------------------
a                0
aa               0
aaaaaa           0
aaaaaabc         2
in               1
int              2
java             3
qwerty           1
chicago          5
balloon          4
BALLOON          4
typewriter       5
bookkeeper       6
stackexchange    11
2hello7          3
2HELLO7          3
CzarMatt
sumber
h ada di garis dari c ke i, tetapi tidak ada huruf antara c dan o?
Sparr
Jika kiriman harus mendukung huruf besar juga, saya sarankan untuk memasukkan beberapa dalam kasus uji.
Dennis
@Parr Benar.
CzarMatt
@Dennis Panggilan yang baik - tambah test case.
CzarMatt
Saya menikmati mengetik dengan Swype, tapi saya tidak tahu tentang pemrograman untuk baris ...
mbomb007

Jawaban:

8

CJam, 78 76 73 68 62 byte

relA,s-:_2ew{:-},{{i"x8LÑejPG ÀÏi"225b28b=A+Ab}/.-:ma}%e`,

Perhatikan bahwa kode tersebut mengandung karakter yang tidak dapat dicetak.

Meminjam ide pintar isaacg menggunakan RLE untuk menghitung jalur yang disimpan 6 byte.

Cobalah online di penerjemah CJam . Jika tautan tidak berfungsi, salin kode dari tempel ini .

Bagaimana itu bekerja

rel      e# Read a token from STDIN and cast it to lowercase.
A,s-     e# Remove all digits.
:_       e# Duplicate each element of the argument (string/array).
2ew      e# Push all overlapping slices of length 2.
{:-},    e# Filter out slices where both elements are equal.
{        e# For each slice:
  {      e#   For each character of the slice:
    i    e#     Push its code point.

    "x8LÑejPG ÀÏi"225b28b

         e#     Convert the string from base 225 to base 28, pushing the array
         e#     [15 7 16 17 18 27 26 8 9 0 3 11 4 6 24 1 22 5 21 10 25 23 12 2 13 14].
         e#     These are the positions on the QWERTY keyboard, starting from the
         e#     upper left corner and going right.

    =    e#     Select the element that corresponds to the code point.

         e#     Arrays wrap around in CJam. Since 'a' has code point 97, the array has
         e#     length 26 and 97 % 26 == 19, 'a' corresponds to the 20th element.

    A+Ab e#     Add 10 and convert to base 10. Example: 8 -> [1 8]
  }/     e#
  .-     e#     Vectorized subtraction. [a b] [c d] -> [a-c b-d]
  :ma    e#     atan2. Pushes the angle of the direction. [y x] -> arctan(y/x)
}%       e#
e`       e# Apply run-length encoding.
,        e# Count the runs.
Dennis
sumber
Sangat pintar. Terima kasih atas penjelasannya.
CzarMatt
3

Pyth, 53 50 49 byte

lrPMfT-VJm.jF.D@jC"XÖ;¿ìÇ×;¤ð$  _"28CdT@GrzZtJ8

Format kompresi keyboard berkat @Dennis.

Jawaban ini mengandung beberapa karakter yang tidak patut dicetak. Lihat tautan di bawah untuk kode yang benar.

Demonstrasi . Uji Harness.

Penjelasan:

lrPMfT-VJm.jF.D@jC"..."28CdT@GrzZtJ8
                              rzZ      Convert input to lowercase.
                            @G         Take the intersection with G.
                                       This removes the numbers.
         m                             Map over the characters
                 C"..."                Treat the string as a base 256 number.
                j      28              Convert this number to base 28, giving:
                                       [15, 7, 16, 17, 18, 27, 26,  ... ]
                                       which is the character positions 
                                       from top left, rotated by 97 places.
               @         Cd            Index this list by ord(character)
             .D            T           divmod by 10, giving the x-y position.
          .jF                          Convert this to a complex number.
        J                              Save the result to J.
      -VJ                        tJ    Vectorize - over J and J[1:]. This gives
                                       pairwise diffeences between J's elements.
    fT                                 Filter the differences on being truthy.
                                       This removes letter pairs with no movement.
  PM                                   Map the remaining complex numbers to their
                                       phases, which indicates their directions.
 r                                 8   Run-length encode the result.
l                                      Print out the number of separate RLE groups.
isaacg
sumber
Lebih dari 20% lebih pendek! Looking forward untuk melihat penjelasan Anda.
Dennis