Język geobitsian

16

Język geobitsian to nowa perwersja języka angielskiego, w której słowo jest podzielone na segmenty, z których każdy musi zaczynać się od innej litery. Następnie za każdym razem, gdy jedna z tych liter początkowych pojawia się w innym ciągu, jest ona zastępowana przez cały odpowiadający jej segment, zachowując wielkie litery.

Ten proces nazywa się Geobitsizing .

Na przykład słowo „ Geobity ” może zostać rozbite geo bits, a także nonsensowny wiersz

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

byłby z nim geobitsized jako

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

ponieważ każdy gstaje się geo, każdy G(chociaż nie ma) staje się Geo, każdy bstaje się bitsi każdy Bstaje się Bits.

Zauważ, że każde podstawienie jest wykonywane względem oryginalnego łańcucha, a nie żadnego kroku pośredniego. np. gdyby geobył gbozamiast, bstworzone nie zastąpiłoby bits.

Wyzwanie

Napisz program lub funkcję, która może generować język geobitsian.

Weź jednowierszowy ciąg złożony z małych liter (az) i spacji. Będzie to słowo użyte jako argument Geobitsizing, ze spacjami oddzielającymi segmenty. Możesz założyć:

  • Segmenty nie będą puste. Dlatego spacje nie będą się ze sobą sąsiadować ani znajdować na początku ani na końcu łańcucha.
  • Każdy segment zaczyna się od innej litery. Zatem nie może być więcej niż 26.

Na przykład, niektóre ważne ciągi segmentowe należy wspierać to geo bits, butt ner, alex, i do o r k nob(pojedyncze segmenty nas nie mają żadnego wpływu, ale są ważne). Ale geo , butt ner, Alex, i do o r k n obsą nieważne.

Twój program lub funkcja musi również pobrać inny dowolny ciąg znaków, aby zastosować Geobitsizing i wydrukować lub zwrócić wynikowy język Geobitsian.

  • Możesz założyć, że ten ciąg zawiera tylko znaki nowej linii i ASCII do wydruku.

  • Pamiętaj, że litery należy zachować od danych wejściowych do wyjściowych.

Oto kilka przykładów wykorzystujących no pro gr am m ingjako argument Geobitsizing:

[empty string][empty string]

iing

IIng

Mmmm, mmm... MmmmMMM: m&m!Mmmm, mmm... MmmmMMM: m&m!(bez zmian)

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

Zauważ, że wyniki powinny być identyczne bez względu na sposób ułożenia argumentu, np. ing pro m no am grPowinny dawać takie same wyniki jak powyżej.

Najkrótszy kod w bajtach wygrywa.

Hobby Calvina
źródło
Czy możemy potraktować „argument Geobitsizing” jako tablicę? np.["no", "pro", "gr", "am", "m", "ing"]
Downgoat
@Upgoat Przepraszamy, ale nie.
Calvin's Hobbies
@Upgoat Spróbuj, \\b${l}(\\S+)chociaż kosztuje to 5 bajtów.
Neil
3
-1 dla dowolnego wymagania wejściowego dla łańcucha rozdzielanego spacjami.
AdmBorkBork
2
Sugerowana przypadek testowy: abra cadabra, !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~To powinno obejmować wszystkie przypadki krawędzi, a istnieje wiele z nich, jeśli ktoś próbuje użyć regexes ...
Dennis

Odpowiedzi:

6

Galaretka , 18 bajtów

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

Wypróbuj online!

Alternatywna wersja, 15 bajtów (niekonkurująca)

Błąd funkcji tytułowej Jelly miał błąd; nie użyła pierwszego słowa. Zostało to naprawione, więc teraz działa teraz.

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

Ten kod działa tak samo jak w wersji konkurencyjnej, z tym wyjątkiem, że Œt(przypadek tytułu) zastępuje warunkową górną obudowę osiągniętą przez Œu1¦€.

Jak to działa

ṣ⁶;Œ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
źródło
5

Python 3, 71 bajtów

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

Przetestuj na Ideone .

Jak to działa

W Pythonie 3 wbudowane str.translatepobiera ciąg i słownik i zastępuje każdy znak w ciągu, którego punktem kodowym jest klucz tego słownika, odpowiednią wartością, która może być ciągiem, liczbą całkowitą lub Brakiem (odpowiednik parametru pusta struna).

Konwersja ciągu słów w na wielkość liter (tj. Pisanie wielką literą każdego słowa) i dołączanie go do wyniku w+' 'powoduje utworzenie ciągu słów oddzielonych spacjami w wersji z małymi i dużymi literami (pierwsza litera). Bez drugiego argumentu str.splitdzieli się na białe znaki, więc (w+' '+w.title()).split()tworzy listę wszystkich słów.

