人生がレモンを与えたら、レモネードを作りなさい


21

チャレンジ

あなたはどこにでも単語が、入力文字列が与えられます"Lemon"、それはに変換する必要が発見され"Lemonade" たがad、およびe文のどこかから借りなければなりません。


入力例:

子供の頃にレモンを見つけました

出力例:

私は子供の頃レモネードを作りました

レモネードは、元から次の上付き文字を盗んで作成されました

私はフン日間レモネードWH 電子を nは私がいた子供

これは、「e」、「d」、および「a」という可能な出力例の1つにすぎません。これはどこからでも取得できます(もちろん、単語以外はlemon


コメント

•、、またはsが十分eでない場合は、指定された文字で実行可能なことを出力する必要があります。たとえば、入力は出力されますadbdblemonbblemond

lemonテキストは常にスタンドアロン(各側のスペース)であるとは限りません。たとえばlemons、入力のどこかに単語があり、出力は次のようになります。lemonades

•入力にはlemon、0であっても任意の数のsを含めることができますlemon(この場合、出力は入力と同一になります)。

•レモネードを大文字と小文字で作成できます。たとえば、にleMonなる可能性がleMonadeあり、ade借りたものはどのような場合でも可能です(したがって、になる可能性もありますleMonADe)。
あなたが借りた手紙のケースは、あなたがそれを借りたときの状態のままでなければなりません。
(入力例->出力、he hAD lemOn-> h h lemOnADe

•完全なプログラムである必要はありません。機能だけで十分です。

•入力はCP437文字セットのみであると仮定できます。


コードゴルフ

これはであるため、バイト数が最も少なくなります!


擬似テストケース

*注意:特定の入力に対して複数の出力が存在する可能性があるため、プログラムはこれらのテストケースのように正確に出力されない場合があります。これは、人々がロジックを理解できるようにするためです。

入力:EpaD leMons
出力:p LeMonaDEs

入力:hello world
出力:hello world

入力:レモンレモン
出力:レモンレモン
*( 、 文字は別の「レモン」から取られてはいけません)ead

入力:HE HADレモネード
出力:HH lemonADEade

入力:あなたはレモンが好きですか?あなたはレモンで私を苦しめました!
出力:o lemonADesが好きですか?あなたはレモネードを盛り上げました!

入力:AEレモン
出力:lemonAE

入力:55bad lemon
出力:55b lemonad

code-golf  string  code-golf  parsing  internet  stack-exchange-api  code-challenge  kolmogorov-complexity  restricted-source  brain-flak  python  logic  pyth  code-golf  string  search  optimized-output  code-golf  tips  language-design  golfing-language  code-golf  tips  language-design  code-golf  number  sorting  pi  code-golf  math  number  code-golf  string  balanced-string  classification  brain-flak  code-golf  math  number-theory  decision-problem  code-golf  tips  code-golf  number  sequence  code-golf  balanced-string  brain-flak  code-golf  math  sequence  arithmetic  fibonacci  code-golf  math  parsing  code-golf  string  keyboard  code-golf  code-golf  string  source-layout  whitespace  code-golf  math  rational-numbers  code-golf  string  code-golf  string  code-golf  math  sequence  code-golf  number  floating-point  code-golf  string  decision-problem  subsequence  code-golf  string  kolmogorov-complexity  code-golf  string  permutations  balanced-string  brain-flak  code-golf  string  math  number  code-golf  string  primes  cipher  code-golf  string  ascii-art  chemistry  code-golf  ascii-art  grid  counting  code-golf  math  arithmetic  integer  code-golf  number  kolmogorov-complexity  code-golf  ascii-art  kolmogorov-complexity  sequence  metagolf  brain-flak  code-golf  ascii-art  kolmogorov-complexity  code-golf  string  whitespace 

回答:


6

JavaScript(ES6)、159 157 155 162バイト

編集:エラーをスローするのではなく、「与えられた文字で実行可能なことを出力する」ために+7バイト


変更された文字列を返す再帰関数。

f=(s,a=s.split(/(lemon)/i),n=(a.length-1)*1.5)=>n?f(n,a.map((s,i)=>i&1|!n||(a[i]=s.replace([/a/i,/e/i,/d/i][n%3],c=>(a[--n/3<<1|1]+=c,''))))&&a,n-(n==s)):a.join``

使い方

s.split(/(lemon)/i)は入力文字列を分割しますlemonが、結果のキャプチャグループを保持します。

たとえば"foo lemon bar LEMON baz".split(/(lemon)/i)、配列を生成し[ 'foo ', 'lemon', ' bar ', 'LEMON', ' baz' ]ます。

私たちは、再帰的に文字を抽出し、この配列に反復adおよびeあるいは位置にあるエントリからの大文字の対応、および奇数位置にあるエントリにそれらを追加します。

コメント済み

f = (                                   // given:
  s,                                    //   s = input string or previous value of 'n'
  a = s.split(/(lemon)/i),              //   a = split array, as described above
  n = (a.length - 1) * 1.5              //   n = total number of characters to be found
) =>                                    //
  n ?                                   // if there's still at least one character to find:
    f(                                  //   do a recursive call with:
      n,                                //     1) the current value of 'n'
      a.map((s, i) =>                   //     2) an updated version of 'a', where
        i & 1 | !n || (                 //       for even positions:
          a[i] = s.replace(             //         we look for the next character
            [/a/i, /e/i, /d/i][n % 3],  //           'a', 'e' or 'd' (case insensitive)
            c => (                      //           append it to
              a[--n / 3 << 1 | 1] += c, //           one of the entries at an odd position
              ''                        //           and remove it from the original entry
            )                           //           end of replace() callback
          )                             //         end of replace()
        )                               //       end of position condition
      ) && a,                           //     end of map() -> yield the updated 'a'
      n -                               //     3) the updated value of 'n', skipping the
      (n == s)                          //        current character if not found at all
    )                                   //   end of recursive call
  :                                     // else:
    a.join``                            //   success: join 'a' and return it

デモ


再帰エラーをスローすることは、最初のルールに準拠していないようです(「、、またはsが十分eでない場合、指定された文字で実行可能なことを出力する必要があります。たとえば、入力は出力しますadbdblemonbblemond」)?
ケビンCruijssen

1
@KevinCruijssenうーん、そうだね。エラーのスローが最初に許可されたことはほぼ確実でした。最初の投稿の猶予期間中に編集されましたか?(それまたは私はそれを夢見ていた。)とにかく、私はそれを修正しようとします。気づいてくれてありがとう。
アーナルド

実際に編集された場合に備えて、コメントする前に履歴を振り返りました。最初の5分間で編集されたかもしれませんが、それを確認する方法はわかりません。そして問題ありません、あなたの答えはまだかなり印象的ですので、事前に+1します。問題を解決できることは間違いありません(多くのバイトを追加することなく)。
ケビンCruijssen

@KevinCruijssenこれは、現時点では7バイトのコストで修正されています。
アーナウド

2
@Arnauldはい、申し訳ありませんが、投稿の最初の2分以内に編集したので、私の謝罪
アルバートレンショー

5

CJam、130バイト

LqY5m*{"lemon"_eu}%3/:z{~?}f%{_@\/_:,[{1$+}*]);@f{[\]}@+\1a*}/\{1
=}$0f=\1$,{"ade"{__C#)\Ceu#)|(\0+We\)@_N=@+N\t\}fC}fN0a/L*1a/\.{}

これは明確にするために2行に分割されています。改行はカウントされません。

擬似コード:

FLAG_1 = object()
FLAG_2 = object()
lemon_instances = [] # CJam: L
input_chars = list(all_input()) # CJam: q
lemons = [
    "LEMON", "LEMOn", "LEMoN", "LEMon", "LEmON", "LEmOn", "LEmoN", "LEmon",
    "LeMON", "LeMOn", "LeMoN", "LeMon", "LemON", "LemOn", "LemoN", "Lemon",
    "lEMON", "lEMOn", "lEMoN", "lEMon", "lEmON", "lEmOn", "lEmoN", "lEmon",
    "leMON", "leMOn", "leMoN", "leMon", "lemON", "lemOn", "lemoN", "lemon"
] # CJam: Y5m*{"lemon"_eu}%3/:z{~?}f%
for i in lemons: # CJam: { ... }/
    temp = input_chars.split(i) # CJam: _@\/
    lengths = temp.map(len) # CJam: _:,
    # Here, accum turns an array like [1,2,3] into [1,3,6].
    indices = accum(lengths) # CJam: [{1$+}*]
    indices.pop() # CJam: );
    temp2 = zip(temp, indices) # CJam: @f{[\]}
    lemon_instances = temp2 + lemon_instances # CJam: @+
    input_chars = join_array(temp, FLAG_1) # CJam: 1a*
lemon_instances.sort(key=lambda x: x[1]) # CJam: {1=}$
lemon_instances = [i[0] for i in lemon_instances] # CJam: 0f=
for i in range(len(lemon_instances)): # CJam: \1$,{...}fN
    for c in "ade": # CJam: "ade"{...}fC
        # list_index returns -1 if not found
        lower = list_index(input_chars, c)+1 # CJam: __C#)
        upper = list_index(input_chars, upper(c))+1 # CJam: \Ceu#)
        char_index = (lower or upper) - 1 # CJam: |(
        input_chars.append(FLAG_2) # CJam: \0+
        # -1 refers to the last element in the list
        swap_list_elements(input_chars, char_index, -1) # CJam: e\
        extracted = input_chars.pop() # CJam: )
        lemon_instances[i] += extracted # CJam: @_N=@+N\t\
remove_all(input_chars, FLAG_2) # CJam: 0a/L*
temp1 = input_chars.split(FLAG_1) # CJam: 1a/
# interleave([1, 2, 3], ["a", "b"]) gives [1, "a", 2, "b", 3]
temp2 = interleave(temp1, lemon_instances) # CJam: \.{}
print("".join(temp2))

私は偉大な答え芋、これはより多くのupvotesを持っていない悲しみよ
アルバート・レンショウに

4

網膜、303バイト

i+`(?<!lemon)(a)(.*)(lemon)(?!a)
$2$3$1
i+`(lemon)(?!a)(.*)(?<!lemon)(a)
$1$3$2
i+(?<!lemona?)(d)(.*)(lemona?)(?![ad])
$2$3$1
i+`(lemona?)(?![ad])(.*)(?<!lemona?)(d)
$1$3$2
i+(?<!lemona?d?)(e)(?!(?<=le)mon)(.*)(lemona?d?)(?![ade])
$2$3$1
i+`(lemona?d?)(?![ade])(.*)(?<!lemona?d?)(e)(?!(?<=le)mon)
$1$3$2

オンラインでお試しください!

きっと私はここで何か間違ったことをしている。

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