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 input
e String refactor
(como exemplos), refatorar input
usando refactor
o seguinte:
A refactor
String 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 à input
String 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
aaa -a
?|aa
com o cano sendo o ponteiro.-
se o sufixo não for encontrado?Respostas:
APL,
9190 bytesIsso leva a string como argumento certo e os comandos como argumento esquerdo, assim:
fonte
GolfScript, 97 bytes
Teste: golfscript.tryitonline.net
fonte
Python 3 (
164194186181168165 bytes)Exemplo demonstrando o ponteiro se movendo para o final se não encontrar uma substring:
Agradecimentos especiais a Artyer por me salvar 13 bytes.
Outro agradecimento a Artyer por me salvar outros 3 bytes através do
beg
parâmetro deindex
.Resposta antiga:
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):
Edit: Desde 2 minutos atrás, minha resposta agora é inválida de acordo com um comentário do solicitante.
Edit2: Fixed.
fonte
w,*x=input().split()
E,if'-'>i:
em vez deif i[0]=='+':
e caráter guia para 2 travessões em vez de 2 lugares vai economizar alguns bytesTabError: 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.find
método que retornará-1
se 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ódulop
cujo comprimentow
deva significar que você não precisa de uma tentativa, exceto.-1%len(str)
para obter o índice no final da string.str.index
estr.find
também pegar umstart
parâmetro, então suponho que você possa substituirw[p:].index(i[1:])
porw.index(i[1:],p)
. No geral, seriaelse:p=(w.find(i[1:],p)+p)%len(p);w=w[:p]+w[p:].replace(i[1:],'',1)
.JavaScript (ES6), 117 bytes
Explicação: Em vez de usar um ponteiro pesado, mantenho a metade esquerda da corda
t
e a metade direita dentros
. Além disso,split
ejoin
são uma forma conveniente para realizar a remoção.fonte