Wreszcie, zrozumienie słownika {ord(t[0]):t for t in...}zamienia każde słowo t w pozycję słownika z kluczem ord(t[0])(punkt kodowy pierwszej litery) i wartością t , więc str.translatewykona zamierzone podstawienia.

Dennis
źródło
3

Python, 126 99 95 81 bajtów

Ogromne podziękowania dla Dennisa:

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

Edycja1: nie trzeba dołączać do tymczasowego

Edycja2: Smoże zawierać wielkie litery ...

Edycja3: nie powielaj G

Edit4: nieco bardziej skompresowany i przesunięty w jedną linię

Edycja5: używając nienazwanej lambda i j=join' '

Karl Napf
źródło
2

Pyth, 19 bajtów

.rzsC_hMBsm,rd0rd3c

Wypróbuj online!

Leaky Nun
źródło
1
Niestety nie możemy traktować argumentu o geobitalizacji jako tablicy
Downgoat
Przepraszam, nie zauważyłem.
Leaky Nun
2

Vim, 46 naciśnięć klawiszy

Brzydki i Hacky.

A <esc>:s/\<\w/:%s\/\0\\c\/\\0/g<cr>:s/ /eg<C-v><Cr>/g<cr>dgg@"
DJMcMayhem
źródło
Dlaczego nie w V? D:
Downgoat
@Upgoat Bo to jest błędny bałagan.
DJMcMayhem
2

Siatkówka , 36 bajtów

Liczba bajtów zakłada kodowanie ISO 8859-1.

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

Wypróbuj online!

Martin Ender
źródło
2

Pyth 18 16

MsXGhMJcjdrBH3)J

Wypróbuj tutaj

Definiuje funkcję, gktóra wykonuje geobitsising. Jako program byłby nieco krótszy, gdyby drugi ciąg był jednym wierszem, ale wejście wielowierszowe nie jest tego warte:

sXwhMJcjdrBz3)J

Ogólny pomysł polegał na tym, aby tytuł tytułu ciąg geobitsian i dołączyć go do oryginalnego ciągu. Następnie podziel to na spacje i dla każdego łańcucha, weź pierwszą literę i zamapuj ją na łańcuch, który reprezentuje. W ten sposób Xpierwsza litera każdego słowa zamieni się w pełne słowo.

FryAmTheEggman
źródło
Czy właśnie ... wygrałeś Dennisa?
Bojidar Marinov
@BojidarMarinov Jeśli policzysz Dennisa za pomocą innego języka, w którym był błąd, jako outgolfing, to tak;)
FryAmTheEggman
2

Python 2, 83 78 bajtów

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

Przetestuj na Ideone .

Jak to działa

Iterujemy wszystkie znaki c w ciągu s .

Wstawiamy spację do ciągu słów w , a następnie szukamy wystąpienia małej litery c , poprzedzonej spacją.

  • Jeśli takie zjawisko istnieje, findzwróci indeks przestrzeni w ciąg ' '+w, który pasuje do indeksu C w szer .

    w[...:]zwraca zatem ogon w , zaczynając od słowa z pierwszą literą c . split()dzieli ogon w odstępach, [0]wybiera pierwszą porcję (słowo) i [1:]usuwa pierwszą literę.

    Po dodaniu c do poprzedniego wyniku, otrzymujemy poprawnie wstawione słowo, które zaczyna się od c .

  • Jeśli żadne słowo nie zaczyna się na c , findzwraca -1 .

    W ten sposób w[...:]otrzymuje się ostatni znak w , split()zawija je w tablicy, [0]cofa opakowanie i [1:]usuwa tylko znak z łańcucha.

    Po dodaniu c otrzymujemy ciąg singletonu, którego znak to c , więc cała operacja nie działa.

Na koniec ''.joinkonkatenuje wszystkie powstałe ciągi, zwracając wersję s Geobitsized .

Dennis
źródło
1

CJam, 19 bajtów

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

Sprawdź to tutaj.

Wyjaśnienie

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
źródło
1

JavaScript ES6, 67 63 70 bajtów

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

Przetestuj to w przeglądarce Firefox. robaki powodują, że trwa to dłużej niż chciałbym

Wyjaśnienie

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
źródło
f("abracadabra")("1Dbw")zwraca "1abracadabraDbracadabrababracadabrawbracadabra".
Dennis
0

Rubin, 65 60 58 bajtów

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

Wypróbuj online!

Wartość tuszu
źródło