Największe forum w sieci o nazwie postcount ++ postanowiło stworzyć nową grę forum. W tej grze celem jest opublikowanie słowa, ale słowo musi mieć jedną literę dodaną, usuniętą lub zmienioną. Twój szef chciał, żebyś napisał program, który zna to słowo, oraz słownik UNIX, gdy pracujesz dla firmy, która ma bardziej inteligentne forum z bardziej inteligentnymi grami forum i chce zniszczyć konkurencję (hej, to twój szef, nie rób tego dyskutuj z nim, i tak dostajesz dużo gotówki z pracy).
Twój program otrzyma dwa argumenty, słowo i słownik. Ponieważ użytkownik zarządzający programem (tak, użytkownik, twoja firma nie ma zasobów do uruchamiania botów) nie jest doskonały, powinieneś normalizować sprawę w obu przypadkach. Słowa w słowniku mogą zawierać litery ASCII (zarówno wielkie, jak i małe, ale należy je zignorować podczas porównania), myślniki, apostrofy i niesekwencyjne spacje na środku. Nie będą dłuższe niż 78 znaków. Musisz wygenerować listę słów, które zostałyby zaakceptowane w grze, aby przerwać zabawę ludziom, którzy myślą o słowach ręcznie.
To jest przykład oczekiwanego programu, sprawdzający podobne słowa do golf
.
> ./similar golf /usr/share/dict/words
Goff
Wolf
gold
golfs
goof
gulf
wolf
/usr/share/dict/words
Znajduje się lista słów, z przerwą po każdej linii. Możesz to łatwo odczytać na przykład za pomocą fgets ().
Firma, w której pracujesz, nie ma zbyt wielu kart dziurkaczy (tak, jest rok 2014 i nadal używają kart dziurkaczy), więc nie marnuj ich. Napisz możliwie najkrótszy program. Aha, i zostałeś poproszony o nieużywanie wbudowanych lub zewnętrznych implementacji odległości Levenshteina lub jakiegokolwiek podobnego algorytmu. Coś o Not Invented Here lub backdoorach, które najwyraźniej dostawca wstawił do języka (nie masz na to dowodów, ale nie rozmawiasz z szefem). Więc jeśli chcesz odległość, będziesz musiał ją wprowadzić sam.
Możesz używać dowolnego języka. Nawet z kartami dziurkowanymi firma ma dostęp do najnowocześniejszych języków programowania, takich jak Cobol Ruby lub Haskell lub cokolwiek zechcesz. Mają nawet GolfScript, jeśli uważasz, że jest dobry do manipulacji ciągami (być może nie wiem ...).
Zwycięzca otrzymuje ode mnie 15 punktów reputacji i prawdopodobnie wiele innych punktów od społeczności. Inne dobre odpowiedzi otrzymają 10 punktów, a także punkty od społeczności. Słyszałeś, że punkty są bezwartościowe, ale najprawdopodobniej zastąpią dolary w 2050 roku. Nie zostało to jednak potwierdzone, ale i tak warto zdobyć punkty.
Odpowiedzi:
GolfScript, 59 znaków
Jasne, GolfScript jest świetny do manipulacji ciągami!
GolfScript nie jest tak dobry w obsłudze argumentów I / O lub argumentów wiersza poleceń. Tak więc, program ten oczekuje na otrzymanie wszystkich danych wejściowych poprzez stdin: pierwsza niepusta linia jest uważana za słowo docelowe, podczas gdy pozostałe linie powinny zawierać słownik. W systemie uniksowym możesz uruchomić ten kod, np .:
W moim systemie Ubuntu Linux dane wyjściowe powyższego polecenia są następujące:
Zauważ, że wszystkie słowa są konwertowane na małe litery, a wszelkie duplikaty są eliminowane; dlatego, w przeciwieństwie do twoich danych wyjściowych, moje nie wymienia
Wolf
iwolf
osobno. Na podstawie opisu wyzwania zakładam, że jest to do przyjęcia.Ponadto kod jest bardzo powolny, ponieważ używa dość brutalnej siły i nie stosuje nawet oczywistych optymalizacji, takich jak sprawdzenie, czy długość słowa kandydującego odpowiada długości słowa docelowego ± 1. Mimo to udaje mu się przez pełną, niefiltrowaną
/usr/share/dict/words
listę w ... um ... Dam ci znać, kiedy się skończy, OK?Edycja: OK, zajęło to około 25 minut, ale zakończyło się.
źródło
Bash + coreutils, 99 bajtów
Albo całkowicie źle zrozumiałem pytanie (odpowiedź @ lambruscoAcido daje bardzo różne wyniki ), albo jest to dość prosta aplikacja wyrażenia regularnego:
Wynik:
źródło
${a:b:c}
robisz?b
doc
zmienneja
c
rozpoczynający się od pozycjib
(od zera) od zmienneja
. Rozszerzenie ciągu jest jednym z rozszerzeń parametru bashPython 3, 291 znaków
Bardzo proste, a zatem niezbyt sprytne. Ale z dużą plątaniną generatora i zoptymalizowaną powolnością. Ponieważ nie chcesz pozostawić przydzielonego czasu obliczeniowego nieużywanego, prawda?
źródło
l=len
i dodatkowor=range
ograniczyć te funkcje.Scala -
403130[Zaktualizowano]: całkowicie zaktualizowany, ponieważ poprzednie rozwiązanie pozwalało również na permutowane litery. Nie używa wyrażeń regularnych ani żadnych wbudowanych narzędzi.
Nie golfowany:
Stosowanie:
źródło
atechny
nie zmienia jednej litery. To rozwiązanie robi coś niezwiązanego z pytaniem.Python, 174 znaków:
Szybko i na temat.
Przykład:
Wynik:
Podejrzewam, że plik słów OS X zawiera po prostu więcej wpisów.
źródło
golf'
.golf'
, zostanie wydrukowany.Haskell - 219
źródło
Rebol - 213
Niegolfowany (z kilkoma komentarzami):
Przykład użycia (przetestowany w Rebol 3 na OS X Lion):
Poniżej znajduje się
parse
reguła stworzona w celu dopasowania podobnych słów do golfa :źródło
Python (103):
Myślę, że całkiem wydajne. Lubię też, jak dobrze grało w golfa w Pythonie.
źródło