Lengua geobitsiana

16

El idioma geobitsiano es una nueva perversión del inglés donde una palabra se divide en segmentos que cada uno debe comenzar con una letra diferente. Luego, cada vez que una de esas letras iniciales aparece en otra cadena, se reemplaza por todo su segmento correspondiente, manteniendo el uso de mayúsculas.

Este proceso se llama Geobitsizing .

Por ejemplo, la palabra " Geobits " podría dividirse geo bits, y el poema sin sentido

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

sería Geobitsized con él como

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

porque cada se gconvierte geo, cada G(aunque no haya ninguno) se convierte Geo, cada se bvuelve bitsy cada se Bvuelve Bits.

Tenga en cuenta que cada sustitución se realiza con respecto a la cadena original, no a ningún paso intermedio. por ejemplo, si geohubiera sido en su gbolugar, los bcreados no se reemplazarían por bits.

Desafío

Escriba un programa o función que pueda generar lenguaje geobitsiano.

Tome una cadena de una sola línea hecha de letras minúsculas (az) y espacios. Esta será la palabra utilizada como argumento de Geobitsizing, con los espacios que separan los segmentos. Puedes asumir:

  • Los segmentos no estarán vacíos. Por lo tanto, los espacios no serán vecinos ni estarán al principio o al final de la cadena.
  • Cada segmento comienza con una letra diferente. Por lo tanto, no puede haber más de 26.

Por ejemplo, algunas cadenas segmentados válidos debe apoyar son geo bits, butt ner, alex, y do o r k nob(segmentos de una sola letra no tienen ningún efecto, pero son válidos). Pero geo , butt ner, Alex, y do o r k n obno son válidos.

Su programa o función también necesita incluir otra cadena arbitraria para aplicar el Geobitsizing e imprimir o devolver el idioma geobitsiano resultante.

  • Puede suponer que esta cadena solo contiene nuevas líneas y ASCII imprimible.

  • Recuerde que las mayúsculas y minúsculas deben conservarse de la entrada a la salida.

Aquí hay algunos ejemplos más que se usan no pro gr am m ingcomo argumento de Geobitsizing:

[empty string][empty string]

iing

IIng

Mmmm, mmm... MmmmMMM: m&m!Mmmm, mmm... MmmmMMM: m&m!(sin cambios)

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

Tenga en cuenta que los resultados deben ser idénticos sin importar cómo esté organizado el argumento, por ejemplo, ing pro m no am grdeben producir los mismos resultados que anteriormente.

El código más corto en bytes gana.

Pasatiempos de Calvin
fuente
¿Podemos tomar el "argumento de Geobitsizing" como una matriz? eg["no", "pro", "gr", "am", "m", "ing"]
Downgoat
@ Upgoat Lo siento pero no.
Aficiones de Calvin
@Upgoat Pruébalo, \\b${l}(\\S+)aunque eso te cuesta 5 bytes.
Neil
3
-1 para el requisito de entrada arbitraria de una cadena separada por espacios.
AdmBorkBork
2
Sugerido caso de prueba: abra cadabra, !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~, que cubra todos los casos límite, y hay muchos de ellos, si uno intenta utilizar expresiones regulares ...
Dennis

Respuestas:

6

Jalea , 18 bytes

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

Pruébalo en línea!

Versión alternativa, 15 bytes (no competitiva)

La función del caso del título de Jelly tenía un error; no capitalizó la primera palabra. Eso se ha solucionado, por lo que lo siguiente funciona ahora.

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

Este código hace lo mismo que en la versión de la competencia, excepto que Œt(caso de título) reemplaza la mayúscula condicional lograda por Œu1¦€.

Cómo funciona

ṣ⁶;Œ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
fuente
5

Python 3, 71 bytes

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

Pruébalo en Ideone .

Cómo funciona

En Python 3 , el incorporado str.translatetoma una cadena y un diccionario, y reemplaza cada carácter en la cadena cuyo punto de código es una clave de ese diccionario con el valor correspondiente, que puede ser una cadena, un número entero o Ninguno (equivalente al cuerda vacía).

