m | Y bR | ain est 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 J'ai commencé à le faire, ça pour | oK un effort meN | TaL - B (u) TI presque cou (l) pas N (o) T d | o it. N (o) w, je l'ai | à l'arrière de ma tête, un (n) d à peine év | en pas | iCe. Cependant, je pensais que cela ferait un grand défi.
Définitions
Pour ce défi, chaque lettre reçoit un score de points, basé sur mon jugement de sa largeur dans une police sans empattement. Vous utiliserez cette largeur pour couper un mot en deux moitiés de largeur égale. Les caractères que ce défi utilisera sont l'alphabet en minuscules et en majuscules, l'apostrophe et le tiret.
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
Pour mes explications et cas de test, |
désigne l'emplacement dans lequel un mot peut être proprement divisé en deux. (
et )
de chaque côté d'une lettre indiquent que cette lettre sera divisée en deux pour créer une division nette.
Contribution
L'entrée consistera en un seul "mot" (qui ne doit pas nécessairement figurer dans le dictionnaire). Vous pouvez prendre ce mot dans la saisie de texte que vous souhaitez (chaîne, tableau de caractères, etc.). Ce mot ne contiendra que les lettres,, '
et -
(voir le tableau ci-dessus). En raison de ce que vous ferez avec ce mot (voir ci-dessous), le cas de la saisie est laissé à la discrétion du développeur. Les nouvelles lignes de fin sont autorisées si nécessaire.
La tâche
Permutez à travers toutes les formes de saisie (toutes les lettres à toutes les positions majuscules ou minuscules possibles). Par exemple, pour l'entrée it's
, ce qui suit est toutes les permutations:
it's
it'S
iT's
iT'S
It's
It'S
IT's
IT'S
Pour diviser une permutation d'un mot en deux, les points d'un côté du mot doivent être les mêmes que les points de l'autre côté du mot. Cependant, si une lettre est coincée entre deux sections paires, vous pouvez également couper une lettre proprement en deux.
Veuillez noter que «moitié» ne signifie pas que vous vous êtes déplacé à mi-chemin dans la chaîne. "Moitié" signifie que les points des deux côtés sont égaux.
Exemples:
W
est de 5 points. i
est de 1 point. Diviser la permutation Wiiiii
en deux se traduira par W | iiiii
, avec 5 points de chaque côté de la |
.
T
est de 3 points. La division de la permutation TTTT
en deux se traduira par TT | TT
, avec 6 points de chaque côté de la |
.
w
est de 4 points. a est de 3 points. Diviser la permutation waw
en deux se traduira par w (a) w
, avec 5,5 points de chaque côté. Les points de a
sont distribués des deux côtés, comme il a
est divisé en deux.
Production
Votre sortie est un entier du nombre de permutations uniques de l'entrée qui peuvent être proprement divisées en deux. Les nouvelles lignes de fin sont autorisées si nécessaire.
Cas de test
Je produirai toutes les permutations valides de l'entrée pour les cas de test. N'oubliez pas que cela ne fait pas partie des spécifications pour vous.
Dans ma sortie intermédiaire, les chiffres indiquent la valeur en points de la lettre au-dessus d'eux, donc la sortie est un peu plus facile à visualiser.
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
La victoire
C'est le code-golf , donc la réponse la plus courte en octets l'emporte. Vous devez être en mesure de produire tous les cas de test (donc, toutes les entrées jusqu'à 10 caractères) dans un délai raisonnable. Ne limitez pas artificiellement votre entrée.
Prime
Je ne sais pas si cela est possible. Cependant, vous êtes des golfeurs - vous ferez tout pour le représentant. J'offre une prime de 200 répétitions (je vais la démarrer une fois que cette condition de prime est remplie, car cela me semble fondamentalement impossible) pour un programme qui génère la sortie correcte pendant antidisestablishmentarianism
moins de 15 secondes sur un ordinateur moyen (aka le mien). Veuillez noter que ce cas de test ne doit en aucun cas être codé en dur.
@DigitalTrauma a écrasé ma prime, arrivant bien en moins de deux secondes. Découvrez sa réponse ici .
antidisestablishmentarianism
(non-golfy) est83307040
(et correspond à tous les cas de test) mais cela prend ~ 37 secondes sur mon ordinateur portable (attention, c'est Python). Quelqu'un a-t-il également un compte?Réponses:
Pyth ,
75747370 octetsEssayez-le en ligne!
Pour l'amour de Dieu, n'essayez même pas
antidisestablishmentarianism
dans l'interprète. Vous allez le planter.Explication
Décomposons ce code en X parties.
La première partie: génération de versions casées et mise en correspondance avec les valeurs
Soyons clairs ici. Dans aucune partie du processus, les lettres ne sont en majuscules. Nous avons juste besoin de mapper une lettre à deux valeurs (et les signes de ponctuation à une valeur), sans avoir besoin de les mettre en majuscule. Nous déciderons pour quels caractères nous aurons besoin de deux valeurs et pour quels caractères nous en aurons besoin:
Comme vous le voyez, même la première partie est trop longue.
La première valeur est pour la version minuscule, qui inclut
'
et-
. La deuxième valeur est pour la version en majuscule, avec'
et-
ne prendra pas.La première valeur:
La première chaîne contient
"mw"
à l'index 0. Elle a une valeur de 4, ce qui explique la nécessité de la logique ou. Notez que Pyth utilise l'indexation 0. De plus, l'espace avant le4
doit le séparer1
.La deuxième valeur (en majuscule):
Si
d
c'est le cas"i"
, cela donne1
la première étape. Sinon, cela continue. Sid
est"m"
ou"w"
, alors la troisième étape donne1
, qui est ajoutée4
à donner5
. Sid
n'est pas"m"
ou"w"
, alors la troisième étape donne0
, qui est ajoutée4
à donner4
.La deuxième partie: faire le travail
Ceci est ajouté à la première partie, qui n'est techniquement pas séparée de la deuxième partie (il s'agit toujours d'une commande). Ainsi, la valeur de la première partie est passée à droite.
Récapitulation: dans la première partie, nous avons mappé les lettres à leurs valeurs possibles (minuscules et majuscules pour les lettres, une seule valeur pour les deux signes de ponctuation). Pour l'entrée
"ab"
, on obtiendrait[[3,4],[3,4]]
.Pour générer les différentes versions casées (ce qui aurait dû être fait dans la première partie, mais qui déborderait), nous utilisons le produit cartésien à plusieurs reprises, puis aplatissons le résultat. Des problèmes surviennent lorsqu'il n'y a qu'une seule lettre (premier cas de test), car le produit cartésien ne nous donnerait pas de tableau et la commande d'aplatissement (
.n
) déborde pour donner des résultats étranges aux nombres. Nous verrons comment j'ai contourné ce problème.S'il s'agit d'une scission au milieu par
|
, alors le préfixe aurait la somme doublée étant la somme du total.S'il est divisé par
()
, la somme du préfixe doublée moins la valeur entre parenthèses serait la somme du total.la source
c, 378 octets; environ 0,6 s pour
antidisestablishmentarianism
Réponse mise à jour . J'ai lu le commentaire de @ JonathanAllan sur
i
s, et au début je n'ai pas compris cette optimisation, mais maintenant je vois que puisque les deuxi
etI
ont une largeur de 1, alors nous pouvons compter les permutations associées deux fois sans avoir à valider une seule fois. Auparavant, ma solution utilisait plusieurs threads pour répartir la charge sur plusieurs processeurs et avec cela, j'étais à peu près en mesure de parcourir les 2 28 possibilités sur ma machine. Maintenant avec lei
optimisation, il n'est pas nécessaire de jouer avec les threads - un seul thread fait le travail facilement dans le délai imparti.Sans plus tarder - fonction c golfée:
La fonction récursive
f
prend 3 paramètres - un pointeur sur la chaîne d'entrée, la longueur de la chaîne et le décalage dans la chaîne pour commencer le traitement (devrait être 0 pour l'appel de niveau supérieur). La fonction renvoie le nombre de permutations.Essayez-le en ligne . TIO semble généralement parcourir tous les tests (y compris
antidisestablishmentarianism
en moins de 2 secondes).Notez qu'il y a quelques non imprimables dans la chaîne qui est
bcopy()
ed pourm[]
. Le TIO semble les gérer correctement.Non golfé:
J'ai un MacBook Pro mi-2015 fonctionnant sous MacOS 10.12.4. Le compilateur est le clang MacOS par défaut. Je compile avec:
Exécution de tous les tests, y compris
antidisestablishmentarianism
donne:Ce n'est en aucun cas optimal. L'algorithme force simplement son chemin à travers toutes les possibilités (modulo
i
- voir les commentaires ci-dessus), et compte les mots qui peuvent être divisés selon les critères.la source
i
,-
,'
,l
,mw
,fjrt
, etabcdeghknopqsuvxyz
, mais il faudrait une application du théorème énumération Pólya (ou une méthode d'énumération combinatoire équivalente), dans laquelle je ne connais pas bien.JavaScript (ES6),
199169167 octetsAttend la chaîne d'entrée en minuscules. Trop lent pour la prime.
Cas de test
Afficher l'extrait de code
la source
C,
403394 octets,Merci Kevin!
Essayez-le en ligne
Code non golfé:
la source
f(char* w, int l){
f(char*w,int l){