Quando a vida lhe der limões, faça uma limonada


21

Desafio

Você será dado uma cadeia de entrada, em qualquer lugar a palavra "Lemon"é encontrada deve ser convertido para "Lemonade" , mas o a, de edeve ser emprestado de outro lugar na sentença.


Exemplo

Exemplo de entrada:

Encontrei limão quando criança

Saída de exemplo:

Eu encontro uma limonada quando eu era criança

A limonada foi criada roubando as seguintes letras sobrescritas do original

I foun d uma limonada wh e n eu era um garoto

Este é apenas um exemplo de saída possível, o "e", "d" e "a" podem ter sido obtidos de qualquer lugar ( exceto pela palavra, é lemonclaro )


Comentários

• Se não há o suficiente e, aou dé você deve saída o que era capaz de fazer com as cartas dadas. Por exemplo, a entrada bdblemonproduziriabblemond

• O lemontexto nem sempre pode ser autônomo (espaço em cada lado). Por exemplo, você pode ter a palavra lemonsem algum lugar da entrada e a saída deve serlemonades

• A entrada pode conter qualquer número de lemons, até 0 lemons (nesse caso, a saída seria idêntica à entrada)

• Você pode fazer sua limonada com letras maiúsculas e minúsculas, por exemplo, leMonpode se tornar leMonadee o adeemprestado pode ser qualquer caso (por isso, também pode ter se tornado leMonADe).
O caso da carta emprestada deve permanecer como era quando você a emprestou.
(Exemplo de entrada -> saída, he hAD lemOn-> h h lemOnADe)

• Não precisa ser um programa completo, apenas uma função é adequada.

• Você pode assumir que a entrada será apenas o conjunto de caracteres CP437


Code Golf

Este é , então o menor número de bytes vitórias!


Pseudo-TestCases

* Nota: Para qualquer entrada específica, pode haver várias saídas possíveis, para que seu programa não seja exibido exatamente como esses casos de teste, isso é mais apenas para que as pessoas possam entender a lógica:

Entrada: Limões EpaD
Saída: p LeMonaDEs

Entrada: Olá mundo
Saída: Olá mundo

Entrada: limão limão
saída: limão limão
* ( A e, a, dcartas nunca deve ser tirado de outra "Lemon")

Entrada: ELE TINHA limonada
Saída: HH lemonADEade

Entrada: Você gosta de limões? Você me adora no limão!
Saída: o você gosta de limão? Você hum limonada!

Entrada: AE lemon
Saída: lemonAE

Entrada: 55bad lemon
Saída: 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 

Respostas:


6

JavaScript (ES6), 159 157 155 162 bytes

Edit: +7 bytes para "gerar o que era possível com as letras dadas" em vez de emitir um erro


Uma função recursiva que retorna a string modificada.

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

Como funciona

A expressão s.split(/(lemon)/i)divide a sequência de entrada, lemonmas preserva os grupos de captura no resultado.

Por exemplo, "foo lemon bar LEMON baz".split(/(lemon)/i)produzirá a matriz [ 'foo ', 'lemon', ' bar ', 'LEMON', ' baz' ].

Nós recursivamente iterar nesta matriz, extraindo os caracteres a, de eou os seus homólogos maiúsculas a partir das entradas situadas numa posição mesmo, e anexando-os para as entradas situadas numa posição estranho.

Comentado

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

Demo


Lançar um erro de recursão não parece estar de acordo com a primeira regra (" Se não houver o suficiente e, aou ds, você deve exibir o que era possível com as letras dadas. Por exemplo, a entrada bdblemonseria exibidabblemond ")?
— Kevin Cruijssen

11
@KevinCruijssen Hmm, você está certo. Eu tinha quase certeza de que lançar um erro foi inicialmente permitido. Foi uma edição durante o período de carência da postagem inicial? (Ou isso ou eu sonhei.) De qualquer forma, vou tentar consertar isso. Obrigado por perceber.
— Arnauld

Eu olhei para trás na história antes de fazer o meu comentário, para o caso de ter sido realmente editado. Você pode estar certo de que pode ter sido editado nos primeiros 5 minutos, mas não faz ideia de como verificar isso. E não há problema, sua resposta ainda é bastante impressionante, por isso vou marcar com +1 com antecedência. Não tenho dúvidas de que você será capaz de corrigir o problema (espero sem causar muitos bytes adicionados).
— Kevin Cruijssen

@KevinCruijssen Isso está corrigido ao custo de 7 bytes por enquanto.
— Arnauld #

2
@Arnauld Sim desculpe, eu editado que dentro dos primeiros 2 minutos da pós talvez haha, as minhas desculpas
— Albert Renshaw

5

CJam, 130 bytes

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

Isso é dividido em duas linhas para maior clareza; a nova linha não é contada.

Pseudo-código:

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

Estou triste isso não tem mais upvotes, grande resposta imo
— Albert Renshaw

4

Retina , 303 bytes

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

Experimente online!

Certamente estou fazendo algo errado aqui.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.