To wyzwanie składa się z dwóch części. Zwycięzcą zostanie rozwiązanie o najniższej całkowitej liczbie bajtów. Do obu wyzwań należy użyć tego samego języka.
Część 1:
Napisz funkcję lub program, który pobiera zdanie zawierające tylko poprawne słowa jako dane wejściowe i wyświetla listę używanych znaków, liczbę przypadków użycia każdej litery oraz liczbę liter w każdym ze słów w oryginalnym zdaniu. Dane wyjściowe z tego programu muszą być poprawnymi danymi wejściowymi do następnego programu (dokładnie tak, jak są wysyłane)
W dalszej części dodam przykłady i szczegółowe zasady.
Część 2:
Napisz funkcję lub program, który pobiera dane wyjściowe z pierwszego programu jako dane wejściowe i wykorzystuje tę listę angielskich słów i odtwarza zdanie z informacjami z danych wyjściowych. Zdanie nie musi być takie samo jak zdanie oryginalne.
Więcej informacji. zasady i ograniczenia:
Część 1:
- Pierwsze wejście może być w dowolnym odpowiednim formacie, ze znakami cudzysłowu lub bez, jako argument funkcji lub ze STDIN, z nawiasami lub bez itp.
- Zdanie wejściowe nie będzie zawierało znaków interpunkcyjnych ani specjalnych, z wyjątkiem kropki / kropki na końcu. Z wyjątkiem symbolu kropki wszystkie znaki na wejściu będą na liście słów.
- Pierwsza litera zdania będzie pisana wielkimi literami, reszta będzie pisana małymi literami.
- Wyjście z części 2 musi zaczynać się od tej samej wielkiej litery, co oryginalne zdanie (więc konwersja tekstu na małe nie jest zalecana (ale OK).
- Dane wyjściowe mogą być w dowolnym odpowiednim formacie:
- Musi istnieć możliwość skopiowania i wklejenia wyjścia bezpośrednio do następnego programu / funkcji
- Podczas wklejania kopii nie można wprowadzać żadnych zmian, całe wyniki należy skopiować i wkleić jako całość, a nie w częściach.
- Możesz na przykład wypisać histogram wszystkich liter w alfabecie lub tylko tych, które zostały użyte (ogólnie wszystko, co jest konieczne do wypełnienia części 2)
- Nie można wypisać listy znaków, w których powtarzanych jest wiele wystąpień. Na przykład,
The queue
nie może dać wyjście:Teeehquu (3,5)
powinno być coś takiego:Tehqu, (1 3 1 1 2),(3 5)
.
Część 2:
- Program / funkcja musi zaakceptować dane wejściowe dokładnie tak, jak w części 1 (jeden wyjątek, patrz komentarz poniżej dotyczący przyjmowania nazwy pliku jako danych wejściowych.).
- Jeśli do przeanalizowania danych wejściowych konieczne są otaczające nawiasy kwadratowe, znaki cudzysłowu itp., Muszą one stanowić część wyniku z części 1.
- Lista słów znajduje się tutaj.
- Listę słów można zapisać lokalnie jako
w.txt
lub pobrać z adresu URL. Adres URL będzie liczył się tylko jako 5 bajtów, więc nie potrzebujesz skracacza adresów URL. - Jeśli program nie może otworzyć plik bez czytania nazwy jako dane wejściowe ze standardowego wejścia (wierzę, że to
znaczybyło w przypadku Pyth co najmniej), a następnie nazwę pliku można traktować jako oddzielną argumentu wejściowego.
- Listę słów można zapisać lokalnie jako
- Wynikiem musi być tylko zdanie (lista prawidłowych słów), kończące się kropką i opcjonalnym znakiem nowej linii.
- Wynik musi zawierać słowa z taką samą liczbą liter jak oryginalne zdanie w części 1 (w odpowiedniej kolejności)
- Wszystkie litery użyte w pierwotnym zdaniu muszą zostać użyte w nowym wyjściu.
- Zdanie musi zaczynać się od tej samej wielkiej litery, co oryginalne zdanie wejściowe i kończyć się kropką.
Obie części:
- Wykonanie żadnej z części nie powinno zająć więcej niż 2 minuty (losowe wybieranie słów do momentu rozwiązania problemu nie jest akceptowane).
Zgodnie z zasadami wymienionymi powyżej powinna istnieć spora szansa na odtworzenie dokładnie tego samego zdania, jednak nie jest to wymagane.
Przykłady:
W poniższych przykładach pokazano kilka różnych formatów wejściowych i wyjściowych. Wiele innych jest akceptowanych.
Część 1:
Wejście:
Zulus win.
Typ wyjścia 1:
Z i l n s u w
1 1 1 1 1 2 1
5 3
Typ wyjścia 2:
(('Z',1),('i',1),('l',1),('n',1),('s',1),('u',2),('w',1)), (5,2)
Typ wyjścia 3:
'Zilnsuuw',[1,1,1,1,1,2,1],[5,2]
Część 2:
Dane wejściowe: dokładna kopia wyniku z części 1. Dane wyjściowe:
Zulus win.
Zauważ, że inne kombinacje słów są akceptowane, o ile zaczynają się od Z
, a pierwsze słowo ma 5 liter, a drugie 3.
Najkrótszy kod w bajtach wygrywa.
f1
które zostały wklejone,f2
muszą zawierać wszystkie dane określone w wyzwaniu. Żadne dodatkowe dane nie mogą być częścią danych wyjściowychf1
. Żadne dane nie mogą być „przechowywane” w celuf1
udostępniania informacji podczas ich wywoływaniaf2
.f1
może przyjmować tylko jeden ciąg jako dane wejściowe na połączenie.Odpowiedzi:
LabVIEW, 166 Prymitywy LabVIEW
Przede wszystkim nie stworzyłem 2 oddzielnych programów, ponieważ Labview wykonuje przepływ danych, więc naprawdę nie ma takiej potrzeby.
Zapisuje histogram z pierwszym elementem = kod ascii reszty pierwszej litery od 1 do 26 razy według kwoty. Długość zostaje po prostu zapisana w tablicy.
Pierwsze słowo ma 3 czeki, pierwszą literę, długość i dostępne litery w histogramie. Sprawdzanie pierwszej litery zatrzymuje się po pierwszym słowie.
Histogram sprawdzam, zmniejszając go dla każdej litery i sprawdzając, czy spadnie poniżej zera.
Jeśli znalazłem moje n-te słowo i nie ma żadnych słów, które można zbudować z pozostałych liter, zacznę usuwać słowa ze słownika i powtarzać n-te słowo i tak dalej, aż znajdę rozwiązanie.
To może, ale nie musi, zadziałać dla zdań, ponieważ ich obliczenie potrwa wieczność (mój przykład zajął już kilka sekund).
Co próbowałem
źródło
Python 2.7, 353 bajty
Niestety nie mogę go przetestować z użyciem rzeczywistego bankomatu pliku w.txt, ponieważ wydaje się, że QPython dla systemu Android nie obsługuje plików we / wy. Działa to z danymi, które skopiowałem i wkleiłem.
Część 1, 76 bajtów
W:
'Hi there.'
Na zewnątrz:
{'H':1, 'i':1, 't':1, 'h':1, 'e':2, 'r':1}, (2, 5)
więc lista zawierająca:
skrót mapy z histogramem
lista listów
Część 2, 277 bajtów
Naprawdę się cieszę, że udało mi się sprawić, aby była w 100% czysta funkcjonalna. Nie jestem pewien, czy to pomaga w prawdziwym golfie, ale z pewnością dobrze zrozumiałem część zaciemniania: D Oto bardziej przyjazna dla człowieka wersja pt. 2 (dokładnie ten sam przepływ, ale z nazwami zmiennych):
źródło
Perl,
516504 bajtówzawiera 2x +1 za
-p
Wymaga posiadania
w.txt
w formacie uniksowym (\n
zakończenia linii). Używacat
do odczytu pliku; zmień natype
na Windows.Zapisz oneliner powyżej
534.pl
i uruchom jakoecho Test. | perl -p 534.pl
.Dość duży, ale to początek - wiele okazji do gry w golfa, ale chciałem go opublikować, aby odpowiedź LabVIEW była mniej samotna ;-). Pominąłem optymalizacje do wykonania poniżej sekundy, oszczędzając ponad 30 bajtów.
Pierwszy fragment (73 bajty):
Tworzy histogram i długość słowa w kompaktowym formacie. Dla danych wejściowych
Zulus win.
generuje wyjście typu 2 bez(,)
, które nie są tutaj konieczne:Oto nieoszlifowany:
Drugi fragment (441 bajtów)
Ta główna część dotyczy we / wy i specjalnego traktowania pierwszej litery, przy użyciu podprogramów
g
ih
wymienionych poniżej.Ta funkcja rekurencyjna pobiera kopię histogramu, kopię pozostałych słów i bieżące słowo. Jeśli tablica długości słowa jest pusta, zwraca wartość true. W przeciwnym razie zmniejsza histogram dla liter w danym słowie, przyjmuje następną długość słowa i znajduje listę odpowiednich słów z listy słów. Dla każdego odpowiedniego słowa powtarza się.
I na koniec podprogram ten otrzymuje słowo i histogram zdania. Oblicza nowy histogram dla tego słowa i sprawdza, czy wszystkie litery nie występują częściej niż dopuszcza to histogram zdania.
Możesz wkleić nieprzypisane fragmenty (
sub i/o/g/h
) w jednym pliku i dołączyć poniższy kod testowy.substr
i parametr dlasub g
.źródło