Une activité que je fais parfois quand je m'ennuie est d'écrire deux ou trois personnages par paires. Je trace ensuite des lignes (sur les sommets jamais en dessous) pour relier ces personnages. Par exemple, je pourrais écrire puis dessiner les lignes comme :
Ou je pourrais écrire
Une fois que j'ai tracé ces lignes, j'essaie de dessiner des boucles fermées autour de morceaux afin que ma boucle ne coupe aucune des lignes que je viens de dessiner. Par exemple, dans la première, la seule boucle que nous puissions dessiner est tout autour, mais dans la seconde, nous pouvons dessiner une boucle uniquement autour de s (ou de tout le reste).
Si nous jouons avec cela pendant un moment, nous verrons que certaines chaînes ne peuvent être dessinées que pour que les boucles fermées contiennent toutes les lettres, voire aucune (comme dans notre premier exemple). Nous appellerons ces chaînes des chaînes bien liées.
Notez que certaines chaînes peuvent être dessinées de plusieurs manières. Par exemple, peut être dessiné des deux manières suivantes (et une troisième non incluse):
Si l’un de ces moyens peut être dessiné de telle sorte qu’une boucle fermée puisse contenir certains des caractères sans croiser aucune des lignes, la chaîne n’est pas bien liée. (donc n'est pas bien lié)
Tâche
Votre tâche consiste à écrire un programme pour identifier les chaînes bien liées. Votre entrée consistera en une chaîne dans laquelle chaque caractère apparaît un nombre pair de fois et votre sortie doit être l’une des deux valeurs cohérentes distinctes, l’une si les chaînes sont bien liées et l’autre dans le cas contraire.
En outre votre programme doit être une chaîne bien liée sens
Chaque caractère apparaît un nombre pair de fois dans votre programme.
Il devrait sortir la valeur de vérité une fois passé lui-même.
Votre programme doit être capable de produire la sortie correcte pour toute chaîne composée de caractères à partir de fichiers ASCII imprimables ou de votre propre programme. Chaque caractère apparaissant un nombre pair de fois.
Les réponses seront notées sous forme de longueurs en octets, moins d'octets étant meilleurs.
Allusion
Une chaîne n'est pas bien liée si et seulement si une sous-chaîne stricte non vide et contiguë existe de sorte que chaque caractère apparaisse un nombre pair de fois dans cette sous-chaîne.
Cas de test
abcbac -> True
abbcac -> False
bbbb -> False
abacbc -> True
abcbabcb -> True
abcbca -> False
la source
abcbca -> False
.there
.Réponses:
Regex (ECMAScript 2018 ou .NET),
1401261181009882 octets^(?!(^.*)(.+)(.*$)(?<!^\2|^\1(?=(|(<?(|(?!\8).)*(\8|\3$){1}){2})*$).*(.)+\3$)!?=*)
Ceci est beaucoup plus lent que la version à 98 octets, car il
^\1
reste du regard et est donc évalué après. Voir ci-dessous pour un simple switcheroo qui regagne la vitesse. Mais pour cette raison, les deux TIO ci-dessous sont limités à la réalisation d'un ensemble de cas de test plus petit qu'auparavant, et celui du .NET est trop lent pour vérifier sa propre expression rationnelle.Essayez-le en ligne! (ECMAScript 2018)
Essayez - le en ligne! (.NET)
Pour supprimer 18 octets (118 → 100), j'ai volé sans vergogne une optimisation vraiment intéressante de la regex de Neil qui évite d'avoir à regarder dans le négat (donnant une regex sans restriction de 80 octets). Merci Neil!
Cela est devenu obsolète quand il a perdu 16 octets supplémentaires (98 → 82) grâce aux idées de Jaytea qui ont abouti à une regex sans restriction de 69 octets! C'est beaucoup plus lent, mais c'est du golf!
Notez que les
(|(
no-ops pour rendre la regex bien liée ont pour résultat de le faire évaluer très lentement sous .NET. Ils n'ont pas cet effet dans ECMAScript car les correspondances facultatives de largeur nulle sont traitées comme des correspondances .ECMAScript interdit l'utilisation de quantificateurs dans les assertions, ce qui rend plus difficile la pratique du golf pour les besoins des sources restreintes . Cependant, à ce stade, il est si bien joué que je ne pense pas que le fait de lever cette restriction en particulier ouvrirait de nouvelles perspectives pour le golf.
Sans les caractères supplémentaires nécessaires pour le faire passer les restrictions (
10169 octets):^(?!(.*)(.+)(.*$)(?<!^\2|^\1(?=((((?!\8).)*(\8|\3$)){2})*$).*(.)+\3))
C'est lent, mais cette édition simple (pour seulement 2 octets supplémentaires) récupère toute la vitesse perdue et plus encore:
^(?!(.*)(.+)(.*$)(?<!^\2|(?=\1((((?!\8).)*(\8|\3$)){2})*$)^\1.*(.)+\3))
Je l'ai écrit à l'aide de lookahead moléculaire (
10369 octets) avant de le convertir en lookbehind de longueur variable:^(?!.*(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$))
Et pour aider à rendre ma regex elle-même bien liée, j'ai utilisé une variante de la regex ci-dessus:
(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$)\1
Utilisé avec
regex -xml,rs -o
, ceci identifie une sous-chaîne stricte de l'entrée qui contient un nombre pair de chaque caractère (s'il en existe un). Bien sûr, j'aurais pu écrire un programme non-regex pour le faire pour moi, mais où serait-il amusant de le faire?la source
Gelée, 20 octets
Essayez-le en ligne!
La première ligne est ignorée. C'est seulement là pour satisfaire la condition que chaque personnage apparaisse un nombre pair de fois.
La première ligne suivante
Ġ
regroupe les indices en fonction de leur valeur. Si nous prenons ensuite la longueur de chaque sous-liste dans la liste résultante (Ẉ
), nous obtenons le nombre de fois que chaque caractère apparaît. Pour vérifier si l'un d'entre eux est non-égal, nous obtenons le dernier résultatḂ
de chaque décompte et demandons s'il existeẸ
une valeur de vérité (non nulle).Par conséquent, ce lien d'assistance indique si une sous-chaîne ne peut pas être encerclée.
Dans le lien principal, nous prenons toutes les sous-chaînes de input (
Ẇ
),Ṗ
opons de la dernière (afin de ne pas vérifier si la chaîne entière peut être encerclée), et exécutons helper link (Ç
) sur€
chaque sous-chaîne. Le résultat est alors de savoir siẠ
11 sous-chaînes ne peuvent pas être encerclées.la source
J , 34 octets
Essayez-le en ligne!
-8 octets grâce à FrownyFrog
original
J , 42 octets
Essayez-le en ligne!
explication
la source
abc
, seule l'entrée Perl n'échoue pas. (Il a cependant d'autres problèmes.)1:@':.,02|~*'=1(#.,)*/@(0=2|#/.~)\.\
2:@':.,|~*'>1(#.,)*/@(1>2|#/.~)\.\
semble également valablePython 3.8 (version préliminaire) , 66 octets
Essayez-le en ligne!
L'ère des expressions d'affectation est à nos portes. Avec PEP 572 inclus dans Python 3.8, le golf ne sera plus jamais pareil. Vous pouvez installer la version préliminaire 3.8.0a1 du développeur ici .
Les expressions d’affectation vous permettent
:=
d’affecter une variable en ligne lors de l’évaluation de cette valeur. Par exemple,(a:=2, a+1)
donne(2, 3)
. Cela peut bien sûr être utilisé pour stocker des variables en vue de leur réutilisation, mais nous allons maintenant un peu plus loin et l’utilisons comme un accumulateur dans une compréhension.Par exemple, ce code calcule les sommes cumulées
[1, 3, 6]
Notez que, à chaque passage dans la compréhension de liste, la somme cumulée
t
est augmentée dex
et que la nouvelle valeur est stockée dans la liste produite par la compréhension.De la même manière,
b:=b^{c}
met à jour le jeu de caractèresb
pour indiquer s'il inclut ou non un caractèrec
et correspond à la nouvelle valeur deb
. Ainsi, le code[b:=b^{c}for c in l]
itère sur les caractèresc
dansl
et accumule le jeu de caractères vu un nombre impair de fois dans chaque préfixe non vide.Cette liste est vérifiée pour les doublons en en faisant une compréhension d'ensemble et en vérifiant si sa longueur est inférieure à celle de
s
, ce qui signifie que certaines répétitions ont été réduites . Si tel est le cas, la répétition signifie que dans la parties
observée entre ces moments, chaque caractère a rencontré un nombre pair de nombres, ce qui rend la chaîne non bien liée. Python n'autorise pas les ensembles d'ensembles à être superflus. Par conséquent, les ensembles internes sont convertis en chaînes.L'ensemble
b
est initialisé sous la forme d'un argument facultatif et est modifié avec succès dans l'étendue de la fonction. Je craignais que cela ne rende la fonction non réutilisable, mais elle semble se réinitialiser entre les exécutions.Pour la restriction de source, les caractères non appariés sont insérés dans un commentaire à la fin. Écrire
for(c)in l
plutôt que d’for c in l
annuler gratuitement les parens supplémentaires. Nous avons misid
dans le set initialb
, ce qui est inoffensif puisqu'il peut commencer comme n'importe quel jeu, mais le jeu vide ne peut pas être écrit ainsi{}
car Python créera un dictionnaire vide. Puisque les lettresi
etd
sont parmi celles qui ont besoin d'être appariées, on peut y mettre la fonctionid
.Notez que le code produit des booléens annulés afin qu'il se donne correctement
False
.la source
Python 2 , 74 octets
Essayez-le en ligne!
Parcourt la chaîne en gardant une trace
P
du jeu de caractères vu un nombre impair de fois jusqu'à présent. La listed
stocke toutes les valeurs passées deP
, et si vous voyez le courantP
déjà dansd
, cela signifie que dans les caractères vus depuis, chaque caractère est apparu un nombre pair de fois. Si c'est le cas, vérifiez si nous avons parcouru toute l'entrée: si c'est le cas, acceptez-la, car toute la chaîne est appariée comme prévu et sinon, refusez.Parlons maintenant de la restriction de source. Les personnages ayant besoin d'être associés sont placés dans divers endroits inoffensifs, soulignés ci-dessous:
Lors
f<s
de l'0
appariement d'unf
, l'évaluateur tire parti du nom de la fonction, def
sorte qu'il est défini (au moment de l'appel de la fonction).0^0
absorption d'un^
symbole.Le
0
inP={0}
est regrettable: in Python{}
évalue un dict vide plutôt qu'un ensemble vide comme nous le souhaitons, et ici nous pouvons insérer n'importe quel élément non-character et ce sera inoffensif. Je ne vois rien d’autre à mettre dans, cependant, et ai mis dans un0
et le dupliqué dansbmn0
, coûtant 2 octets. Notez que les arguments initiaux sont évalués lorsque la fonction est définie, les variables que nous définissons nous-mêmes ne peuvent donc pas être insérées ici.la source
Perl 6 , 76 octets
Essayez-le en ligne!
Quel que soit le lambda qui retourne une jonction None de None, qui peut être booléifiée à une valeur vérité / falsey. Je recommanderais toutefois de ne pas supprimer le
?
résultat booléifiant le résultat, sinon la sortie devient plutôt volumineuse .Cette solution est un peu plus complexe que nécessaire, en raison de plusieurs fonctions impliquées soient découplées, par exemple
..
,all
,>>
,%%
etc. Sans la restriction source, cela pourrait être 43 octets:Essayez-le en ligne!
Explication:
la source
Perl 5
-p
,94,86,78 octetsouput 0 si bien lié 1 sinon.
78 octets
86 octets
94 octets
Comment ça marche
-p
avec}{
fin astuce pour sortir$\
à la finm-.+(?{
..})(?!)-
, pour exécuter du code sur toutes les sous-chaînes non vides (.+
correspond à la chaîne entière en premier, et après l'exécution du code entre(?{
..})
retour en raison d'un échec forcé(?!)
$Q|=@q&grp,
ordures en raison de la restriction de source$\|=
entier au niveau du bit ou assignation, s'il y a presque un 1,$\
sera 1 (vrai), par défaut il est vide (faux)$&eq$_
le cas où la chaîne est la chaîne entière est bitored^
avec "aucune occurrence de caractère impair"($g=$&)=~/./g
copier la sous-chaîne correspondante dans$g
(parce que sera surchargée après la prochaine correspondance d'expression régulière) et renvoyer le tableau de caractères de la sous-chaîne./^/
ordures qui évalue à 1grep
1&(@m=$g=~/\Q$_/g),
pour chaque caractère de la sous-chaîne obtient le tableau de caractères en$g
correspondance, le tableau en scalaire est évalué à sa taille etgrep
le filtrage des caractères avec une occurrence étrange1&x
équivaut àx%2==1
la source
Retina ,
150 à96 octetsEssayez-le en ligne! Link inclut les cas de test, y compris lui-même. Edit: Classez légèrement la regex originale avec l’aide de @Deadcode, puis remontez-le légèrement moins extravagamment pour conserver la présentation source. Explication:
Affirmez qu'il n'existe aucune sous-chaîne
\3
correspondant aux contraintes suivantes.Affirmez que la sous-chaîne n'est pas la chaîne originale complète.
Affirmez qu'il n'y a pas de caractère
\6
tel que:Afin de passer la contrainte de mise en page source, j'ai remplacé
((((
par(?:(^?(?:(
et((
avec(|(
. Il me restait encore une contrainte de source))
et les caractères!()1<{}
restants, alors j'ai changé un+
en{1,}
et inséré l'inutile(?!,<)?
pour consommer le reste.la source
C # (compilateur interactif Visual C #) ,
208206200198 octetsEssayez-le en ligne!
-2 octets grâce à @KevinCruijssen!
Finalement, je l'ai eu en dessous de 200, alors je pourrais peut-être jouer au golf pour le moment :) J'ai fini par créer un deuxième TIO pour tester les choses sur la base d'une réponse précédente.
Essayez-le en ligne!
Les choses qui ont rendu cette tâche difficile:
==
n'a pas été autorisé++
n'était pas autoriséAll()
Fonction Linq n'était pas autoriséeCode commenté ci-dessous:
la source
Python 2 , 108 octets
Essayez-le en ligne!
-2 grâce à Ørjan Johansen .
la source
Brachylog , 16 octets
Essayez-le en ligne!
Imprime
false.
pour les cas de vérité ettrue.
pour les cas de faux. La version de TIO est trop lente à gérer elle-même, mais elle est clairement bien liée puisque c'est une chaîne avec des caractères uniques répétés deux fois.Explication
la source
05AB1E ,
22 à20 octetsLes sorties
1
si la chaîne est bien liée, et0
si la chaîne n'est pas bien liée.Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Le programme de base est
ŒsKεsS¢ÈP}à
( 11 octets ), qui sort0
s'il est bien lié et1
s'il n'est pas bien lié. La finÈ
(is_even) est un semi-no-op qui inverse la sortie, donc1
pour les chaînes bien liées et0
pour les chaînes non bien liées. Les autres parties ne permettent pas de se conformer aux règles du challenge.la source