Геобицианский язык


16

Геобицианский язык - это новое извращение английского языка, где слово разбивается на сегменты, каждый из которых должен начинаться с другой буквы. Затем каждый раз, когда одна из этих начальных букв появляется в другой строке, она заменяется всем соответствующим сегментом, сохраняя заглавные буквы.

Этот процесс называется Geobitsizing .

Например, слово « Geobits » может быть взломаноgeo bits , и бессмысленное стихотворение

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

будет Geobitsized с ним как

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

потому что каждый gстановится geo, каждый G(хотя их нет) становится Geo, каждый bстановится bits, и каждый Bстановится Bits.

Обратите внимание, что каждая замена выполняется относительно исходной строки, а не какого-либо промежуточного шага. например, если geoбы gboвместо этого bсозданный объект не был бы заменен на bits.

Вызов

Напишите программу или функцию, которая может генерировать геобитский язык.

Возьмите одну строку из строчных букв (az) и пробелов. Это будет слово, используемое в качестве аргумента Geobitsizing, с пробелами, разделяющими сегменты. Вы можете предположить:

  • Сегменты не будут пустыми. Таким образом, пробелы не будут соседствовать друг с другом и не будут находиться в начале или конце строки.
  • Каждый сегмент начинается с другой буквы. Таким образом, не может быть больше 26.

Например, некоторые действительные сегментированные строки , которые вы должны поддерживать это geo bits, butt ner, alex, и do o r k nob(отдельные сегменты письма не имеют никакого эффекта , но действуют). Но geo , butt ner, Alexи do o r k n obявляются недействительными.

Ваша программа или функция также должна принять другую произвольную строку, чтобы применить геобитизирование к, и напечатать или вернуть полученный геобитский язык.

  • Вы можете предположить, что эта строка содержит только переводы строки и печатный ASCII.

  • Помните, что буквенные регистры должны быть сохранены от входа до выхода.

Вот еще несколько примеров использования no pro gr am m ingв качестве аргумента Geobitsizing:

[empty string][empty string]

iing

IIng

Mmmm, mmm... MmmmMMM: m&m!Mmmm, mmm... MmmmMMM: m&m!(без изменений)

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

Обратите внимание, что результаты должны быть идентичны независимо от того, как устроен аргумент, например, ing pro m no am grдолжны давать те же результаты, что и выше.

Самый короткий код в байтах побеждает.


Можем ли мы принять «аргумент геобитизации» как массив? например["no", "pro", "gr", "am", "m", "ing"]
Downgoat

@ Upgoat Извините, но нет.
Увлечения Кэлвина

@ Upgoat Попробуйте, \\b${l}(\\S+)хотя это стоит 5 байт.
Нил

3
-1 для произвольного требования ввода строки, разделенной пробелом.
AdmBorkBork

2
Похожий тест: abra cadabra, !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Это должно охватывать все крайние случаи, и есть много из них , если кто -то пытается использовать регулярные выражения ...
Dennis

Ответы:


6

Желе , 18 байт

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

Попробуйте онлайн!

Альтернативная версия, 15 байт (не конкурирует)

У функции case в Jelly есть ошибка; это не стало заглавной буквой первого слова. Это было исправлено, поэтому теперь работает следующее.

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

Этот код делает то же самое, что и в конкурирующей версии, за исключением того, что Œt(регистр заголовка) заменяет условный верхний регистр, достигнутый с помощью Œu1¦€.

Как это устроено

ṣ⁶;Œ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 байт

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

Проверьте это на Ideone .

Как это устроено

В Python 3 встроенный str.translateпринимает строку и словарь и заменяет каждый символ в строке, кодовая точка которого является ключом этого словаря, соответствующим значением, которое может быть строкой, целым числом или None. (эквивалентно пустая строка).

Преобразование строки слов w в регистр заглавия (т. w+' 'Е. Использование заглавных букв в первой букве каждого слова) и добавление ее к результату создает строку слов, разделенных пробелом, с прописной и строчной версией (первая буква). Без второго аргумента str.splitразделяется пробелами, поэтому (w+' '+w.title()).split()создает список всех слов.

Наконец, словарное понимание {ord(t[0]):t for t in...}превращает каждое слово t в словарную запись с ключом ord(t[0])(кодовая точка первой буквы) и значением t , поэтому str.translateбудут выполняться предполагаемые замены.


3

Питон, 126 99 95 81 байт

Большое спасибо Деннису:

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: не нужно добавлять к временному

Edit2: S может содержать заглавные буквы ...

Edit3: не дублировать G

Edit4: сжал немного больше и сдвинул его в одну строку

Edit5: используя неназванную лямбду и j=join' '



2

Vim, 46 нажатий клавиш

Гадкий и Хаки.

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

Почему не в V? D:
Слабый

@ Upgoat Потому что это гадкий беспорядок.
DJMcMayhem


2

Pyth, 18 16

MsXGhMJcjdrBH3)J

Попробуй здесь

Определяет функцию, gкоторая выполняет геобицизацию. Как программа это будет немного короче, если вторая строка будет одной строкой, но многострочный ввод не стоит:

sXwhMJcjdrBz3)J

Общая идея здесь состояла в том, чтобы назвать регистр строки геобицита и добавить его к исходной строке. Затем разделите это на пробелы и для каждой строки возьмите первую букву и сопоставьте ее со строкой, которую она представляет. Таким образом X, первая буква каждого слова превратится в полное слово.


Ты только ... опередил Денниса?
Божидар Маринов

@BojidarMarinov Если вы считаете, что Деннис использует какой-то другой язык, в котором есть ошибка, как вне игры, тогда да;)
FryAmTheEggman

2

Python 2, 83 78 байт

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

Проверьте это на Ideone .

Как это устроено

Мы перебираем все символы c в строке s .

Мы добавляем пробел к строке слов w , затем ищем вхождение строчной буквы c , которому предшествует пробел.

  • Если такое вхождение существует, findвернет индекс пробела в строке ' '+w, который соответствует индексу c в w .

    w[...:]таким образом возвращает хвост w , начиная со слова с первой буквой c . split()разбивает хвост на пробелы, [0]выделяет первый фрагмент (слово) и [1:]удаляет его первую букву.

    После добавления c к предыдущему результату, мы получаем правильно набранное слово, которое начинается с c .

  • Если нет слова начинается с с ,find вернет -1 .

    Таким образом, w[...:]дает последний символ w ,split() упаковывает его в массив, [0]отменяет перенос и[1:] удаляет единственный символ из строки.

    После добавления c мы получаем строку-одиночку с символом c , поэтому вся операция не выполняется.

Наконец, ''.joinобъединяет все получающиеся строки, возвращая версию Geobitsized s .



1

CJam, 19 байтов

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

Проверьте это здесь.

объяснение

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 байт

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

Проверьте это на Firefox. ошибки делают это дольше, чем хотелось бы

объяснение

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")возвращается "1abracadabraDbracadabrababracadabrawbracadabra".
Деннис

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.