Odwróć metodę formatowania.
Format
Metoda klasy String (lub equivallent, takich jak sprintf
) jest dostępny w większości języków. Zasadniczo wymaga ciągu „Format”, który może zawierać symbole zastępcze z dodatkowym formatowaniem oraz zero lub więcej wartości do wstawienia zamiast tych symboli zastępczych.
Twoim zadaniem jest zaimplementowanie funkcji odwrotnej w wybranym języku.
API
Nazwa metody powinny być format1
albo deformat
.
Dane wejściowe : 1. parametrem będzie ciąg „Format”, podobnie jak w oryginalnej metodzie formatowania. Drugi parametr będzie analizowanym ciągiem (patrz przykłady poniżej). Żadne inne parametry nie są potrzebne ani dozwolone.
Dane wyjściowe : tablica (lub odpowiednik wybranego języka) wartości, które zostały wyodrębnione odpowiednio z symbolami zastępczymi w formacie.
Symbole zastępcze są {0}
, {1}
, {2}
, etc.
W przypadku złego formatu możesz zgłosić błąd lub zwrócić cokolwiek zechcesz.
W przypadku nieprawidłowych danych wejściowych możesz zgłosić błąd lub zwrócić cokolwiek zechcesz. Nieprawidłowy wejście jest taka, że nie mogą być generowane przez String.Format przy użyciu tego samego formatu znaków, na przykład: '{0}{0}', 'AAB'
.
Przykłady
deformat('{0} {1}', 'hello world') => ['hello', 'world']
deformat('http{0}://', 'https://') => ['s']
deformat('http{0}://', 'http://') => [''] // array of one item which is an empty string
deformat('{0}{1}{0}', 'ABBA') => ['A', 'BB']
Dwuznaczność
W przypadku niejasności możesz zwrócić dowolną odpowiednią odpowiedź. Na przykład:
deformat('{0} {1}', 'Edsger W. Dijkstra')
// both ['Edsger', 'W. Dijkstra'] and ['Edsger W.', 'Dijkstra'] are applicable.
Więcej zasad
- Aby to ułatwić, nie ma potrzeby obsługi formatowania. Możesz zapomnieć o wiodących zerach, kropkach dziesiętnych lub problemach z zaokrąglaniem. Po prostu wygeneruj wartości jako ciągi.
- Aby uczynić to nietrywialnym, Wyrażenia regularne są niedozwolone .
- Nie trzeba dbać o klamrami na wejściu (czyli parametr 2-ty wejście nie będzie zawierać żadnych
{
s lub}
s).
Zwycięski
To jest golf golfowy ! (należy czytać jako „To jest Sparta!”) wygrywa poprawna funkcja o najkrótszej długości. Standardowe luki są zabronione.
deformat('{0}{1}{0}', 'ABBA') => ['A', 'BB']
, co jeśli otrzymalibyśmy zamiast tegodeformat('{0}{1}{0}', 'AAAA')
?['', 'AAAA']
,['A', 'AA']
,['AA', '']
deformat('{0}{1}{0}', 'ABBA') => ['', 'ABBA']
? Jeśli tak, istnieje tanie rozwiązanie, chyba że każdy ciąg pojawi się co najmniej dwa razy.deformat('{0}_{1}_{0}', 'A_BB_A')
?Odpowiedzi:
Haskell, 220 znaków
Łamie się, jeśli używasz wielu reprezentacji dla tego samego wzorca (
{1}
vs{01}
) - nie wymusza ich równości, odrzucając dopasowania dla wszystkich reprezentacji oprócz jednej.Można zapisać 19 znaków, pomijając,
mapKeys((0+).read)$
jeśli prawidłowe uporządkowanie dopasowań powyżej 10 wzorców nie ma znaczenia, lub może być wymagane wypełnienie do tej samej długości, lub jeśli dopuszczalne jest uporządkowanie wzorców łańcuchów. W każdym razie, jeśli wzorzec zostanie pominięty w pierwszym argumencie, zostanie również pominięty w wyniku.Usunięcie
!!0
z końca powodujeformat1
zwrócenie listy wszystkich rozwiązań, a nie tylko pierwszego.przed golfem:
źródło
read
pozostawia niejednoznaczny typ. Haskell nie wie, jaki typ zamówienia ma odczytać klucze.+0
wymusza liczbę, z której Haskell jest już w stanie dokonać arbitralnego wyboru i wybiera liczby całkowite.Ruby, 312 znaków
Można zapisać 5 znaków, preferując dopasowania o zerowej długości, co stanowi
ABBA
rozwiązanie['', 'ABBA']
zamiast preferowanego rozwiązania pytania. Wybrałem interpretację przykładów jako dorozumianą część specyfikacji.źródło
Python, 208 znaków, choć niekompletny.
Funkcja zamiata oba ciągi jednocześnie, aż znajdzie nawias otwierający w ciągu wejściowym, co oznacza symbol zastępczy.
Następnie zakłada, że symbol zastępczy został już rozwinięty, i próbuje przesunąć indeks ciągu wyjściowego obok niego, przeglądając listę znalezionych do tej pory wartości.
Jeśli nie został rozwinięty, dodaje nowy wpis do listy wartości i rozpoczyna dodawanie znaków z ciągu wyjściowego, dopóki nie osiągnie znaku po symbolu zastępczym w ciągu wejściowym.
Gdy dojdzie do końca ciągu wejściowego, zwraca znalezione do tej pory wartości.
Działa dobrze w przypadku prostych danych wejściowych, ale ma wiele problemów:
Wymaga znanego separatora po każdym symbolu zastępczym w danych wejściowych, więc nie działa z symbolami zastępczymi obok siebie, tj. „{0} {1}”. Dlatego musiałem dodać znak spacji do obu łańcuchów.
Zakłada, że pierwsze wystąpienia każdego symbolu zastępczego są w porządku, np. „{ 0 } { 1 } {1} {0} { 2 }”.
Działa tylko dla pierwszych 10 symboli zastępczych, ponieważ zakłada, że wszystkie mają 3 znaki.
W ogóle nie obsługuje niejednoznacznych przypadków :(
źródło
Kod C ++ 11, 386 znaków
Funkcja format1 ma 2 ciągi wejściowe (const char *) i zwraca skrót z kluczami całkowitymi (wzorzec), a wartością jest zidentyfikowany ciąg. Jeśli nic nie zostanie znalezione lub wystąpi błąd, zwracana jest pusta mapa.
Stosowanie:
Wynik:
Przykład 2:
Wynik:
Wzory są w postaci dziesiętnej, dane wejściowe większe niż
MAXINT
zostaną przepełnione, ale nadal działa.Mimo że istnieją inne rozwiązania w innych językach programowania, jest to najmniejszy C ++ - jak dotąd! :)
Oto kod przed golfem:
źródło