Langue géobitsienne

16

La langue géobitsienne est une nouvelle perversion de l'anglais où un mot est divisé en segments qui doivent commencer par une lettre différente. Ensuite, chaque fois qu'une de ces lettres de départ apparaît dans une autre chaîne, elle est remplacée par tout son segment correspondant, en maintenant la capitalisation.

Ce processus est appelé Geobitsizing .

Par exemple, le mot " Geobits " pourrait être décomposé geo bitset le poème absurde

Algy met a Bear
A Bear met Algy
The Bear was bulgy
The bulge was Algy

serait géobitsized avec elle comme

Algeoy met a Bitsear
A Bitsear met Algeoy
The Bitsear was bitsulgeoy
The bitsulgeoe was Algeoy

parce que chaque gdevient geo, chaque G(bien qu'il n'y en ait pas) devient Geo, chaque bdevient bitset chaque Bdevient Bits.

Notez que chaque substitution est effectuée par rapport à la chaîne d'origine, et non à une étape intermédiaire. par exemple, si cela geoavait été le cas gbo, le b's créé ne serait pas remplacé parbits .

Défi

Écrivez un programme ou une fonction qui peut générer une langue géobitsienne.

Prenez une chaîne d'une seule ligne composée de lettres minuscules (az) et d'espaces. Ce sera le mot utilisé comme argument de géobitsizing, les espaces séparant les segments. Vous pouvez supposer:

  • Les segments ne seront pas vides. Les espaces ne seront donc pas voisins les uns des autres, ni au début ou à la fin de la chaîne.
  • Chaque segment commence par une lettre différente. Il ne peut donc y en avoir plus de 26.

Par exemple, certaines chaînes segmentés valides que vous devez prendre en charge sont geo bits, butt ner, alex, et do o r k nob(segments d'une seule lettre n'a aucun effet , mais sont valables). Mais geo , butt ner, Alexetdo o r k n ob ne sont pas valides.

Votre programme ou fonction doit également prendre une autre chaîne arbitraire pour appliquer le géobitsizing et imprimer ou renvoyer la langue géobitsienne résultante.

  • Vous pouvez supposer que cette chaîne ne contient que des sauts de ligne et des caractères ASCII imprimables.

  • N'oubliez pas que les majuscules doivent être préservées de l'entrée à la sortie.

Voici d'autres exemples d'utilisation no pro gr am m ing comme argument de géobitsizing:

[empty string][empty string]

iing

IIng

Mmmm, mmm... MmmmMMM: m&m!Mmmm, mmm... MmmmMMM: m&m! (pas de changement)

People think bananas are great, don't you?Proeoprole thingnok bamnoamnoams amre grreamt, dono't you?

Pet a Puppy
Google Wikipedia

Proet am Prouproproy
Groogrle Wingkingproedingam

Notez que les résultats doivent être identiques quelle que soit la disposition de l'argument, par exemple ing pro m no am gr doivent produire les mêmes résultats que précédemment.

Le code le plus court en octets gagne.

Loisirs de Calvin
la source
Pouvons-nous prendre "l'argument de géobitsizing" comme un tableau? par exemple["no", "pro", "gr", "am", "m", "ing"]
Downgoat
@Upgoat Désolé mais non.
Calvin's Hobbies
@Upgoat Essayez \\b${l}(\\S+)bien que cela vous coûte 5 octets.
Neil
3
-1 pour les exigences d'entrée arbitraires d'une chaîne séparée par des espaces.
AdmBorkBork
2
Suggéré cas de test: abra cadabra, !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~qui devrait couvrir tous les cas de pointe, et d'entre eux il y a beaucoup si l' on essaie d'utiliser regexes ...
Dennis

Réponses:

6

Gelée , 18 octets

ṣ⁶;Œu1¦€$;©ZḢiЀị®

Essayez-le en ligne!

Version alternative, 15 octets (non concurrent)

La fonction de casse de titre de Jelly avait un bug; il n'a pas mis en majuscule le premier mot. Cela a été corrigé, donc ce qui suit fonctionne maintenant.

ṣ⁶;Œt$;©ZḢiЀị®

Ce code fait la même chose que dans la version concurrente, sauf que Œt(casse de titre) remplace la majuscule conditionnelle obtenue par Œu1¦€.

Comment ça fonctionne

ṣ⁶;Œu1¦€$;©ZḢiЀị®  Main link. Left argument: w (words). Right argument: s (string)

ṣ⁶                  Split w at spaces.
        $           Combine the two links to the left into a monadic chain.
       €              Map over the words.
   Œu1¦                 Uppercase the item at index 1.
  ;                   Append the result to the unmodified words.
         ;          Append all characters in s to the list of words.
          ©         Copy the result to the register.
           Z        Zip/transpose, grouping the first chars into the first list.
            Ḣ       Head; extract the list of first characters.
             iЀ    Find the first index of each character in s.
                ị®  Select the characters/strings from the list in the register
                    that are at those indices.
Dennis
la source
5

Python 3, 71 octets

lambda w,s:s.translate({ord(t[0]):t for t in(w+' '+w.title()).split()})

Testez-le sur Ideone .

Comment ça fonctionne

En Python 3 , la fonction intégrée str.translateprend une chaîne et un dictionnaire, et remplace chaque caractère de la chaîne dont le point de code est une clé de ce dictionnaire par la valeur correspondante, qui peut être une chaîne, un entier ou Aucun (équivalent à la chaîne vide).

Conversion de la chaîne de mots w en casse de titre (c.-à-d. La mise en majuscule de la première lettre de chaque mot) et son ajout au résultat de w+' 'crée une chaîne de mots séparés par des espaces avec des versions minuscules et majuscules (première lettre). Sans deuxième argument, str.splitse divise en espace, (w+' '+w.title()).split()crée ainsi la liste de tous les mots.