Al convertir la cadena de palabras w en mayúsculas (es decir, poner en mayúscula la primera letra de cada palabra) y agregarla al resultado de, se w+' 'crea una cadena de palabras separadas por espacios con una versión en mayúsculas y minúsculas (primera letra). Sin un segundo argumento, se str.splitdivide en espacios en blanco, por lo que (w+' '+w.title()).split()crea la lista de todas las palabras.

Finalmente, la comprensión del diccionario {ord(t[0]):t for t in...}convierte cada palabra t en una entrada del diccionario con clave ord(t[0])(punto de código de la primera letra) y valor t , por str.translatelo que realizará las sustituciones previstas.

Dennis
fuente
3

Python, 126 99 95 81 bytes

Muchas gracias a 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: no es necesario agregar a un archivo temporal

Edit2: Spuede contener mayúsculas ...

Edit3: no duplique G

Edit4: comprimido un poco más y lo empujó en una línea

Edit5: usando lambda sin nombre y j=join' '

Karl Napf
fuente
2

Pyth, 19 bytes

.rzsC_hMBsm,rd0rd3c

Pruébalo en línea!

Monja permeable
fuente
1
No podemos tomar el argumento de geobitsizing como una matriz, desafortunadamente
Downgoat
Lo siento, no me di cuenta.
Leaky Nun
2

Vim, 46 pulsaciones de teclas

Feo y Hacky.

A <esc>:s/\<\w/:%s\/\0\\c\/\\0/g<cr>:s/ /eg<C-v><Cr>/g<cr>dgg@"
DJMcMayhem
fuente
¿Por qué no en V? D:
Downgoat
@ Upgoat Porque es un desastre con errores.
DJMcMayhem
2

Pyth 18 años dieciséis

MsXGhMJcjdrBH3)J

Pruébalo aquí

Define una función gque realiza la geobitsising. Como programa, esto sería un poco más corto si la segunda cadena es de una sola línea, pero la entrada multilínea no vale la pena:

sXwhMJcjdrBz3)J

La idea general aquí era titular el caso de la cadena geobitsiana y agregarla a la cadena original. Luego divídalo en espacios y para cada cadena, tome la primera letra y asignela a la cadena que representa. De esa manera X, la primera letra de cada palabra se convertirá en la palabra completa.

FryAmTheEggman
fuente
¿Acabas de ... superar a Dennis?
Bojidar Marinov
@BojidarMarinov Si cuentas a Dennis usando algún otro idioma que tenía un error como outgolfing, entonces sí;)
FryAmTheEggman
2

Python 2, 83 78 bytes

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

Pruébalo en Ideone .

Cómo funciona

Nos iterar sobre todos los caracteres c en la cadena s .

Anteponemos un espacio a la cadena de palabras w , luego buscamos una aparición de c minúscula , precedida por un espacio.

  • Si existe tal ocurrencia, finddevolverá el índice del espacio en la cadena ' '+w, que coincide con el índice de c en w .

    w[...:]por lo tanto, devuelve la cola de w , comenzando por la palabra con la primera letra c . split()divide la cola en espacios, [0]selecciona el primer fragmento (la palabra) y [1:]elimina su primera letra.

    Después de anteponer c al resultado anterior, obtenemos la palabra correctamente en mayúscula que comienza con c .

  • Si ninguna palabra comienza con c , finddevolverá -1 .

    Por lo tanto, w[...:]produce el último carácter de w , lo split()envuelve en una matriz, [0]deshace el ajuste y[1:] elimina el único carácter de la cadena.

    Después de anteponer c , obtenemos la cadena singleton cuyo carácter es c , por lo que toda la operación es no operativa.

Finalmente, ''.joinconcatena todas las cadenas resultantes, devolviendo la versión Geobitsized de s .

Dennis
fuente
1

CJam, 19 bytes

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

Pruébalo aquí.

Explicación

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
fuente
1

JavaScript ES6, 67 63 70 bytes

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

Prueba esto en Firefox. los errores hacen que esto sea más largo de lo que me gustaría

Explicación

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
fuente
f("abracadabra")("1Dbw")vuelve "1abracadabraDbracadabrababracadabrawbracadabra".
Dennis