Codegolf - Geobitsian Language

  • Автор темы Jared
  • Обновлено
  • 21, Oct 2024
  • #1

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

Этот процесс называется Геобитсайзинг.

Например, слово «Геобиты"можно разбить на

 
 
 
 ing pro m no am gr 
, and the nonsense poem

Proet am Prouproproy Groogrle Wingkingproedingam

будет геобитизирован с ним как

Pet a Puppy Google Wikipedia

потому что каждый Proeoprole thingnok bamnoamnoams amre grreamt, dono't you? becomes People think bananas are great, don't you? , каждый Mmmm, mmm... MmmmMMM: m&m! (though there are none) becomes Mmmm, mmm... MmmmMMM: m&m! , каждый Ing becomes I и каждый ing becomes i .

Обратите внимание, что каждая замена выполняется относительно исходной строки, а не какого-либо промежуточного шага. например если [empty string] had been [empty string] вместо этого, no pro gr am m ing 's created would not replaced with do o r k n ob .

Испытание

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

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

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

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

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

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

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

Вот еще несколько примеров использования b as the Geobitsizing argument:

gbogeo

BitsB

bitsb

GeoG (без изменений)

geog

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

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

Обратите внимание, что результаты должны быть идентичными независимо от того, как устроен аргумент, например. geo bits should yield the same results as above.

Выигрывает самый короткий код в байтах.

#код-гольф #строка

Jared


Рег
01 Feb, 2011

Тем
64

Постов
184

Баллов
554
  • 26, Oct 2024
  • #2

Желе, 18 байты

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

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

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

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

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

Этот код делает то же самое, что и конкурирующая версия, за исключением того, что g=>s=>s.replace(/\S/g,l=>l+(g.match(`\\b\\${l}(\\S+)`,'i')||[,""])[1]) (title case) replaces the conditional uppercasing achieved by 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. .

Как это работает

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

Питон 3, 71 байт

w%s=prod(c->"$c"join((W=w|>split)[find(t->t[1]==c|' ',W)])[2:end],s)

Проверьте это на идея.

Как это работает

На Python 3, встроенный ''.join takes a string and a dictionary, and replaces each character in the string whose code point is a key of that dictionary with the corresponding value, which may be a string, an integer or Никто (эквивалент пустой строки).

Преобразование строки слов ш в заголовок (т. е. используя заглавную букву каждого слова) и добавляя ее к результату [1:] creates a string of space separated words with lower- and uppercase version (first letter). Without a second argument, [0] разбивается на пробелы, поэтому split() creates the список всех слов.

Наконец, понимание словаря w[...:] turns each word т в словарную статью с ключом find (code point of the first letter) and value т, так [1:] will perform the intended substitutions.

 

Hosesulleyvon39


Рег
06 Feb, 2018

Тем
73

Постов
187

Баллов
572
  • 26, Oct 2024
  • #3

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

Огромное спасибо Денису:

[0]

Edit1: не нужно добавлять во временный

Редактировать2: split() may contain uppercase...

Edit3: не дублируйте G

Edit4: еще немного сжал и поместил в одну строку.

Edit5: использование безымянной лямбды и w[...:]

 

Vitek16


Рег
17 Mar, 2020

Тем
83

Постов
189

Баллов
634
  • 26, Oct 2024
  • #5

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

Уродливый и Хаки.

find ||answer||

сетчатка, 36 байт

Подсчет байтов предполагает кодировку ISO 8859-1.

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

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

 

Wowgreat2u


Рег
23 Jul, 2012

Тем
67

Постов
179

Баллов
524
  • 26, Oct 2024
  • #6

Пиф, 18 16

X

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

Определяет функцию sXwhMJcjdrBz3)J that performs the geobitsising. As a program this would be a bit shorter if the second string is single line, but multiline input isn't worth it:

g

Общая идея здесь заключалась в том, чтобы заглавить строку geobitsian и добавить ее к исходной строке. Затем разделите это на пробелы и для каждой строки возьмите первую букву и сопоставьте ее со строкой, которую она представляет. Таким образом MsXGhMJcjdrBH3)J will turn the first letter of each word into the full word.

 

Oucmbcgp


Рег
19 Jan, 2010

Тем
62

Постов
190

Баллов
540
  • 26, Oct 2024
  • #7

Питон 2, 83 78 байт

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

Проверьте это на идея.

Как это работает

Перебираем все символы с в строке с.

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

  • Если такое явление имеет место, A <esc>:s/\<\w/:%s\/\0\\c\/\\0/g<cr>:s/ /eg<C-v><Cr>/g<cr>dgg@" will return the index of the space in the string .rzsC_hMBsm,rd0rd3c , что соответствует индексу с в ш.

    j=join' ' thus returns the tail of ш, начиная со слова на первую букву с. S splits the tail at spaces, lambda G,S,j=''.join:j(s+j(g[1:]for g in G.split()if g[0]==s.lower())for s in S) выбирает первый фрагмент (слово) и str.translate removes its first letter.

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

  • Если ни одно слово не начинается с с, ord(t[0]) will return -1.

    Таким образом, {ord(t[0]):t for t in...} yields the last character of ш, (w+' '+w.title()).split() wraps it in an array, str.split развязывает обертку и w+' ' removes the only character from the string.

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

Окончательно, str.translate concatenates all resulting strings, returning the Geobitsized version of с.

 

Madsnow


Рег
28 Jun, 2008

Тем
69

Постов
194

Баллов
569
  • 26, Oct 2024
  • #9

CJam, 19 байт

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

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

Объяснение

Œu1¦€ ||answer||

JavaScript ES6, 67 63 70 байт

Œt

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

Объяснение

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

Рубин, 65 60 58 байт

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

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

 

Zuhel


Рег
15 Jul, 2006

Тем
82

Постов
192

Баллов
642
Тем
403,760
Комментарии
400,028
Опыт
2,418,908