DEV Community

Discussion on: Daily Challenge #180 - SMS Shortener

Collapse
 
candidateplanet profile image
lusen / they / them 🏳️‍🌈🥑

in Python

Note the tricky case about a tweet that starts with a space but is truncated -- first letter, even following spaces and punctuation, should not be capitalized.

MAX = 160
LOWERCASE_LETTERS = "abcdefghijklmnopqrstuvwxyz"
UPPERCASE_LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

def first_letter_idx(msg):
  for idx in range(0, len(msg)):
    if msg[idx] in LOWERCASE_LETTERS or msg[idx] in UPPERCASE_LETTERS:
      return idx
  return None

def shorten(tweet):
  if len(tweet) < MAX:
    return tweet

  # how many spaces we need to delete
  delete_count = len(tweet) - MAX

  # build it backwards and then reverse when return
  result = []
  # idx is index in tweet, read right to left
  for idx in range(0, len(tweet))[::-1]:
    if tweet[idx] == ' ' and delete_count > 0:
      if len(result) > 0 and result[-1] in LOWERCASE_LETTERS:
        result[-1] = result[-1].upper()
      delete_count -= 1
    else:
      result.append(tweet[idx])

  result = result[::-1]
  result = result[:160]

  # special case: first letter in tweet is preceeded by a space. that letter -- as the _start_ of camel-case -- should not be capitalized. however all other letters following spaces can be  capitlized.
  r_fl_idx = first_letter_idx(result)
  t_fl_idx = first_letter_idx(tweet)
  if r_fl_idx is not None and result[r_fl_idx].lower() == tweet[t_fl_idx].lower():
    result[r_fl_idx] = tweet[t_fl_idx]

  return ''.join(result)

def test(result, expected):
  print('-'*80)
  print(len(result) == len(expected))
  print(result == expected)
  #print(result, len(result))
  #print(expected,  len(expected))

result = shorten("No one expects the Spanish Inquisition! Our chief weapon is surprise, fear and surprise; two chief weapons, fear, surprise, and ruthless efficiency! And that will be it.")
expected = "No one expects the Spanish Inquisition! Our chief weapon is surprise, fear and surprise; two chief weapons, fear,Surprise,AndRuthlessEfficiency!AndThatWillBeIt."
test(result, expected)

result = shorten("SMS messages are limited to 160 characters. It tends to be irritating, especially when freshly written message is 164 characters long. SMS messages are limited to 160 characters. It tends to be irritating, especially when freshly written message is 164 characters long.")
expected = "SMSMessagesAreLimitedTo160Characters.ItTendsToBeIrritating,EspeciallyWhenFreshlyWrittenMessageIs164CharactersLong.SMSMessagesAreLimitedTo160Characters.ItTendsTo"
test(result, expected)

result = shorten("This message is already short enough!")
expected = "This message is already short enough!"
test(result, expected)

result = shorten("ThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoon")
expected = "ThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereIsNoSpoonThereI"
test(result, expected)

result = shorten(" dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd")
expected = "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
test(result, expected)

result = shorten("    dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd")
expected = "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
test(result, expected)
print(result)
print(expected)

result = shorten("    Dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd")
expected = "Dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
test(result, expected)
print(result)
print(expected)

result = shorten(" !d Eddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd")
expected = " !d Eddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
test(result, expected)
print(result)
print(expected)

result = shorten(" !d Edddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeeedddddddddddddddddddddddddddddddddddddddddddddddd")
expected = "!dEdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeeeddddddddddddddddddddddddddddddddddddddddddddddd"
test(result, expected)
print(result)
print(expected)