Cel
Z Wikipedii :
Akronim rekurencyjny to akronim, który odnosi się do siebie w wyrażeniu, za którym stoi.
Twoim celem jest sprawdzenie, czy łańcuch jest akronimem rekurencyjnym.
- Akronim to pierwsze słowo
- W słowach nie jest rozróżniana wielkość liter, oddzielone pojedynczym odstępem.
- Podany ciąg nie zawiera interpunkcji ani apostrofu.
- Tylko pierwsza litera każdego słowa może być częścią akronimu.
Musisz także podać słowa funkcyjne . Dla uproszczenia każde słowo można uznać za słowo funkcyjne.
Przykład
f("RPM Package Manager") => { true, [] }
f("Wine is not an emulator") => { true, ["an"] }
f("GNU is not Unix") => { true, ["is"] }
f("Golf is not an acronym") => { false }
f("X is a valid acronym") => { true, ["is","a","valid","acronym"] }
Możesz podać pełny program lub funkcję.
Łańcuch wejściowy można pobrać z STDIN lub jako argument funkcji.
Wynik może być prawdziwy / fałszywy, 0/1, tak / nie ...
Lista słów funkcyjnych (każdy format listy jest poprawny) musi być podana tylko wtedy, gdy jest to rekurencyjny akronim (nawet jeśli lista jest pusta) . Nie musisz zachowywać wielkich liter słów funkcyjnych.
Kryteria wygranej
To jest golf golfowy , najkrótszy kod wygrywa.
Odpowiedzi:
GolfScript,
5150 znakówPrawdopodobnie można go jeszcze pograć w golfa. Pobiera dane wejściowe na STDIN. Wartość logiczna to 0/1.
Przetestuj online
Wyjaśnienie:
źródło
Regex, smak .NET, 62 bajty
Możesz to przetestować tutaj . Jeśli dane wejściowe są akronimem rekurencyjnym, spowoduje to dopasowanie, a grupa przechwytywania
w
będzie zawierać wszystkie słowa funkcyjne. Jeśli tak nie jest, to nie będzie dopasowania.Pozwala to zachować wielkie litery słów funkcyjnych (ale bez rozróżniania wielkości liter).
Niestety tester nie wyświetla całego stosu nazwanej grupy przechwytywania, ale jeśli użyjesz jej w dowolnym miejscu w .NET,
w
grupa będzie zawierać wszystkie słowa funkcyjne w kolejności.Oto fragment kodu C #, aby udowodnić, że:
Oto krótkie wyjaśnienie. Korzystam z grup równoważących .NET do zbudowania stosu liter akronimu w nazwanej grupie
c
, za pomocą tego fragmentuSztuczka polega na tym, że potrzebuję drugiej litery na górze stosu i ostatniej na dole. Umieściłem to wszystko tak, aby pasowało do pozycji po akronimie. Pomaga to, ponieważ .NET dopasowuje wygląd od prawej do lewej, więc najpierw napotyka ostatnią literę.
Po uzyskaniu stosu dopasowuję resztę łańcucha słowo w słowo. Albo słowo zaczyna się od litery na szczycie stosu akronimów. W takim przypadku usuwam tę literę ze stosu:
W przeciwnym razie i tak dopasowuję to słowo i pcham na
w
stos, który następnie zawiera wszystkie słowa funkcyjne:Na końcu upewniam się, że dotarłem do końca łańcucha,
$
a także upewniłem się, że zużyłem wszystkie litery z akronimu, sprawdzając, czy stos jest pusty:Przetestuj na ideonie.
źródło
Python (158, bez wyrażenia regularnego)
To nie tak, że nie lubię wyrażeń regularnych. Po prostu ich nie znam.
Och, miałem też wersję bez golfa:
źródło
Python 2.7 -
131126 bajtówTworzy listę liter w pierwszym słowie akronimu. Następnie, dla każdego słowa w pełnym ciągu, pozbądź się pierwszego elementu listy, który stworzyliśmy, jeśli jest taka sama jak pierwsza litera tego słowa. W przeciwnym razie dodaj to słowo do listy słów funkcyjnych. Aby wyprowadzić, zwróć
not a
(w pythonie dowolna lista inna niż pusta lista toTrue
-y, a lista jest pusta, jeśli jest to akronim rekurencyjny), a lista ifnot a
.Dzięki @ace za pomoc w naprawieniu błędu / zapisaniu niektórych bajtów.
źródło
SyntaxError: invalid syntax
na końcureturn
linii.for w in s:f+=0*a.pop(0)if a and w[0]==a[0]else[w]
który jest krótszy i nie opiera się na kartach. Co doreturn
oświadczenia, znalazłem0if a else(1,f)
krótszy niż twój oryginał.Python - 154 znaków
Pierwsza w historii próba gry w golfa. Myślę, że Python nie jest najlepszym językiem do tego, biorąc pod uwagę wszystkie długie słowa kluczowe. Ponadto nie sądzę, aby ta funkcja była niezawodna. Działa dla wkładu OP, ale jestem pewien, że mógłbym wymyślić wyjątki.
źródło
ECMAScript 6 (105 bajtów):
Wprowadź funkcję w konsoli przeglądarki Firefox, a następnie po prostu wywołaj funkcję w następujący sposób:
źródło
The function words list ... must be given if and only if this is a recursive acronym
. To ostrzeże ich niezależnie.Haskell - 287 bajtów
Nie jest to najkrótszy wpis (hej, to jest Haskell, czego się spodziewałeś?), Ale nadal dużo zabawy w pisaniu.
Testowane z
Oczekiwany wynik
Bez golfa
źródło
JavaScript (ECMAScript 6) - 97 znaków
Testy:
źródło
Rebol - 133
Nie golfowany:
Testowane z:
Wydajność:
źródło
Julia - 116 bajtów
Mniej gra w golfa:
Na
0
końcu wyświetla wynik 0. W przeciwnym razie wyświetla tablicę zawierającą1
słowa funkcyjne. Na przykład:źródło
Brachylog , 29 bajtów
Wypróbuj online!
Wysyła słowa funkcyjne przez zmienną wyjściową, jeśli dane wejściowe są akronimem rekurencyjnym, i kończy się niepowodzeniem, jeśli nie jest.
Bez konieczności wypisywania słów funkcyjnych (traktując to jako czysty problem decyzyjny ), powstaje tylko 12 bajtów, ponieważ
∧Zt
można je pominąć dla -3,Y
można je zastąpić.
przez -1, a co najważniejsze;0zpᵐz{ċ₂ˢ}ᵐZh
można zastąpić⊇
przez a -13:ḷṇ₁Xh.∧X⊇hᵐc
źródło
Kobra - 187
źródło
Rubin - 173
Może być lepiej...
Wywoływanie func:
Wyjście:
źródło
Java - 195
Niestety Java nie ma wbudowanej obsługi krotek.
Jest to klasa przechowująca wartość logiczną w „b” i listę słów funkcyjnych w „x”.
Tutaj funkcja jest konstruktorem klasy.
Test
źródło
string[]
:null
po prostu oznacza fałsz, puste oznacza prawda, an
elementy oznaczają prawda zen
słowami funkcyjnymi.Awk - 145
Test:
źródło
Coffeescript - 144
Nazwij to na przykład:
z "GNU is not Unix"
Skompilowany JS:
Dzieli ciąg na słowa, a następnie zapętla każde słowo. Jeśli pierwszy znak słowa nie pasuje do następnego w akronimie, słowo zostanie zapisane. Licznik (
g
) służy do śledzenia, ile słów zostało pominiętych. Jeśli liczba pominiętych słów plus długość akronimu odpowiada długości frazy, to pasuje, więc zwróć 1 i pominięte słowa. Jeśli nie, to nie jest poprawny, więc zwróć 0.źródło
C # - 234
źródło
Python (108)
źródło