Geobitsianische Sprache

16

Geobitsianische Sprache ist eine neue Perversion des Englischen, bei der ein Wort in Segmente unterteilt wird, die jeweils mit einem anderen Buchstaben beginnen müssen. Jedes Mal, wenn einer dieser Anfangsbuchstaben in einer anderen Zeichenfolge erscheint, wird er durch das gesamte entsprechende Segment ersetzt, wobei die Großschreibung beibehalten wird.

Dieser Vorgang wird als Geobitsizing bezeichnet .

Zum Beispiel könnte man in das Wort " Geobits " geo bitsund in das Unsinnsgedicht einbrechen

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

wäre damit geobitsized als

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

denn jeder gwird geo, jeder G(obwohl es keine gibt) wird Geo, jeder bwird bitsund jeder Bwird Bits.

Beachten Sie, dass jede Ersetzung in Bezug auf die ursprüngliche Zeichenfolge ausgeführt wird, nicht in Bezug auf einen Zwischenschritt. zB wenn geogewesen war gbostattdessen die b‚s erstellt würde nicht ersetzt bits.

Herausforderung

Schreiben Sie ein Programm oder eine Funktion, die Geobitsianische Sprache erzeugen kann.

Nehmen Sie eine einzeilige Zeichenfolge aus Kleinbuchstaben (az) und Leerzeichen auf. Dies ist das Wort, das als Geobitsizing-Argument verwendet wird, wobei die Leerzeichen die Segmente trennen. Sie können annehmen:

  • Segmente werden nicht leer sein. Leerzeichen werden also weder einander benachbart noch am Anfang oder Ende der Zeichenfolge stehen.
  • Jedes Segment beginnt mit einem anderen Buchstaben. Es können also nicht mehr als 26 sein.

Zum Beispiel sind einige gültige segmentierten Strings Sie unterstützen müssen geo bits, butt ner, alex, und do o r k nob(Einzelbuchstaben - Segmente haben keine Wirkung , sondern sind gültig). Aber geo , butt ner, Alex, und do o r k n obsind ungültig.

Ihr Programm oder Ihre Funktion muss auch eine andere beliebige Zeichenfolge aufnehmen, um das Geobitsizing anzuwenden und die resultierende geobitsische Sprache zu drucken oder zurückzugeben.

  • Sie können davon ausgehen, dass diese Zeichenfolge nur Zeilenumbrüche und druckbare ASCII-Zeichen enthält.

  • Denken Sie daran, dass die Groß- und Kleinschreibung von der Eingabe bis zur Ausgabe beibehalten werden muss.

Hier sind einige weitere Beispiele, no pro gr am m ingdie das Geobitsizing-Argument verwenden:

[empty string][empty string]

iing

IIng

Mmmm, mmm... MmmmMMM: m&m!Mmmm, mmm... MmmmMMM: m&m!(keine Änderung)

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

Beachten Sie, dass die Ergebnisse unabhängig von der Anordnung des Arguments identisch sein sollten, z. B. ing pro m no am grdieselben Ergebnisse wie oben liefern sollten.

Der kürzeste Code in Bytes gewinnt.

Calvins Hobbys
quelle
Können wir das "Geobitsizing-Argument" als Array verwenden? zB["no", "pro", "gr", "am", "m", "ing"]
Downgoat
@Upgoat Sorry, aber nein.
Calvins Hobbys
@Upgoat Versuchen Sie, \\b${l}(\\S+)obwohl das 5 Bytes kostet.
Neil
3
-1 für die Eingabe einer durch Leerzeichen getrennten Zeichenfolge.
AdmBorkBork
2
Empfohlene Testfall: abra cadabra, !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~soll , dass alle Grenzfälle abdecken, und es gibt viele von ihnen , wenn man versucht , reguläre Ausdrücke zu verwenden ...
Dennis

Antworten:

6

Jelly , 18 Bytes

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

Probieren Sie es online!

Alternative Version, 15 Bytes (nicht konkurrierend)

Jellys Titel-Case-Funktion hatte einen Fehler; Das erste Wort wurde nicht groß geschrieben. Das wurde behoben, daher funktioniert das Folgende jetzt.

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

Dieser Code verhält sich wie in der Konkurrenzversion, mit der Ausnahme, dass Œt(Groß- und Kleinschreibung) die bedingte Großschreibung von ersetzt Œu1¦€.

Wie es funktioniert

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

Python 3, 71 Bytes

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

Teste es auf Ideone .

Wie es funktioniert

In Python 3 verwendet die integrierte Funktion str.translateeine Zeichenfolge und ein Wörterbuch und ersetzt jedes Zeichen in der Zeichenfolge, dessen Codepunkt ein Schlüssel dieses Wörterbuchs ist, durch den entsprechenden Wert. Dies kann eine Zeichenfolge, eine Ganzzahl oder Keine sein (entspricht der Zeichenfolge) leerer String).

