Lundi Mini-golf: Une série de défis courts en code-golf , postés (espérons-le!) Tous les lundis.
Histoire vraie 1 : L'autre jour, je jouais sur ma tablette lorsque j'ai eu l'idée de visiter la page que j'utilise normalement sur mon PC pour tester JavaScript. Après la page chargée, je suis entré dans ce programme simple:
alert("Hello!")
J'ai ensuite appuyé sur le bouton Execute (Exécuter) et j'ai été surpris de constater que le code que j'avais entré était invalide. J'ai jeté un deuxième coup d'œil à la zone de texte et j'ai vu ceci:
alllelelerlerlertlert("Heeelelellellelloello!")
Wha ??? Ce n'est pas ce que je suis entré! Alors que s'est-il passé ici? Pour le comprendre, j'ai entré deux lignes simples:
abcdefg
0123456
Cela s'est avéré comme:
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
0112123123412345123456
À l'heure actuelle, je n'avais toujours aucune idée de ce qu'il était advenu des lettres, mais les chiffres semblaient plus simples, alors j'ai regardé de plus près. Il s’est avéré que la page Web saisissait simplement le premier caractère, puis répétait tout le reste de la chaîne à chaque pression sur un nouveau:
0112123123412345123456
0
1
12
123
1234
12345
123456
Mais qu'en est-il des sections de lettres? Après avoir réfléchi pendant une minute, je me suis rendu compte que c'était la même chose, mais au lieu de répéter chaque sous-section une fois, il le répète deux fois :
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
a
bb
bcbc
bcdbcd
bcdebcde
bcdefbcdef
bcdefgbcdefg
Une combinaison des deux œuvres avec une combinaison de ces techniques:
abc123z
abbbcbcbc1bc12bc123bc123zbc123z
a
bb
bcbc
bc1
bc12
bc123
bc123zbc123z
Quelle que soit Glitch cause cela semble remis à zéro à la ponctuation et les espaces, donc abc def
devient abbbcbc deeefef
.
À ce stade, j'étais tellement absorbé par l'idée de le comprendre et de le transformer en un défi intéressant que j'ai oublié pourquoi je m'étais trouvé là-bas. (Cependant, j'ai compris comment taper normalement: appuyer sur espace-espace après chaque caractère. Plutôt ennuyeux, mais il faut faire ce qu'il faut faire.)
Défi
Le but du défi est d’écrire un programme ou une fonction qui intègre le texte à traiter, apporte les modifications répertoriées ci-dessus et génère / renvoie le résultat.
Détails
- L'entrée ne contiendra que de l'ASCII imprimable, sans onglets ni nouvelles lignes.
Cas de test
Entrées: (une par ligne)
Mess up text
This is some longer text.
CAPS LOCK && "Punc-tua"+'tion'
under_score_style
CaPs wItHIn loWERs
1337 numb3r5
abcdefghij 0123456789
Code-golf is the best!
Les sorties:
Meeesesessess upp teeexexextext
Thhhihihishis iss sooomomomeome looononongongongeongeongeronger teeexexextext.
CAAAPAPAPSAPS LOOOCOCOCKOCK && "Puuunununcunc-tuuuaua"+'tiiioioionion'
unnndndndendendernder_scccococorcorcorecore_stttytytyltyltyletyle
CaaaPaPaPsaPs wIIItItItHItHItHIItHIItHInItHIn loooWoWoWEoWEoWERoWERoWERsoWERs
1333337 nuuumumumbumbumb3umb3rumb3rumb3r5
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefgbcdefghbcdefghbcdefghibcdefghibcdefghijbcdefghij 0112123123412345123456123456712345678123456789
Cooodododeode-gooolololfolf iss thhhehe beeesesestest!
Notation
C'est le code-golf , donc le code valide le plus court en octets gagne. Tiebreaker va à la soumission qui a atteint son nombre d'octets final en premier. Le gagnant sera choisi lundi prochain, le 2 novembre. Bonne chance!
Edit: Et le gagnant est ... @ MartinBüttner utilise Retina pour une solution incroyable de 43 octets !
1 Oui, cette histoire est tout à fait vraie et, si vous avez besoin de précisions, voir la note 1.
' '.join(x[0]+''.join(2*x[1:i]for i in range(1,len(x)+1)) for x in raw_input().split())
Réponses:
Retina , 43 octets
Exécutez le code à partir d'un seul fichier avec l'
-s
indicateur. Puisqu'il ne s'agit que d'une substitution de regex unique, vous pouvez le tester ici (cliquez sur l'onglet Contexte pour voir les résultats).Explication
Cela correspond aux chiffres et aux lettres qui ne sont pas les premiers d'une série. Bien qu’ils
.
puissent correspondre à n’importe quel caractère qui n’a pas d’alignement de ligne, les fonctions de vérification assurent les autres conditions:Cela correspond à l' arrière de la position après
.
. Tout d'abord, il correspond à un ou plusieurs caractères alphanumériques et les capture dans un groupe1
avec([^_\W]+)
. Cela garantit immédiatement que le.
correspond à un caractère alphanumérique lui-même. Ensuite, le caractère supplémentaire[^_\W]
permet de s’assurer qu’il y a encore un caractère alphanumérique dans l’exécution en cours, ce que nous n’incluons pas . Maintenant, groupe1
est ce avec quoi nous voulons remplacer la correspondance s'il s'agit d'un chiffre - si c'est une lettre, nous voulons le remplacer par deux fois cette chaîne. C'est là qu'intervient le deuxième regard:Celui-ci est facultatif, donc s'il échoue, cela n'affectera pas du tout la correspondance. Cela garantit d’abord que le chiffre
.
n’est pas un chiffre(?<=\D)
- la recherche n’est donc pertinente que lorsque nous comparons des lettres. Dans ce cas, nous correspondons à nouveau au groupe\1
(cela correspond toujours, car nous avons capturé le groupe à partir de la même position), mais nous le capturons dans le groupe2
.Par conséquent, nous remplaçons simplement l'expression rationnelle par le contenu des deux groupes (
$1$2
). Si la correspondance était un chiffre,$2
sera toujours vide et nous n'écrirons le préfixe qu'une seule fois. Si c’était une lettre,$2
c’est la même chose$1
et nous l’écrivons deux fois.la source
JavaScript (ES6) 82
Utilisation de l'optimisation des expressions rationnelles suggérée par Mwr247
Testez l'exécution de l'extrait ci-dessous dans n'importe quel navigateur récent
la source
JavaScript (ES6),
928887Je ne sais pas comment jouer au golf avec ça ...
Merci Mwir247 pour la regex et ETHproductions au golf pour un golf sur un octet en fonction réduite .
la source
/[^_\W]+/g
(enregistre 3 caractères).reduce
fonction:(a,e)=>a+=(y+=e,++e?y:y+y)
(1 octet plus court)Haskell,
215200 octetsC'est le bordel.
Amusez-vous en lisant toutes ces bizarreries bizarres, je n'aurais jamais pensé en utiliser
id
autant.Dommage que la substance qui fait déjà la moitié du travail a besoin d' ici à importer (
isDigit
,isAlpha
,inits
).la source
lang-hs
paslang-haskell
. En spécifiant,lang-haskell
il finit probablement par utiliser un surligneur par défaut.Gema, 57 caractères
Échantillon échantillon:
la source
Haskell,
183181 octetsUsage:
Je ne sais pas si c'est fondamentalement différent avec la réponse de Leif Willerts. Mais voici l'algorithme.
Je garde en quelque sorte les crochets redudant.
la source
T-SQL, 357 octets
ex:
exec x(@s='1337 numb3r5')
retourne1333337 nuuumumumbumbumb3umb3rumb3rumb3r5
la source
Python 2, 131 octets
Parcourt les personnages et enregistre / répète si nécessaire.
la source
Pip, 41 octets
Prend le texte en argument de ligne de commande. Nous utilisons un remplacement regex pour remplacer tous les runs alphanumériques
[^_\W]+
par une fonction de rappel. Cette fonction mappe une autre fonction sur chaque caractère du mot, générant des séries de caractères de plus en plus grandes (avec la variable globaley
gardant la trace de l'index) et les répétant X2 si le caractère n'est pas un nombre. (La logique pour laquelle est utilisée la+
conversion en nombre, puis laQ
vérification si c'est une chaîne identique à celle du caractère d'origine.) Ce processus laisse de côté le premier caractère. Nous devons donc l'ajouter après (a@0.
).la source
Python 3 , 86 octets
Essayez-le en ligne!
la source