CUSRS - Il sistema di refactoring di stringhe completamente inutile!


11

introduzione

Sono un grande fan delle sfide SBU (Short But Unique) che spuntano continuamente su PPCG. CUSRS è un sistema progettato per il refactoring delle stringhe, una funzione CUSRS accetta 2 parametri e genera 1 stringa.

Sfida

Produrre un programma, una funzione, lambda o un'alternativa accettabile per eseguire le seguenti operazioni:

Dato String inpute String refactor(come esempio), refactor inputusando refactorcome segue:

La refactorstringa sarà nel formato di ((\+|\-)\w* *)+(regex), ad esempio:

+Code -Golf -lf +al

Ogni sezione è un'azione di refactoring su cui eseguire input. Ogni programma ha anche un puntatore.

+ Inserirà il suo suffisso (senza il plus) nella posizione corrente dei puntatori nella stringa e quindi reimposterà il puntatore su 0.

Ogni operazione deve essere applicata alla inputstringa e il risultato deve essere restituito.

Esempio:

input:
Golf +Code //pointer location: 0

output:
CodeGolf //pointer location: 0

-Incrementerà il puntatore attraverso la stringa fino a quando non trova il suffisso. Il suffisso verrà rimosso dalla stringa e il puntatore verrà lasciato sul lato sinistro del testo rimosso. Se non viene trovato alcun suffisso, il puntatore avanzerà semplicemente fino alla fine della stringa e verrà lasciato lì.

input:
Golf -lf //pointer location 0

output:
Go //pointer location 2

Esempi

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"

Codice di esempio

L'esempio è Java, non è affatto golfato.

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;
}

Regole

  • Si applicano scappatoie standard
  • Il codice più corto, in byte, vince


Quale dovrebbe essere l'output per aaa -a?
ETHproductions

|aacon il tubo come puntatore.
Shaun Wild,

@Emigna Esaminando la domanda in questione, credo che l'attuazione della mia sarebbe molto diversa.
Shaun Wild,

Cosa succede -se il suffisso non viene trovato?
Zgarb,

Risposte:


1

APL, 91 90 byte

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

Questo prende la stringa come argomento destro e i comandi come argomento sinistro, in questo modo:

      '+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


1

Python 3 ( 164 194 186 181 168 165 byte)

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)

Esempio che dimostra che il puntatore si sposta alla fine se non trova una sottostringa:

Input: HelloThere -x +Friend
Output: HelloThereFriend

Un ringraziamento speciale ad Artyer per avermi salvato 13 byte.

Un altro grazie ad Artyer per avermi salvato altri 3 byte tramite il begparametro di index.

Vecchia risposta:

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)

L'esempio che dimostra il puntatore funziona (tutti gli esempi nella Q funzionano anche se non si tiene conto del puntatore e si sostituisce semplicemente alla prima occorrenza):

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

Modifica: da 2 minuti fa la mia risposta non è più valida secondo un commento del richiedente.

aaa -b + b risulterebbe con aaab perché il puntatore andrebbe fino in fondo.

Modifica2: risolto.


1
w,*x=input().split()e if'-'>i:invece di if i[0]=='+':e il carattere di tabulazione per 2 rientri anziché 2 spazi salverà alcuni byte
Artyer

Se provo a mescolare schede e spazi ottengo TabError: inconsistent use of tabs and spaces in indentation. Grazie per i suggerimenti, non sapevo di quelle funzionalità! Inizierò ad aggiungerli immediatamente.
redstarcoder,

@redstartcoder Immagino che il trucco con le schede funzioni solo in Python 2. My bad
Artyer

Potrei assolutamente sbagliarmi qui, ma penso che le stringhe abbiano un findmetodo che tornerà -1se non riesce a trovare la sottostringa. Dato che -1 punta sul retro della stringa, tutto ciò che dovresti fare è prendere un modulo della plunghezza del wquale dovrebbe significare che non hai bisogno di un try-salvo.
Kade,

1
Faresti -1%len(str)per ottenere l'indice alla fine della stringa. str.indexe str.findaccetta anche un startparametro, quindi suppongo che tu possa sostituirlo w[p:].index(i[1:])con w.index(i[1:],p). Nel complesso, lo sarebbe else:p=(w.find(i[1:],p)+p)%len(p);w=w[:p]+w[p:].replace(i[1:],'',1).
Artyer,

0

JavaScript (ES6), 117 byte

(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

Spiegazione: Invece di usare un puntatore ingombrante, mantengo la metà sinistra della stringa te la metà destra dentro s. Inoltre, splite joinsono un modo conveniente per effettuare la rimozione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.