当生活给你柠檬时,做柠檬水


21

挑战

您将得到一个输入字符串,任何地方的话"Lemon"是发现它应转换到"Lemonade" ,但是ade在句子中必须借用了别的地方。


输入示例:

我小时候发现一个柠檬

示例输出:

我小时候就喝柠檬水

柠檬水是由从原来的偷下标字母创建

我foun d柠檬水WH é ñ我是一个孩子

这只是一个可能的输出示例,“ e”,“ d”和“ a”可以从任何地方获取(当然单词除外lemon


评论

•如果,或s 不足e,则必须输出给定字母可进行的操作。例如,输入将输出adbdblemonbblemond

lemon文本可能并不总是独立的(两边都有空格)。例如,您可能lemons在输入中的某处有单词,而输出应为lemonades

•输入可以包含任意数量的lemons,甚至0 lemons(在这种情况下,输出将与输入相同)

•您可以用大写和小写字母来制作您的柠檬水,例如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您喜欢柠檬吗?你这柠檬水!

输入:AE柠檬
输出:柠檬AE

输入:55bad柠檬
输出: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 

Answers:


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)将产生array [ 'foo ', 'lemon', ' bar ', 'LEMON', ' baz' ]

我们递归迭代这个阵列上,提取字符ade或从位于偶数位置的条目的大写的同行,并将这些信息附加到位于奇数位置的条目。

已评论

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

演示版


扔个递归误差似乎并不符合欧盟的第一条规则(“ 如果没有足够的ea或者d就是你必须输出是什么做的,能与给定的字母。例如输入bdblemon将输出bblemond ”)?
凯文·克鲁伊森

1
@KevinCruijssen嗯,你是对的。我几乎可以肯定,最初允许抛出错误。在最初帖子的宽限期内是否进行了修改?(要么,要么我梦到了。)无论如何,我会尝试解决该问题。感谢您的关注。
Arnauld

在评论之前,我回头回顾了历史,以防万一确实被删除了。您可能是对的,它可能在前5分钟内已被编辑,但不知道如何检查。没问题,您的回答仍然令人印象深刻,因此我会提前对其进行+1。我毫不怀疑,您将能够解决该问题(希望不会造成太多字节增加)。
凯文·克鲁伊森

@KevinCruijssen目前固定为7个字节。
Arnauld

2
@Arnauld是的,很抱歉,我在帖子发布后的前2分钟内将其编辑掉了,哈哈,我很抱歉
Albert Renshaw

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/\.{}

为了清楚起见,将其分为两行。换行符不计算在内。

伪代码:

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

我很遗憾这没有更多投票,很好的答案imo
Albert Renshaw

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

在线尝试!

当然,我在这里做错了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.