m | Y bR | ain ist We | iRd. F (o) RT (h) E La | sT fi (v) e JAHRE O | R s | o, (I) C (u) T wO | rds in h (a) lf wh | En (I) s (e) e | em. WENN ICH BEGANN, ES ZU TUN, UM EINE MENSCHLICHE ANSTREBUNG ZU MACHEN - B (u) T Ich konnte (l) nicht N (o) T d | o es. N (o) w, ich habe es in meinem Hinterkopf getan, und ich habe es kaum geglaubt, es nicht zu tun. Ich dachte jedoch, dass dies eine große Herausforderung sein würde.
Definitionen
Für diese Herausforderung erhält jeder Buchstabe eine Punktzahl, basierend auf meiner Einschätzung der Breite in einer serifenlosen Schrift. Mit dieser Breite schneiden Sie ein Wort in zwei gleich breite Hälften. Die Zeichen, die diese Herausforderung verwenden wird, sind das Alphabet in Groß- und Kleinbuchstaben, Apostroph und Bindestrich.
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
|
Bezeichnet für meine Erklärungen und Testfälle die Stelle, an der ein Wort sauber in zwei Hälften geteilt werden kann. (
und )
auf jeder Seite eines Buchstabens geben Sie an, dass dieser Buchstabe in zwei Hälften geteilt wird, um eine saubere Trennung zu erzielen.
Eingang
Die Eingabe besteht aus einem einzelnen "Wort" (das nicht im Wörterbuch enthalten sein muss). Sie können dieses Wort in einer beliebigen Texteingabe verwenden (Zeichenfolge, Zeichen-Array usw.). Dieses Wort enthält nur die Buchstaben '
, und -
(siehe Tabelle oben). Aufgrund dessen, was Sie mit diesem Wort tun (siehe unten), liegt die Entscheidung über die Eingabe beim Entwickler. Nachgestellte Zeilenumbrüche sind bei Bedarf zulässig.
Die Aufgabe
Permutieren Sie durch alle Formen der Eingabe (alle Buchstaben an allen möglichen Groß- oder Kleinbuchstaben). Für die Eingabe it's
sind zum Beispiel alle folgenden Permutationen:
it's
it'S
iT's
iT'S
It's
It'S
IT's
IT'S
Um eine Permutation eines Wortes in zwei Hälften zu teilen, müssen die Punkte auf einer Seite des Wortes mit den Punkten auf der anderen Seite des Wortes übereinstimmen. Wenn ein Buchstabe jedoch zwischen zwei geraden Abschnitten steckt, können Sie einen Buchstaben auch sauber in zwei Hälften schneiden.
Bitte beachten Sie, dass "halb" nicht bedeutet, dass Sie sich auf halber Strecke in der Saite befinden. "Halb" bedeutet, dass die Punkte auf beiden Seiten gleich sind.
Beispiele:
W
beträgt 5 Punkte. i
ist 1 Punkt. Wenn Sie die Permutation Wiiiii
in zwei Hälften teilen W | iiiii
, erhalten Sie 5 Punkte auf jeder Seite des |
.
T
beträgt 3 Punkte. Wenn Sie die Permutation TTTT
in zwei Hälften teilen TT | TT
, erhalten Sie 6 Punkte auf jeder Seite des |
.
w
beträgt 4 Punkte. a ist 3 Punkte. Wenn Sie die Permutation waw
in zwei Hälften teilen w (a) w
, erhalten Sie 5,5 Punkte auf jeder Seite. Die Punkte von a
werden auf beide Seiten verteilt, da a
sie in zwei Hälften geteilt werden.
Ausgabe
Ihre Ausgabe ist eine ganze Zahl der Anzahl eindeutiger Permutationen der Eingabe, die sauber in zwei Hälften geteilt werden können. Nachgestellte Zeilenumbrüche sind bei Bedarf zulässig.
Testfälle
Ich werde alle gültigen Permutationen der Eingabe für die Testfälle ausgeben. Denken Sie daran, dass dies für Sie nicht Teil der Spezifikationen ist.
In meiner Zwischenausgabe geben die Zahlen den Punktwert des darüber liegenden Buchstabens an, sodass die Ausgabe etwas einfacher zu visualisieren ist.
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
Sieg
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes. Sie müssen in der Lage sein, alle Testfälle (also alle Eingaben mit bis zu 10 Zeichen) in angemessener Zeit auszugeben. Begrenzen Sie Ihre Eingabe nicht künstlich.
Kopfgeld
Ich weiß nicht, ob dies möglich ist. Sie sind jedoch Golfer - Sie werden alles für die Wiederholung tun. Ich biete ein Kopfgeld für 200 Wiederholungen (ich starte es, sobald diese Kopfgeldbedingung erfüllt ist, da es mir im Grunde unmöglich erscheint) für ein Programm an, das antidisestablishmentarianism
auf einem durchschnittlichen Computer (auch bekannt als meiner) die korrekte Ausgabe für weniger als 15 Sekunden ausgibt . Bitte beachten Sie, dass dieser Testfall in keiner Weise fest codiert sein darf.
@DigitalTrauma zerquetschte mein Kopfgeld und kam in weniger als zwei Sekunden. Schauen Sie sich seine Antwort hier .
antidisestablishmentarianism
(nicht-golfen) ist83307040
(und entspricht allen Testfällen), aber es dauert ~ 37 Sekunden auf meinem Laptop (wohlgemerkt, es ist Python). Hat jemand auch eine Zählung dafür?Antworten:
Pyth ,
75747370 BytesProbieren Sie es online!
Bitte versuchen Sie es nicht einmal
antidisestablishmentarianism
im Dolmetscher , um Gottes Willen . Sie werden es zum Absturz bringen.Erläuterung
Lassen Sie uns diesen Code in X Teile zerlegen.
Der erste Teil: Generieren von Gehäuseversionen und Zuordnen zu den Werten
Lassen Sie uns hier klar sein. In keinem Teil des Prozesses werden Briefe mit Großbuchstaben geschrieben. Wir müssen nur einen Buchstaben auf zwei Werte abbilden (und die Interpunktionszeichen auf einen Wert), ohne sie großschreiben zu müssen. Wir werden entscheiden, für welche Zeichen wir zwei Werte benötigen und für welche Zeichen wir einen benötigen:
Wie Sie sehen, ist sogar der erste Teil zu lang.
Der erste Wert gilt für die Kleinbuchstabenversion, einschließlich
'
und-
. Der zweite Wert ist für die Großbuchstabenversion'
und-
wird nicht verwendet.Der erste Wert:
Die erste Zeichenfolge enthält den
"mw"
Index 0. Sie hat den Wert 4, was die Notwendigkeit des logischen oder erklärt. Beachten Sie, dass Pyth die 0-Indizierung verwendet. Auch der Raum vor dem4
soll ihn trennen1
.Der zweite Wert (Großbuchstaben):
Wenn
d
ja"i"
, dann gibt es1
den ersten Schritt. Ansonsten geht es weiter. Wennd
ist"m"
oder"w"
, dann gibt der dritte Schritt an1
, was4
zu geben ist5
. Wennd
nicht"m"
oder"w"
, dann gibt es den dritten Schritt0
, der4
zum Geben hinzugefügt wird4
.Der zweite Teil: die Arbeit erledigen
Dies wird dem ersten Teil vorangestellt, der technisch nicht vom zweiten Teil getrennt ist (es ist immer noch ein Befehl). Der Wert aus dem ersten Teil wird also nach rechts übergeben.
Fazit: Im ersten Teil haben wir die Buchstaben auf ihre möglichen Werte abgebildet (Klein- und Großbuchstaben, nur ein Wert für die beiden Interpunktionszeichen). Für Input
"ab"
würde man bekommen[[3,4],[3,4]]
.Um die verschiedenen Gehäuseversionen zu generieren (was im ersten Teil hätte geschehen sollen, aber das würde überlaufen), verwenden wir wiederholt das kartesische Produkt und reduzieren dann das Ergebnis. Probleme treten auf, wenn es nur einen Buchstaben gibt (erster Testfall), weil das kartesische Produkt uns kein Array geben würde und der Befehl flatten (
.n
) übergelaufen ist, um seltsame Ergebnisse für Zahlen zu liefern. Wir werden sehen, wie ich dieses Problem umgangen habe.Wenn es sich um eine Aufteilung in der Mitte von handelt
|
, würde das Präfix die Summe verdoppeln und die Summe der Gesamtsumme ergeben.Wenn es durch geteilt wird
()
, ist die verdoppelte Präfixsumme abzüglich des Werts in Klammern die Summe der Gesamtsumme.quelle
c, 378 Bytes; etwa 0,6 s für
antidisestablishmentarianism
Aktualisierte Antwort . Ich habe @ JonathanAllans Kommentar über
i
s gelesen , und zuerst habe ich diese Optimierung nicht verstanden, aber jetzt sehe ich, dass beidei
undI
eine Breite von 1 haben. Dann können wir die zugehörigen Permutationen zweimal zählen, wobei wir nur einmal validieren müssen. Zuvor verwendete meine Lösung mehrere Threads, um die Last auf mehrere CPUs zu verteilen, und damit war ich in der Lage, alle 2 28 Möglichkeiten auf meiner Maschine zu durchlaufen . Dank deri
Optimierung müssen Sie sich nicht mehr mit Threads herumschlagen - ein einziger Thread erledigt die Aufgabe problemlos innerhalb der Zeitbeschränkung.Ohne weiteres golfen c Funktion:
Die rekursive Funktion
f
benötigt 3 Parameter - einen Zeiger auf die Eingabezeichenfolge, die Zeichenfolgenlänge und den Offset in der Zeichenfolge, um die Verarbeitung zu starten (sollte für den Aufruf der obersten Ebene 0 sein). Die Funktion gibt die Anzahl der Permutationen zurück.Probieren Sie es online aus . TIO scheint in der Regel alle Testfälle zu durchlaufen (auch
antidisestablishmentarianism
in weniger als 2 Sekunden).Beachten Sie, dass es einige unprintables in der Zeichenfolge, die sich
bcopy()
auf edm[]
. Das TIO scheint damit richtig umzugehen.Ungolfed:
Ich habe ein MacBook Pro Mitte 2015, auf dem MacOS 10.12.4 ausgeführt wird. Der Compiler ist der Standard-MacOS-Clang. Ich kompiliere mit:
Ausführen aller Testfälle, einschließlich
antidisestablishmentarianism
:Dies ist keineswegs optimal. Der Algorithmus zwingt sich einfach durch alle Möglichkeiten (Modulo
i
- siehe Kommentare oben) und zählt die Wörter, die nach den Kriterien aufgeteilt werden können.quelle
i
,-
,'
,l
,mw
,fjrt
, undabcdeghknopqsuvxyz
, aber es wäre eine Anwendung der nehmen Pólya Aufzählung Theorem (oder eine äquivalente kombinatorische Aufzählungsmethode), mit der ich mich nicht auskenne.JavaScript (ES6),
199169167 BytesErwartet die Eingabezeichenfolge in Kleinbuchstaben. Zu langsam für das Kopfgeld.
Testfälle
Code-Snippet anzeigen
quelle
C,
403394 Bytes,Vielen Dank, Kevin!
Probieren Sie es online aus
Ungolfed-Code:
quelle
f(char* w, int l){
f(char*w,int l){