CUSRS - O sistema de refatoração de cordas completamente inútil!

11

Introdução

Sou um grande fã dos desafios do SBU (Short But Unique) que surgem no PPCG o tempo todo. O CUSRS é um sistema projetado para refatorar strings, uma função CUSRS recebe 2 parâmetros e gera 1 String.

Desafio

Produza um programa, função, lambda ou alternativa aceitável para fazer o seguinte:

Dado String inpute String refactor(como exemplos), refatorar inputusando refactoro seguinte:

A refactorString estará no formato de ((\+|\-)\w* *)+(regex), por exemplo:

+Code -Golf -lf +al

Cada seção é uma ação de refatoração para executar input. Cada programa também possui um ponteiro.

+ Insere o sufixo (sem o sinal de mais) no local atual dos ponteiros na String e redefine o ponteiro para 0.

Cada operação deve ser aplicada à inputString e o resultado deve ser retornado.

Exemplo:

input:
Golf +Code //pointer location: 0

output:
CodeGolf //pointer location: 0

-Aumentará o ponteiro através da String até encontrar o sufixo. O sufixo será removido da String e o ponteiro será deixado no lado esquerdo do texto removido. Se nenhum sufixo for encontrado, o ponteiro simplesmente avançará para o final da String e será deixado lá.

input:
Golf -lf //pointer location 0

output:
Go //pointer location 2

Exemplos

input:
"Simple" "-impl +nip -e +er"

output:
"Sniper"

input:
"Function" "-F +Conj"

output:
"Conjunction"

input:
"Goal" "+Code -al +lf"

output:
"CodeGolf"

input:
"Chocolate" "Chocolate"

output:
"Chocolate" //Nothing happens...

input:
"Hello" "-lo+p        +Please" //Spaces are irrelevant

output:
"PleaseHelp"

input:
"Mississippi" "-s-s-i-ppi+ng" //Operations can be in any order

output:
"Missing"

input:
"abcb" "-c -b +d"

output:
"abd"

input:
"1+1=2" "-1+22-=2+=23"

outut:
"22+1=23"

Código de exemplo

O exemplo é Java, não é um jogo de golfe.

public static String refactor(String input, String swap) {
    int pointer = 0;
    String[] commands = swap.replace(" ", "").split("(?=[-+])");

    for (String s : commands) {
        if (s.startsWith("+")) {
            input = input.substring(0, pointer) + s.substring(1) + input.substring(pointer, input.length());
            pointer = 0;
        } else {
            if (s.startsWith("-")) {
                String remove = s.substring(1);
                for (int i = pointer; i < input.length(); i++) {
                    if (input.substring(i, i + remove.length() > input.length() ? input.length() : i + remove.length()).equals(remove)) {
                        pointer = i;
                        input = input.substring(0, i) + input.substring(i + remove.length(), input.length());
                        break;
                    }
                }
            }
        }
    }

    return input;
}

Regras

  • As brechas padrão se aplicam
  • O código mais curto, em bytes, ganha
Shaun Wild
fonte
1
Relacionado
Emigna
Qual deve ser a saída aaa -a?
ETHproductions
|aacom o cano sendo o ponteiro.
Shaun Wild
@ Emigna Ao analisar a questão em questão, acredito que a implementação da minha seria muito diferente.
Shaun Wild
O que acontece -se o sufixo não for encontrado?
Zgarb

Respostas:

1

APL, 91 90 bytes

{s l←⍵0⋄s⊣{g←1↓⍵⋄'+'=⊃⍵:+s∘←(l↑s),g,l↓s⋄l∘←¯1+1⍳⍨g⍷s⋄+s∘←(l↑s),s↓⍨l+⍴g}¨{1↓¨⍵⊂⍨⍵=⊃⍵}' ',⍺}

