ジオビット言語


16

Geobitsian言語は英語の新しい倒錯であり、単語はそれぞれが異なる文字で始まる必要があるセグメントに分割されます。次に、それらの開始文字の1つが別の文字列に現れるたびに、対応するセグメント全体に置き換えられ、大文字が使用されます。

このプロセスは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、すべてbbitsになり、すべてがにBなりBitsます。

各置換は、中間ステップではなく、元の文字列に対して実行されることに注意してください。たとえば、代わりに作成されgeoていた場合gbob作成されたはに置き換えられませんbits

チャレンジ

Geobitsian言語を生成できるプログラムまたは関数を作成します。

小文字(az)とスペースで構成される1行の文字列を取得します。これは、セグメントを区切るスペースを使用して、ジオビット化引数として使用される単語になります。あなたは仮定することができます:

  • セグメントは空になりません。そのため、スペースは互いに隣接せず、文字列の先頭または末尾にありません。
  • 各セグメントは異なる文字で始まります。したがって、26を超えることはできません。

たとえば、あなたがサポートしなければならないいくつかの有効なセグメント化された文字列はgeo bitsbutt neralex、およびdo o r k nob(単一文字のセグメントは影響を与えませんが、有効です)。しかしgeo butt nerAlex、およびdo o r k n ob無効です。

また、プログラムまたは関数は、別の任意の文字列を取得して、ジオビット化を適用し、結果のジオビット言語を印刷または返す必要があります。

  • この文字列には、改行と印刷可能なASCIIのみが含まれると想定できます。

  • 入力から出力まで大文字小文字を保存する必要があることに注意してください。

no pro gr am m ingGeobitsizing引数として使用するいくつかの例を次に示します。

[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{|}~それはすべてのエッジケースをカバーする必要があり、1回の試行は、正規表現を使用する場合は、それらの多くがあります...
デニス

回答:


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+' 'スペースで区切られた単語の小文字と大文字のバージョン(最初の文字)を作成します。2番目の引数がない場合、str.split空白で分割されるため、すべての単語のリスト(w+' '+w.title()).split()作成されます。

最後に、辞書理解は、{ord(t[0]):t for t in...}各ワードオンTのキーを持つ辞書エントリにord(t[0])(最初の文字のコードポイント)と値Tので、str.translate意図した置換を実行します。


3

Python、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大文字を含めることができます...

編集3:Gを複製しないでください

Edit4:もう少し圧縮して1行に押し込んだ

Edit5:名前のないラムダと j=join' '



2

Vim、46回のキーストローク

Uい、そしてハッキー。

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

なぜVではないのですか?D:
Downgoat

@Upgoat原因はバグだらけの混乱です。
DJMcMayhem


2

Pyth、 18 16

MsXGhMJcjdrBH3)J

ここで試してみてください

gジオビット化を実行する関数を定義します。プログラムとしては、2番目の文字列が1行の場合、これは少し短くなりますが、複数行の入力には価値がありません。

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でテストします。

使い方

文字列sのすべての文字cを反復処理します。

単語の文字列wの前にスペースを追加し、スペースが先行する小文字のcの出現を検索します。

  • そのようなオカレンスが存在する場合、wcのインデックスと一致するfind文字列のスペースのインデックスを返します。' '+w

    w[...:]したがって、最初の文字cで始まる単語から始まるwの末尾を返します。テールをスペースで分割し、最初のチャンク(単語)を選択して、最初の文字を削除します。split()[0][1:]

    前の結果の前にcを追加した後、cで始まる正しく大文字と小文字を区別した単語を取得します

  • cで始まる単語がない場合、-1findを返します。

    したがって、ww[...:]の最後の文字を生成し、配列にラップし、折り返しを取り消して、文字列から唯一の文字を削除します。split()[0][1:]

    cを先頭に追加した後、文字がcであるシングルトン文字列を取得します。したがって、操作全体はノーオペレーションです。

最後に、''.join結果の文字列をすべて連結し、sの Geobitsizedバージョンを返します。



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"
デニス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.