Tìm đường dẫn Swype ngắn nhất


12

Giới thiệu

Gần đây, tôi đã quen với việc gõ bằng Swype .

Tôi đã nhận thấy một số từ nhất định có thể được tạo ra bằng cách vẽ một đường thẳng từ chữ cái đầu của bạn đến chữ cái kết thúc của bạn hoặc bằng cách bỏ qua các chữ cái lặp lại.

Ví dụ: tôi có thể nhập từ balloonbằng cách Swyping qua các chữ cái sau:

b> a> l> o> n.

Thử thách

Hãy để chúng tôi xác định Đường dẫn Swype ngắn nhất , hoặc SSP, là số lượng tối thiểu của các phân đoạn dòng có thể phân biệt cần thiết để nhập một chuỗi. Một đoạn thẳng là một đường thẳng liên tục giữa bất kỳ hai hoặc nhiều chữ cái. Bất kỳ thay đổi nào về hướng đều bắt đầu một phân đoạn dòng mới - mặc dù một số từ có thể bị Swyped bằng cách chỉ vẽ một đường thẳng duy nhất.

Sử dụng bố trí bàn phím QWERTY đơn giản này :

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

Trong ví dụ trên, từ balloonsẽ có một SSPsố 4chi tiết trong chuỗi dưới đây:

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)

Chuỗi qwertySSP= 1 vì không cần thay đổi hướng khi Swyping từ này.

Đầu vào

Một chuỗi từ đơn có chứa bất kỳ a-zthông qua STDIN, đối số hàm hoặc dòng lệnh.

Đầu ra

In qua STDOUT, trả lại hoặc ngôn ngữ của bạn thay thế gần nhất, số nđại diện cho chuỗi SSP.

Một dòng mới tùy chọn trong outut. Sơ hở tiêu chuẩn không được phép. Gửi ngắn nhất trong byte chiến thắng.

Ghi chú

  • Thay đổi hướng bắt đầu một phân khúc dòng mới.
  • Các chữ cái lặp lại chỉ được tính một lần (ví dụ: bookkeepernên được coi là bokeper).
  • Thông thường, Swpye sửa các chữ cái bị bỏ lỡ bằng cách nhìn vào các chữ cái lân cận và điền vào dự đoán tốt nhất của nó. Đối với thử thách này, giả sử không có sự gia tăng ngôn ngữ tự nhiên, văn bản dự đoán hoặc sửa lỗi.
  • A-ZĐầu vào chữ hoa được coi như đối tác chữ thường của chúng.
  • Bỏ qua bất kỳ số nào 0-9trong đầu vào.
  • Đường chéo được phép - có nghĩa là, một đường thẳng mà bìa thư o, k, n, ví dụ, tính là 1phân khúc. Quy tắc này áp dụng cho bất kỳ độ dốc đường chéo (ví dụ: chữ c, h, ilà phù hợp).

Ví dụ

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

h nằm trên dòng từ c đến i, nhưng không có chữ cái nào giữa c và o?
Sparr

Nếu các bài nộp phải hỗ trợ cả chữ in hoa, tôi đề nghị bao gồm một số trong các trường hợp thử nghiệm.
Dennis

@Sparr Đúng.
CzarMatt

@Dennis Cuộc gọi tốt - thêm trường hợp kiểm tra.
CzarMatt

Tôi rất thích gõ bằng Swype, nhưng tôi không biết về lập trình cho các dòng ...
mbomb007

Câu trả lời:


8

CJam, 78 76 73 68 62 byte

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

Lưu ý rằng mã chứa các ký tự không thể in được.

Mượn ý tưởng thông minh của việc sử dụng RLE @ isaacg để đếm các đường dẫn được lưu 6 byte.

Hãy thử trực tuyến trong trình thông dịch CJam . Nếu liên kết không hoạt động, sao chép mã từ dán này .

Làm thế nào nó hoạt động

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.

Rất thông minh. Cám ơn vì đã giải thích.
CzarMatt

3

Bình thường, 53 50 49 byte

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

Định dạng nén bàn phím nhờ @Dennis.

Câu trả lời này có chứa một số ký tự không thể in được. Xem các liên kết dưới đây cho mã chính xác.

Trình diễn . Khai thác thử nghiệm.

Giải trình:

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.

Ngắn hơn 20%! Mong được xem lời giải thích của bạn.
Dennis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.