Мова Геобіцяна


16

Мова геобіцянів - це нова перекрута англійської мови, де слово розбивається на відрізки, які кожен повинен починати з іншої літери. Потім кожного разу, коли одна з цих початкових літер з’являється в іншому рядку, вона замінюється на весь відповідний її відрізок, зберігаючи великі літери.

Цей процес називається Geobitsizing .

Наприклад, слово " Геобіц " може бути розбито 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є недійсними.

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

  • Ви можете припустити, що цей рядок містить лише нові рядки та 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"]
Пуховик

@Upgoat Вибачте, але ні.
Хобі Кальвіна

@Upgoat Спробуйте, \\b${l}(\\S+)хоча це коштує вам 5 байт.
Ніл

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

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

Відповіді:


6

Желе , 18 байт

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

Спробуйте в Інтернеті!

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

Функція випадку заголовка 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

Вім, 46 натискань клавіш

Потворний і Хаккі.

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

Чому б не в V? Д:
Пуховик

@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 , тому вся операція є неоперативною.

Нарешті, ''.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.