Durch Konvertieren der Wortfolge w in Groß- und Kleinschreibung (dh Großschreibung des ersten Buchstabens jedes Wortes) und Anhängen an das Ergebnis von w+' 'wird eine Folge von durch Leerzeichen getrennten Wörtern mit Klein- und Großbuchstaben (erster Buchstabe) erstellt. Teilt sich ohne ein zweites Argument str.splitmit Leerzeichen, so (w+' '+w.title()).split()wird die Liste aller Wörter erstellt.

Schließlich {ord(t[0]):t for t in...}verwandelt das Wörterbuchverständnis jedes Wort t in einen Wörterbucheintrag mit Schlüssel ord(t[0])(Codepunkt des ersten Buchstabens) und Wert t , str.translateum die beabsichtigten Substitutionen durchzuführen.

Dennis
quelle
3

Python, 126 99 95 81 Bytes

Vielen Dank an 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: muss nicht an ein temporäres angehängt werden

Edit2: Skann Großbuchstaben enthalten ...

Edit3: Dupliziere G nicht

Edit4: etwas mehr komprimiert und in eine Zeile geschoben

Edit5: mit unbenanntem Lambda und j=join' '

Karl Napf
quelle
2

Pyth, 19 Bytes

.rzsC_hMBsm,rd0rd3c

Probieren Sie es online!

Undichte Nonne
quelle
1
Wir können das Geobitsizing-Argument leider nicht als Array betrachten
Downgoat
Sorry, habe es nicht bemerkt.
Undichte Nonne
2

Vim, 46 Tastenanschläge

Hässlich und Hacky.

A <esc>:s/\<\w/:%s\/\0\\c\/\\0/g<cr>:s/ /eg<C-v><Cr>/g<cr>dgg@"
DJMcMayhem
quelle
Warum nicht in V? D:
Downgoat
@Upgoat Weil es ein buggy Durcheinander ist.
DJMcMayhem
2

Netzhaut , 36 Bytes

Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.

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

Probieren Sie es online!

Martin Ender
quelle
2

Pyth, 18 16

MsXGhMJcjdrBH3)J

Probieren Sie es hier aus

Definiert eine Funktion g, die das Geobitsising durchführt. Als Programm wäre dies etwas kürzer, wenn der zweite String einzeilig wäre, aber eine mehrzeilige Eingabe ist es nicht wert:

sXwhMJcjdrBz3)J

Die allgemeine Idee dabei war, die Geobitsian-Zeichenfolge als Groß- / Kleinschreibung zu bezeichnen und an die ursprüngliche Zeichenfolge anzuhängen. Teilen Sie dies in Leerzeichen auf und ordnen Sie für jede Zeichenfolge den ersten Buchstaben der entsprechenden Zeichenfolge zu. Auf diese Weise Xwird der erste Buchstabe jedes Wortes in das vollständige Wort umgewandelt.

FryAmTheEggman
quelle
Hast du gerade ... Outgolf Dennis?
Bojidar Marinov
@BojidarMarinov Wenn Sie Dennis mit einer anderen Sprache zählen, in der ein Fehler aufgetreten ist, dann ja;)
FryAmTheEggman
2

Python 2, 83-78 Bytes

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

Teste es auf Ideone .

Wie es funktioniert

Wir iterieren über alle Zeichen c in der Zeichenfolge s .

Wir stellen der Wortfolge w ein Leerzeichen voran und suchen dann nach einem Vorkommen von c in Kleinbuchstaben , dem ein Leerzeichen vorausgeht.

  • Wenn ein solches Vorkommen vorliegt, findwird der Index des Leerzeichens in der Zeichenfolge zurückgegeben ' '+w, der mit dem Index von c in w übereinstimmt .

    w[...:]gibt also den Schwanz von w zurück , beginnend mit dem Wort mit dem ersten Buchstaben c . split()Teilt den Schwanz in Leerzeichen, [0]wählt den ersten Teil (das Wort) aus und [1:]entfernt den ersten Buchstaben.

    Nach dem Voranstellen von c vor dem vorherigen Ergebnis erhalten wir das Wort mit der korrekten Schreibweise , das mit c beginnt .

  • Wenn kein Wort mit c beginnt , findwird -1 zurückgegeben .

    Somit w[...:]ergibt das letzte Zeichen von w , split()wickelt es in einer Anordnung, [0]rückgängig macht die Umhüllung, und [1:]entfernt das einzig Zeichen aus der Zeichenfolge.

    Nachdem wir c vorangestellt haben , erhalten wir den Singleton-String, dessen Zeichen c ist , sodass die gesamte Operation ein No-Op ist.

Schließlich ''.joinverkettet alle resultierenden Strings, die Geobitsized Version der Rückkehr s .

Dennis
quelle
1

CJam, 19 Bytes

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

Teste es hier.

Erläuterung

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

JavaScript ES6, 67 63 70 Bytes

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

Testen Sie dies in Firefox. Fehler machen dies länger als ich möchte

Erläuterung

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
quelle
f("abracadabra")("1Dbw")kehrt zurück "1abracadabraDbracadabrababracadabrawbracadabra".
Dennis
0

Ruby, 65 60 58 Bytes

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

Probieren Sie es online!

Wert Tinte
quelle