Lingua geobitsiana


16

La lingua geobitsiana è una nuova perversione dell'inglese in cui una parola è suddivisa in segmenti che ognuno deve iniziare con una lettera diversa. Quindi ogni volta che una di quelle lettere iniziali appare in un'altra stringa, viene sostituita con l'intero segmento corrispondente, mantenendo le maiuscole.

Questo processo si chiama Geobitsizing .

Ad esempio, la parola " Geobit " potrebbe essere scomposta geo bitse la poesia senza senso

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

sarebbe geobitsized con esso come

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

perché ogni gdiventa geo, ogni G(anche se non ce ne sono) diventa Geo, ogni bdiventa bitse ogni Bdiventa Bits.

Si noti che ogni sostituzione viene eseguita rispetto alla stringa originale, non a nessun passaggio intermedio. ad esempio, se geofosse stato gboinvece, il bcreato non verrebbe sostituito con bits.

Sfida

Scrivi un programma o una funzione in grado di generare la lingua geobitsiana.

Accetta una stringa a riga singola composta da lettere minuscole (az) e spazi. Questa sarà la parola usata come argomento di geobitsizing, con gli spazi che separano i segmenti. Puoi presumere:

  • I segmenti non saranno vuoti. Quindi gli spazi non si avvicinano né si trovano all'inizio o alla fine della stringa.
  • Ogni segmento inizia con una lettera diversa. Quindi non possono esserci più di 26.

Ad esempio, alcune stringhe segmentati valide è necessario sostenere sono geo bits, butt ner, alex, e do o r k nob(segmenti singoli lettera non hanno alcun effetto, ma sono validi). Ma geo , butt ner, Alex, e do o r k n obnon sono validi.

Il programma o la funzione deve inoltre includere un'altra stringa arbitraria per applicare il Geobitsizing e stampare o restituire la lingua Geobitsian risultante.

  • Puoi presumere che questa stringa contenga solo nuove righe e ASCII stampabile.

  • Ricorda che le lettere maiuscole devono essere preservate dall'input all'output.

Ecco alcuni altri esempi che usano no pro gr am m ingcome argomento Geobitsizing:

[empty string][empty string]

iing

IIng

Mmmm, mmm... MmmmMMM: m&m!Mmmm, mmm... MmmmMMM: m&m!(nessuna modifica)

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

Si noti che i risultati dovrebbero essere identici, indipendentemente da come è organizzato l'argomento, ad esempio ing pro m no am grdovrebbero produrre gli stessi risultati di cui sopra.

Vince il codice più breve in byte.


Possiamo prendere la "discussione geobitsizing" come una matrice? ad es.["no", "pro", "gr", "am", "m", "ing"]
Downgoat,

@Upgoat Siamo spiacenti ma no.
Calvin's Hobbies,

@Upgoat Prova \\b${l}(\\S+)anche se ti costa 5 byte.
Neil,

3
-1 per il requisito di input arbitrario di una stringa separata da spazio.
AdmBorkBork,

2
Suggerita test case: abra cadabra, !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~che dovrebbe coprire tutti i casi limite, e ci sono un sacco di loro, se si cercherà di utilizzare espressioni regolari ...
Dennis

Risposte:


6

Gelatina , 18 byte

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

Provalo online!

Versione alternativa, 15 byte (non competitiva)

La funzione case title di Jelly aveva un bug; non ha scritto in maiuscolo la prima parola. Ciò è stato risolto, quindi ora funziona come segue.

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

Questo codice funziona come nella versione concorrente, tranne per il fatto che Œt(case del titolo) sostituisce il maiuscolo condizionale ottenuto da Œu1¦€.

Come funziona

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

5

Python 3, 71 byte

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

Provalo su Ideone .

Come funziona

In Python 3 , il built-in str.translateaccetta una stringa e un dizionario e sostituisce ogni carattere nella stringa il cui punto di codice è una chiave di quel dizionario con il valore corrispondente, che può essere una stringa, un numero intero o Nessuno (equivalente al stringa vuota).

