En Kısa Swype Yolunu Bulun


12

Giriş

Son zamanlarda, Swype ile yazmaya alışığım .

Başlangıç ​​mektubunuzdan bitiş mektubunuza düz bir çizgi çizerek veya tekrar eden harfleri atlayarak belirli kelimelerin üretilebileceğini fark ettim.

Örneğin balloon, aşağıdaki harfleri kaydırarak sözcüğü yazabilirim:

b> a> l> o> n.

Meydan okuma

En Kısa Swype Yolunu veya SSPbir dize yazmak için gereken minimum ayırt edilebilir çizgi parçası sayısı olarak tanımlayalım . Çizgi parçası, herhangi iki veya daha fazla harf arasındaki sürekli düz çizgidir. Yönteki herhangi bir değişiklik yeni bir çizgi parçasını başlatır - ancak bazı kelimeler yalnızca tek bir düz çizgi çizilerek kaydırılabilir.

Bu basit QWERTY klavye düzenini kullanın :

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

Yukarıdaki örnekte, kelime balloonbir olacaktır SSParasında 4aşağıdaki sekansı ayrıntılı olarak:

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)

Dize qwertysahip SSPbu kelimeyi Swyping yönün hiçbir değişiklik gereklidir çünkü = 1.

Giriş

a-zSTDIN, işlev bağımsız değişkeni veya komut satırı aracılığıyla herhangi birini içeren tek bir sözcük dizesi .

Çıktı

Dizeyi ntemsil eden sayı olan STDOUT, return veya en yakın dilinizle yazdırın SSP.

Çıkışta isteğe bağlı bir satırsonu. Standart boşluklara izin verilmedi. Bayt cinsinden en kısa gönderim kazanır.

notlar

  • Yön değişikliği, yeni bir çizgi parçasını başlatır.
  • Tekrar eden harfler sadece bir kez sayılır (örneğin: bookkeeperolarak ele alınmalıdır bokeper).
  • Normalde Swpye, kaçırılan harfleri komşu harflere bakarak ve en iyi tahminini doldurarak düzeltir. Bu zorluk için, doğal dil artırımı, tahmine dayalı metin veya hata düzeltmesi olmadığını varsayın.
  • Büyük harf A-Zgirişleri, küçük harfli muadilleri gibi işlem görür.
  • Girişteki sayıları yok sayın 0-9.
  • Çapraz yolları izin verilir - kapaklar harfler bir düz çizgi olduğunu o, k, nörneğin, olarak kabul 1segmenti. Bu kural herhangi diyagonal eğimi için de geçerlidir (örneğin: harfler c, h, iuyumludur).

Örnekler

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, c'den i'ye doğrudur, ancak c ve o arasında bir harf yoktur?
Sparr

Gönderilerin büyük harfleri de desteklemesi gerekiyorsa, bazılarını test senaryolarına dahil etmenizi öneririm.
Dennis

@Sparr Doğru.
CzarMatt

@Dennis İyi çağrı - test senaryoları eklendi.
CzarMatt

Swype ile yazmayı seviyorum, ama satırlar için programlama hakkında bilmiyorum ...
mbomb007

Yanıtlar:


8

CJam, 78 76 73 68 62 bayt

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

Kodun yazdırılamaz karakterler içerdiğini unutmayın.

Borçlama @ isaacg'ın 6 baytlık kaydedilen yolları saymak için RLE kullanma fikri.

CJam yorumlayıcısında çevrimiçi deneyin . Bağlantı çalışmazsa, kodu bu macundan kopyalayın .

Nasıl çalışır

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.

Çok zeki. Açıklama için teşekkürler.
CzarMatt

3

Pyth, 53 50 49 bayt

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

@Dennis sayesinde klavye sıkıştırma formatı.

Bu cevap bazı yazdırılamayan karakterler içeriyor. Doğru kod için aşağıdaki bağlantılara bakın.

Gösteri . Test Donanımı.

Açıklama:

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.

% 20'den fazla daha kısa! Açıklamanızı görmek için sabırsızlanıyoruz.
Dennis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.