Isso leva a string como argumento certo e os comandos como argumento esquerdo, assim:

      '+Code -al +lf' {s l←⍵0⋄s⊣{g←1↓⍵⋄'+'=⊃⍵:+s∘←(l↑s),g,l↓s⋄l∘←¯1+1⍳⍨g⍷s⋄+s∘←(l↑s),s↓⍨l+⍴g}¨{1↓¨⍵⊂⍨⍵=⊃⍵}' ',⍺} 'Goal'
CodeGolf
marinus
fonte
1

GolfScript, 97 bytes

" "%(:s;0:p;{("-"0=={.s p>\?.-1={;;s,:p;}{:p;,:l;s p<s p l+>+:s;}if}{s p<\+s p>+:s;0:p;}if}/"\n"s

Teste: golfscript.tryitonline.net

CodenameLambda
fonte
Bem-vindo ao PPCG! Você pode usar o intérprete em Experimente online , que suporta entradas.
Martin Ender
1

Python 3 ( 164 194 186 181 168 165 bytes)

p=0
w,*x=input().split()
for i in x:
 if '-'>i:w,p=w[:p]+i[1:]+w[p:],0
 else:
  try:p=w.index(i[1:],p)
  except:p=len(w)
  w=w[:p]+w[p:].replace(i[1:],'',1)
print(w)

Exemplo demonstrando o ponteiro se movendo para o final se não encontrar uma substring:

Input: HelloThere -x +Friend
Output: HelloThereFriend

Agradecimentos especiais a Artyer por me salvar 13 bytes.

Outro agradecimento a Artyer por me salvar outros 3 bytes através do begparâmetro de index.

Resposta antiga:

p=0
x=input().split()
w=x[0]
for i in x[1:]:
 if i[0]=='+':
  w=w[:p]+i[1:]+w[p:]
  p=0
 else:
  p=w[p:].index(i[1:])+p
  w=w[:p]+w[p:].replace(i[1:],'',1)
print(w)

Exemplo de demonstração do ponteiro funciona (todos os exemplos no Q funcionam mesmo que você não considere o ponteiro e simplesmente substitua na primeira ocorrência):

Input: HelloThereCowboy -r -e -y +ySays +Oh
Output: OhHelloTheCowboySays

Edit: Desde 2 minutos atrás, minha resposta agora é inválida de acordo com um comentário do solicitante.

aaa -b + b resultaria em aaab porque o ponteiro iria até o fim.

Edit2: Fixed.

redstarcoder
fonte
1
w,*x=input().split()E, if'-'>i:em vez de if i[0]=='+':e caráter guia para 2 travessões em vez de 2 lugares vai economizar alguns bytes
Artyer
Se eu tentar misturar guias e espaços, recebo TabError: inconsistent use of tabs and spaces in indentation. Obrigado pelas sugestões, eu não sabia sobre esses recursos! Vou começar a adicioná-los imediatamente.
Redstarcoder #
@redstartcoder Eu acho que o truque guia só funciona em Python 2. My bad
Artyer
Eu poderia estar absolutamente errado aqui, mas acho que as strings têm um findmétodo que retornará -1se não conseguir encontrar a substring. Como -1 aponta para a parte de trás da string, tudo o que você precisa fazer é usar um módulo pcujo comprimento wdeva significar que você não precisa de uma tentativa, exceto.
Kade
1
Você faria -1%len(str)para obter o índice no final da string. str.indexe str.findtambém pegar um startparâmetro, então suponho que você possa substituir w[p:].index(i[1:])por w.index(i[1:],p). No geral, seria else:p=(w.find(i[1:],p)+p)%len(p);w=w[:p]+w[p:].replace(i[1:],'',1).
Artyer
0

JavaScript (ES6), 117 bytes

(s,r,t='')=>r.match(/\S\w*/g).map(r=>(q=r.slice(1),r<'-'?(s=t+q+s.t=''):([b,...a]=s.split(q),t+=b,s=a.join(q))))&&t+s

Explicação: Em vez de usar um ponteiro pesado, mantenho a metade esquerda da corda te a metade direita dentro s. Além disso, splite joinsão uma forma conveniente para realizar a remoção.

Neil
fonte