La conversione della stringa di parole w in maiuscolo (ovvero, la maiuscola della prima lettera di ogni parola) e l'aggiunta al risultato di w+' 'crea una stringa di parole separate da spazio con la versione maiuscola e minuscola (prima lettera). Senza un secondo argomento, si str.splitdivide in spazi bianchi, quindi (w+' '+w.title()).split()crea l' elenco di tutte le parole.

Infine, la comprensione del dizionario {ord(t[0]):t for t in...}trasforma ogni parola t in una voce di dizionario con chiave ord(t[0])(punto di codice della prima lettera) e valore t , quindi str.translateeseguirà le sostituzioni previste.


3

Python, 126 99 95 81 byte

Molte grazie 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: non è necessario aggiungere a un temporaneo

Modifica2: Spuò contenere lettere maiuscole ...

Edit3: non duplicare G

Edit4: compresso un po 'di più e inserito in una riga

Edit5: usando un lambda senza nome e j=join' '



2

Vim, 46 sequenze di tasti

Brutto e Hacky.

A <esc>:s/\<\w/:%s\/\0\\c\/\\0/g<cr>:s/ /eg<C-v><Cr>/g<cr>dgg@"

Perché non in V? D:
Downgoat,

@Upgoat Causa è un casino.
DJMcMayhem


2

Pyth, 18 16

MsXGhMJcjdrBH3)J

Provalo qui

Definisce una funzione gche esegue il geobitsising. Come programma questo sarebbe un po 'più breve se la seconda stringa è a riga singola, ma l'input multilinea non ne vale la pena:

sXwhMJcjdrBz3)J

L'idea generale qui era di assegnare un titolo alla stringa geobitsiana e aggiungerla alla stringa originale. Quindi suddividilo negli spazi e per ogni stringa, prendi la prima lettera e mappala sulla stringa che rappresenta. In questo modo Xtrasformerà la prima lettera di ogni parola nella parola completa.


Hai appena ... superato Dennis?
Bojidar Marinov,

@BojidarMarinov Se conti Dennis usando un'altra lingua che conteneva un bug come outgolfing, allora sì;)
FryAmTheEggman

2

Python 2, 83 78 byte

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

Provalo su Ideone .

Come funziona

Esaminiamo tutti i caratteri c nella stringa s .

Anticipiamo uno spazio alla stringa di parole w , quindi cerchiamo un'occorrenza di c minuscola , preceduta da uno spazio.

  • Se esiste una tale occorrenza, findverrà restituito l'indice dello spazio nella stringa ' '+w, che corrisponde all'indice di c in w .

    w[...:]restituisce quindi la coda di w , a partire dalla parola con la prima lettera c . split()divide la coda negli spazi, [0]seleziona il primo pezzo (la parola) e[1:] rimuove la sua prima lettera.

    Dopo aver anteposto c al risultato precedente, otteniamo la parola corretta che inizia con c .

  • Se nessuna parola inizia con c , findrestituirà -1 .

    Quindi, w[...:]produce l'ultimo carattere di w , lo split()avvolge in un array, [0]annulla il wrapping e[1:] rimuove l'unico carattere dalla stringa.

    Dopo aver anteposto c , otteniamo la stringa singleton il cui carattere è c , quindi l'intera operazione è no-op.

Infine, ''.joinconcatena tutte le stringhe risultanti, restituendo la versione geobitsized di s .



1

CJam, 19 byte

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

Provalo qui.

Spiegazione

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.

1

JavaScript ES6, 67 63 70 byte

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

Prova questo su Firefox. i bug lo rendono più lungo di quanto mi piacerebbe

Spiegazione

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
   });
}

f("abracadabra")("1Dbw")ritorna "1abracadabraDbracadabrababracadabrawbracadabra".
Dennis,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.