Enfin, la compréhension du dictionnaire {ord(t[0]):t for t in...}transforme chaque mot t en une entrée de dictionnaire avec clé ord(t[0])(point de code de la première lettre) et valeur t , ainsi str.translateeffectuera les substitutions prévues.

Dennis
la source
3

Python, 126 99 95 81 octets

Beaucoup de remerciements à Dennis:

lambda G,S,j=''.join:j(s+j(g[1:]for g in G.split()if g[0]==s.lower())for s in S)

Edit1: pas besoin d'ajouter à un temporaire

Edit2: S peut contenir des majuscules ...

Edit3: ne pas dupliquer G

Edit4: compressé un peu plus et poussé sur une seule ligne

Edit5: utilisation de lambda sans nom et j=join' '

Karl Napf
la source
2

Pyth, 19 octets

.rzsC_hMBsm,rd0rd3c

Essayez-le en ligne!

Leaky Nun
la source
1
Nous ne pouvons malheureusement pas prendre l'argument de géobitsizing comme un tableau
Downgoat
Désolé, je n'ai pas remarqué.
Leaky Nun
2

Vim, 46 frappes

Laid et Hacky.

A <esc>:s/\<\w/:%s\/\0\\c\/\\0/g<cr>:s/ /eg<C-v><Cr>/g<cr>dgg@"
DJMcMayhem
la source
Pourquoi pas en V? D:
Downgoat
@Upgoat Parce que c'est un bazar.
DJMcMayhem
2

Rétine , 36 octets

Le nombre d'octets suppose un codage ISO 8859-1.

i`(?<=^.*\b\2(\w+)[^·]*?(\w))
$1
A1`

Essayez-le en ligne!

Martin Ender
la source
2

Pyth, 18 16

MsXGhMJcjdrBH3)J

Essayez-le ici

Définit une fonction gqui effectue la géobitsize. En tant que programme, cela serait un peu plus court si la deuxième chaîne est sur une seule ligne, mais l'entrée multiligne n'en vaut pas la peine:

sXwhMJcjdrBz3)J

L'idée générale ici était de titrer la chaîne géobitsienne et de l'ajouter à la chaîne d'origine. Ensuite, divisez cela sur les espaces et pour chaque chaîne, prenez la première lettre et mappez-la à la chaîne qu'elle représente. De cette façon X, la première lettre de chaque mot deviendra le mot complet.

FryAmTheEggman
la source
Vous venez de ... déjouer Dennis?
Bojidar Marinov
@BojidarMarinov Si vous comptez Dennis utilisant une autre langue qui contenait un bug comme étant du golf, alors oui;)
FryAmTheEggman
2

Python 2, 83 78 octets

lambda w,s:''.join(c+w[(' '+w).find(' '+c.lower()):].split()[0][1:]for c in s)

Testez-le sur Ideone .

Comment ça fonctionne

Nous parcourons tous les caractères c de la chaîne s .

Nous ajoutons un espace à la chaîne de mots w , puis recherchons une occurrence de c en minuscule , précédée d'un espace.

  • Si une telle occurrence existe, findretournera l'index de l'espace dans la chaîne ' '+w, qui correspond à l'index de c dans w .

    w[...:]renvoie donc la queue de w , en commençant par le mot avec la première lettre c . split()divise la queue aux espaces, [0]sélectionne le premier morceau (le mot) et [1:]supprime sa première lettre.

    Après avoir ajouté c au résultat précédent, nous obtenons le mot correctement placé commençant par c .

  • Si aucun mot ne commence par c , findrenvoie -1 .

    Ainsi, w[...:]renvoie le dernier caractère de w , l' split()enveloppe dans un tableau, [0]annule l'habillage et [1:]supprime le seul caractère de la chaîne.

    Après le pré-paiement c , nous obtenons la chaîne singleton dont le caractère est c , donc toute l'opération est un no-op.

Enfin, ''.joinconcatène toutes les chaînes résultantes, renvoyant la version Geobitsized de s .

Dennis
la source
1

CJam, 19 octets

lq\S/_32af.^+_:c\er

Testez-le ici.

Explication

l       e# Read first line of input (list of words).
q\      e# Read remaining input and swap with first line.
S/      e# Split around spaces.
_       e# Duplicate.
32af.^  e# Convert the first letter of each word to upper case by taking
        e# the element-wise XOR with the list [32].
+       e# Append the upper-cased words to the original ones.
_:c     e# Duplicate and convert each word to its first character.
\       e# Swap characters with words.
er      e# Transliteration, replacing each character with the corresponding word.
Martin Ender
la source
1

JavaScript ES6, 67 63 70 octets

g=>s=>s.replace(/\S/g,l=>l+(g.match(`\\b\\${l}(\\S+)`,'i')||[,""])[1])

Testez cela sur Firefox. les bugs font cela plus longtemps que je ne le voudrais

Explication

function(gbarg, str) {
   return str.replace(/\S/g, function(chr) { // Replace non-whitespace w/...
        return chr + (
         gbarg.match(`\\b\\${l}(\\S+)`,'i')  // That word in the gbstr
        ||[,""])[1]                          // if not in gbstr, use blank str
   });
}
Downgoat
la source
f("abracadabra")("1Dbw")retourne "1abracadabraDbracadabrababracadabrawbracadabra".
Dennis
0

Rubis, 65 60 58 octets

->w,s{s.gsub(/\w/){|c|w=~/\b#{c}(\w+)/i;c+($1||c)[1..-1]}}

Essayez-le en ligne!

Encre de valeur
la source