m | Y bR | ain to We | iRd. F (o) RT (h) E La | sT fi (v) e YE | ars O | R s | o, (I) ha | ve C (u) T wO | rds in h (a) lf wh | En (I) s (e) e Th | em. Wh | EN Zacząłem Robić to, to | Ok O MeN | TaL wysiłek - B (u) TI prawie cou (l) nie nie N (o) T d | o it. N (o) w, I d | o to z tyłu głowy, a (n) d ledwie nie | en nie | iCe it. Myślałem jednak, że to będzie duże wyzwanie.
Definicje
Za to wyzwanie każda litera otrzymuje punktową ocenę opartą na mojej ocenie jej szerokości czcionką bezszeryfową. Użyjesz tej szerokości, aby pokroić słowo na dwie połowy o jednakowej szerokości. Znaki, których użyje to wyzwanie, to alfabet pisany małymi i dużymi literami, apostrof i łącznik.
Width Characters
1 i l I '
2 f j r t -
3 a b c d e g h k n o p q s u v x y z
4 m w A B C D E F G H J K L N O P Q R S T U V X Y Z
5 M W
Dla moich wyjaśnień i przypadków testowych |
oznacza miejsce, w którym słowo może być czysto podzielone na pół. (
i)
po obu stronach litery wskazuj, że ta litera zostanie podzielona na pół, aby utworzyć czysty podział.
Wejście
Dane wejściowe będą składać się z jednego „słowa” (które nie musi znajdować się w słowniku). Możesz wziąć to słowo w dowolny sposób, jaki chcesz wprowadzić (ciąg znaków, tablica znaków itp.). To słowo będzie zawierać tylko litery '
i-
(patrz powyższa tabela). Ze względu na to, co zrobisz z tym słowem (patrz poniżej), przypadek wprowadzenia danych zależy od autora. W razie potrzeby dozwolone są końcowe znaki nowej linii.
Zadanie
Permutuj przez wszystkie formy wprowadzania (wszystkie litery we wszystkich możliwych pozycjach wielkich i małych liter). Na przykład dla danych wejściowych it's
poniżej podano wszystkie permutacje:
it's
it'S
iT's
iT'S
It's
It'S
IT's
IT'S
Aby podzielić permutację słowa na pół, punkty po jednej stronie słowa muszą być takie same jak punkty po drugiej stronie słowa. Jeśli jednak list utknie pomiędzy dwiema równymi sekcjami, możesz go również przeciąć na pół.
Pamiętaj, że „połowa” nie oznacza, że przeszedłeś w połowie do łańcucha. „Połowa” oznacza, że punkty po obu stronach są równe.
Przykłady:
W
wynosi 5 punktów. i
wynosi 1 punkt. Podział permutacji Wiiiii
na pół spowoduje W | iiiii
5 punktów z każdej strony |
.
T
wynosi 3 punkty. Podział permutacji TTTT
na pół spowoduje TT | TT
6 punktów po każdej stronie |
.
w
wynosi 4 punkty. a to 3 punkty. Podział permutacji waw
na pół da w (a) w
5,5 punktów z każdej strony. Punkty z a
są rozdzielane na obie strony, podobnie jak a
podzielone na pół.
Wynik
Dane wyjściowe są liczbą całkowitą liczby unikatowych kombinacji danych wejściowych, które można jednoznacznie podzielić na pół. W razie potrzeby dozwolone są końcowe znaki nowej linii.
Przypadki testowe
Będę wyprowadzać wszystkie prawidłowe permutacje danych wejściowych dla przypadków testowych. Pamiętaj, że to nie jest część specyfikacji dla Ciebie.
Na moim pośrednim wyjściu liczby wskazują wartość punktową litery nad nimi, więc wynik jest nieco łatwiejszy do zwizualizowania.
Input: a
( a )
3
( A )
4
Output: 2
Input: in
Output: 0
Input: ab
A | B
4 4
a | b
3 3
Output: 2
Input: abc
A ( B ) C
4 4 4
A ( b ) C
4 3 4
a ( B ) c
3 4 3
a ( b ) c
3 3 3
Output: 4
Input: will
W ( I ) L l
5 1 4 1
W ( I ) l L
5 1 1 4
W ( i ) L l
5 1 4 1
W ( i ) l L
5 1 1 4
w I | L l
4 1 4 1
w I | l L
4 1 1 4
w i | L l
4 1 4 1
w i | l L
4 1 1 4
Output: 8
Input: stephen
S T E ( P ) H E N
4 4 4 4 4 4 4
S T E ( p ) H E N
4 4 4 3 4 4 4
S T E | p h e n
4 4 4 3 3 3 3
S T e ( P ) H E n
4 4 3 4 4 4 3
S T e ( P ) H e N
4 4 3 4 4 3 4
S T e ( P ) h E N
4 4 3 4 3 4 4
S T e ( p ) H E n
4 4 3 3 4 4 3
S T e ( p ) H e N
4 4 3 3 4 3 4
S T e ( p ) h E N
4 4 3 3 3 4 4
S t E ( P ) H e n
4 2 4 4 4 3 3
S t E ( P ) h E n
4 2 4 4 3 4 3
S t E ( P ) h e N
4 2 4 4 3 3 4
S t E ( p ) H e n
4 2 4 3 4 3 3
S t E ( p ) h E n
4 2 4 3 3 4 3
S t E ( p ) h e N
4 2 4 3 3 3 4
S t e ( P ) h e n
4 2 3 4 3 3 3
S t e p | H E N
4 2 3 3 4 4 4
S t e ( p ) h e n
4 2 3 3 3 3 3
s T E ( P ) H E n
3 4 4 4 4 4 3
s T E ( P ) H e N
3 4 4 4 4 3 4
s T E ( P ) h E N
3 4 4 4 3 4 4
s T E ( p ) H E n
3 4 4 3 4 4 3
s T E ( p ) H e N
3 4 4 3 4 3 4
s T E ( p ) h E N
3 4 4 3 3 4 4
s T e ( P ) H e n
3 4 3 4 4 3 3
s T e ( P ) h E n
3 4 3 4 3 4 3
s T e ( P ) h e N
3 4 3 4 3 3 4
s T e ( p ) H e n
3 4 3 3 4 3 3
s T e ( p ) h E n
3 4 3 3 3 4 3
s T e ( p ) h e N
3 4 3 3 3 3 4
s t E ( P ) h e n
3 2 4 4 3 3 3
s t E p | H E N
3 2 4 3 4 4 4
s t E ( p ) h e n
3 2 4 3 3 3 3
s t e P | H E N
3 2 3 4 4 4 4
s t e p | H E n
3 2 3 3 4 4 3
s t e p | H e N
3 2 3 3 4 3 4
s t e p | h E N
3 2 3 3 3 4 4
Output: 37
Input: splitwords
S P L I T | W O r d s
4 4 4 1 4 5 4 2 3 3
<snip>
s p l i t w | o R d S
3 3 1 1 2 4 3 4 3 4
Output: 228
Input: 'a-r
' a ( - ) R
1 3 2 4
' a | - r
1 3 2 2
Output: 2
Input: '''''-
' ' ' ( ' ) ' -
1 1 1 1 1 2
Output: 1
Zwycięstwo
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach. Musisz być w stanie wydrukować wszystkie przypadki testowe (czyli wszystkie dane wejściowe do 10 znaków) w rozsądnym czasie. Nie ograniczaj sztucznie wkładu.
Hojność
Nie wiem, czy jest to możliwe. Jesteś jednak golfistą - zrobisz wszystko dla przedstawiciela. Oferuję nagrodę za 200 powtórzeń (rozpocznę ją, gdy ten warunek nagrody zostanie spełniony, ponieważ wydaje mi się to w zasadzie niemożliwe) za program, który generuje prawidłowe wyjście antidisestablishmentarianism
w czasie krótszym niż 15 sekund na przeciętnym komputerze (czyli moim). Należy pamiętać, że ten przypadek testowy nie może być w żaden sposób zakodowany na stałe.
@DigitalTrauma zmiażdżył moją nagrodę, dochodząc znacznie poniżej dwóch sekund. Sprawdź jego odpowiedź tutaj .
antidisestablishmentarianism
(bez golfa) to83307040
(i dopasowanie wszystkich przypadków testowych), ale na moim laptopie zajmuje ~ 37 sekund (nieważne, że jest to Python). Czy ktoś też ma na to wpływ?Odpowiedzi:
Pyth ,
75747370 bajtówWypróbuj online!
Na miłość boską, proszę nawet nie próbuj
antidisestablishmentarianism
tłumaczyć. Rozbijesz to.Wyjaśnienie
Podzielmy ten kod na części X.
Pierwsza część: generowanie obudowanych wersji i mapowanie na wartości
Wyjaśnijmy tutaj. W żadnej części procesu litery nie są wielkie. Musimy tylko odwzorować jedną literę na dwie wartości (i znaki interpunkcyjne na jedną wartość), bez potrzeby ich wielkich liter. Będziemy decydować, dla których znaków będziemy potrzebować dwóch wartości, a dla których znaków będziemy potrzebować jedną:
Jak widać, nawet pierwsza część jest za długa.
Pierwsza wartość dotyczy wersji z małymi literami, która obejmuje
'
i-
. Druga wartość dotyczy wersji z dużymi literami, z'
i-
nie będzie pobierana.Pierwsza wartość:
Pierwszy ciąg zawiera
"mw"
indeks 0. Ma wartość 4, co wyjaśnia potrzebę logicznego lub. Zauważ, że Pyth używa indeksowania 0. Również przestrzeń przed nią4
ma ją oddzielić1
.Druga wartość (wielkie litery):
Jeśli
d
tak"i"
, to daje1
pierwszy krok. W przeciwnym razie trwa. Jeślid
jest"m"
lub"w"
, to trzeci krok daje1
, który jest dodawany4
do dać5
. Jeślid
nie"m"
lub"w"
, to trzeci krok daje0
, który dodaje się4
do dawania4
.Druga część: wykonanie pracy
Jest to dodawane do pierwszej części, która technicznie nie jest oddzielona od drugiej części (jest to nadal jedno polecenie). Tak więc wartość z pierwszej części jest przekazywana w prawo.
Podsumowanie: w pierwszej części zamapowaliśmy litery na ich możliwe wartości (małe i wielkie litery dla liter, tylko jedna wartość dla dwóch znaków interpunkcyjnych). Do wejścia
"ab"
dostaniemy jeden[[3,4],[3,4]]
.Aby wygenerować różne wersje w obudowach (co powinno być zrobione w pierwszej części, ale to by się przepełniło), używamy produktu kartezjańskiego wielokrotnie, a następnie spłaszczamy wynik. Problemy pojawiają się, gdy jest tylko jedna litera (pierwsza przypadek testowy), ponieważ iloczyn kartezjański nie dałby nam tablicy, a polecenie spłaszczenia (
.n
) zostało przepełnione, aby dać dziwne wyniki liczbom. Zobaczymy, jak obejdę ten problem.Jeśli jest to podział na środek
|
, wówczas prefiks miałby podwójną sumę będącą sumą sumy.Jeśli zostanie podzielone
()
, suma prefiksu podwojona minus wartość w nawiasach będzie sumą sumy.źródło
c, 378 bajtów; około 0,6s dla
antidisestablishmentarianism
Zaktualizowana odpowiedź . Czytałem @ komentarzu JonathanAllan chodzi o
i
s, a na początku nie rozumiałem tej optymalizacji, ale teraz widzę, że skoro obojei
iI
mają szerokość 1, wtedy możemy liczyć związane permutacji dwukrotnie tylko konieczności sprawdzania raz. Wcześniej moje rozwiązanie wykorzystywało wiele wątków, aby rozłożyć obciążenie na wiele procesorów, dzięki czemu mogłem prawie przejść przez wszystkie 28 możliwości na moim komputerze. Teraz zi
optymalizacją nie ma potrzeby mieszania się z wątkami - pojedynczy wątek łatwo wykonuje zadanie w ograniczonym czasie.Bez dodatkowej funkcji golfa c:
Funkcja rekurencyjna
f
przyjmuje 3 parametry - wskaźnik do ciągu wejściowego, długość ciągu i przesunięcie w ciągu, aby rozpocząć przetwarzanie (powinno być 0 dla wywołania najwyższego poziomu). Funkcja zwraca liczbę permutacji.Wypróbuj online . Wydaje się, że TIO zwykle przebiega przez wszystkie przypadki testowe (w tym
antidisestablishmentarianism
w czasie poniżej 2 sekund.Należy zauważyć, że istnieją pewne unprintables w ciąg, który jest
bcopy()
ed dom[]
. Wygląda na to, że TIO obsługuje je poprawnie.Nie golfowany:
Mam MacBooka Pro z połowy 2015 roku z systemem MacOS 10.12.4. Kompilator jest domyślnym językiem MacOS. Kompiluję z:
Uruchamianie wszystkich przypadków testowych, w tym
antidisestablishmentarianism
daje:Nie jest to bynajmniej optymalne. Algorytm po prostu brutalnie przebija wszystkie możliwości (modulo
i
- patrz komentarze powyżej) i zlicza słowa, które można podzielić według kryteriów.źródło
i
,-
,'
,l
,mw
,fjrt
, iabcdeghknopqsuvxyz
, ale to zajęłoby stosowania Pólya wyliczenie twierdzenie (lub równoważna kombinatoryczna metoda wyliczenia), w której nie jestem dobrze zorientowany.JavaScript (ES6),
199169167 bajtówOczekuje, że ciąg wejściowy pisany małymi literami. Za wolno na nagrodę.
Przypadki testowe
Pokaż fragment kodu
źródło
C,
403394 bajtów,Dzięki, Kevin!
Wypróbuj online
Nieskluczony kod:
źródło
f(char* w, int l){
f(char*w,int l){