Skip to content

Instantly share code, notes, and snippets.

@magical
Created November 28, 2010 03:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save magical/718549 to your computer and use it in GitHub Desktop.
Save magical/718549 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# written by magical
# based on http://blog.rabidgremlin.com.nyud.net/2010/11/28/4-little-words/
# licensed under WTFPL
# works with python2 and python3
WORDS = [ "A", "AID", "ANA", "ARC", "AT", "AWN", "BAR", "BET", "BOG", "BUG", "CAB", "COD", "COY", "DAD",
"DES", "DOE", "DUE", "EGO", "ETC", "FAT", "FIR", "FUM", "GAP", "GIL", "GUY", "HAP", "HER", "HIT", "HOW", "ICY", "ION",
"IVY", "JET", "JOY", "KIM", "LAM", "LEN", "LIT", "LOW", "MAN", "MEL", "MOD", "MUG", "NAY", "NIP", "NOV", "OAR", "OIL",
"ORR", "OWL", "PAP", "PEP", "PIT", "PRO", "RAG", "RED", "RIP", "RUB", "SAG", "SEA", "SIN", "SO", "SPY", "TAD", "TEN",
"TO", "TOY", "UP", "WAG", "WET", "WOW", "YES", "ACHE", "ADEN", "AIDS", "ALLY", "AMES", "ANNA", "ARGO", "AUNT", "AWAY",
"BAIT", "BAND", "BARN", "BAWD", "BEAU", "BELT", "BETA", "BILL", "BLED", "BLUR", "BOHR", "BONE", "BORE", "BOYD", "BRIG",
"BULL", "BURT", "CAFE", "CANE", "CASH", "CHAD", "CHIN", "CLAD", "CLUB", "CODE", "COLT", "CORD", "CRAG", "CUBE", "CURL",
"DANG", "DATE", "DEAN", "DEFY", "DIET", "DISH", "DOME", "DOUR", "DRUB", "DUKE", "EACH", "EDDY", "ELBA", "EROS", "FAIL",
"FAST", "FELL", "FILE", "FISH", "FLAT", "FLOW", "FOLK", "FORK", "FRAY", "FULL", "GAGE", "GAME", "GAVE", "GIBE", "GIST",
"GLOW", "GOES", "GORY", "GREW", "GULF", "HAAG", "HALO", "HARM", "HAWK", "HEED", "HERE", "HIKE", "HOBO", "HONE", "HOST",
"HUFF", "HURD", "IDEA", "IOWA", "JACK", "JERK", "JOBS", "JOVE", "JUNE", "KANE", "KERN", "KISS", "KNOW", "LACK", "LAME",
"LATE", "LEAK", "LENT", "LICK", "LILA", "LINK", "LOAM", "LONG", "LOST", "LULU", "LYLE", "MAIL", "MANN", "MASH", "MEAD",
"MEMO", "MILD", "MINI", "MOAN", "MONA", "MORN", "MUDD", "MUTT", "NASH", "NEIL", "NIBS", "NOEL", "NOUN", "ODIN", "OLIN",
"ONUS", "OUTS", "QUOD", "RAIN", "RAYS", "REEK", "RICE", "RINK", "ROCK", "ROOM", "ROVE", "RULE", "RUST", "SALK", "SAUL",
"SEAM", "SELF", "SHAW", "SHOW", "SILK", "SITE", "SKIT", "SLIM", "SLUR", "SOAK", "SOME", "SOWN", "STIR", "SUMS", "SWAN",
"TAKE", "TEAL", "TEND", "THEE", "TICK", "TIME", "TOIL", "TOOT", "TRAM", "TROT", "TUNE", "ULAN", "VAIN", "VEIN", "VINE",
"WAIL", "WANE", "WAST", "WEAN", "WENT", "WHET", "WINE", "WOLF", "WORN", "YARN"
]
class WordError(ValueError):
def __init__(self, word):
self.word = word
def words2ip(words):
ip = []
for w in words:
w_ = w.upper().strip()
try:
n = WORDS.index(w_)
except ValueError:
raise WordError(w)
ip.append(n)
return '.'.join(str(n) for n in ip)
def ip2words(ip):
words = [WORDS[n] for n in ip]
return words
def splitip(ip):
if ip.count('.') != 3:
raise ValueError(ip)
return list(map(int, ip.split('.')))
from sys import argv, exit, stdout, exc_info
args = argv[1:]
if len(args) == 4:
try:
print(words2ip(args))
exit(0)
except WordError:
import sys
e = exc_info()[1]
stdout.write("unknown word: %s\n" % str(e.word))
exit(1)
elif len(args) == 1:
arg = args[0]
if arg == '-h' or arg == '--help':
pass
elif '.' in arg:
try:
ip = splitip(arg)
try:
words = ip2words(ip)
except ValueError:
stdout.write("invalid ip: %s\n" % arg)
exit(1)
except ValueError:
import socket
try:
ip = socket.gethostbyname(arg)
except socket.error:
e = exc_info()[1]
stdout.write(str(e))
stdout.write("\n")
exit(1)
ip = splitip(ip)
words = ip2words(ip)
print(' '.join(words))
exit(0)
else:
words = arg.split()
try:
ip = words2ip(words)
except WordError:
e = exc_info()[1]
stdout.write("unknown word: %s\n" % str(e.word))
exit(1)
else:
print(ip)
exit(0)
stdout.write("Usage: 4lw [ip]\n 4lw [host]\n 4lw [words]\n")
exit(1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment