CUSRS-完全に役に立たない文字列リファクタリングシステム!


11

前書き

私は、常にPPCGで発生するSBU(Short But Unique)チャレンジの大ファンです。CUSRSは文字列をリファクタリングするように設計されたシステムです。CUSRS関数は2つのパラメーターを取り、1つの文字列を出力します。

チャレンジ

以下を行うためのプログラム、関数、ラムダ、または許容可能な代替物を作成します。

(例として)与えられString input、次のように使用してString refactorリファクタリング:inputrefactor

refactor文字列の形式になり((\+|\-)\w* *)+、例えば、(正規表現):

+Code -Golf -lf +al

各セクションは、実行するリファクタリングアクションinputです。各プログラムにはポインターもあります。

+ 文字列内のポインターの現在位置にその接尾辞(プラスなし)を挿入し、ポインターを0にリセットします。

各操作をinput文字列に適用し、結果を返す必要があります。

例:

input:
Golf +Code //pointer location: 0

output:
CodeGolf //pointer location: 0

-接尾辞が見つかるまで、文字列を介してポインタをインクリメントします。接尾辞は文字列から削除され、削除されたテキストの左側にポインタが残ります。接尾辞が見つからない場合、ポインタは単に文字列の最後まで進行し、そこに残ります。

input:
Golf -lf //pointer location 0

output:
Go //pointer location 2

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"

サンプルコード

例はJavaで、まったくゴルフされていません。

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

ルール

  • 標準的な抜け穴が適用されます
  • バイト単位の最短コードが勝ちます


出力は何にすべきaaa -aですか?
ETHproductions

|aaパイプがポインターになります。
ショーンワイルド

@Emigna問題の質問を見ると、私の実装は大きく異なると思います。
ショーンワイルド

何が起こると-接尾語が見つからない場合は?
-Zgarb

回答:


1

APL、91 90バイト

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

次のように、文字列を右引数として、コマンドを左引数として使用します。

      '+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バイト)

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)

部分文字列が見つからない場合にポインターが最後に移動する例を示す例:

Input: HelloThere -x +Friend
Output: HelloThereFriend

13バイトを節約してくれたArtyerに感謝します。

begパラメータのを介してさらに3バイトを保存してくれたArtyerに感謝しますindex

古い答え:

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)

ポインターが機能することを示す例(Qのすべての例は、ポインターを考慮せず、最初の発生時に単純に置き換える場合でも機能します):

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

編集:2分前から、質問者のコメントによると、私の回答は無効になりました。

aaa -b + bはaaabになります。これは、ポインターが最後まで移動するためです。

Edit2:修正されました。


1
w,*x=input().split()、そしてif'-'>i:代わりのif i[0]=='+':とタブ文字、いくつかのバイトを節約する代わりに、2つのスペースの2つのインデントのために
Artyer

私はタブとスペースを混在しようとすると、私が得ますTabError: inconsistent use of tabs and spaces in indentation。提案をありがとう、私はそれらの機能について知りませんでした!すぐに追加し始めます。
-redstarcoder

@redstartcoderタブトリックはPython 2でのみ機能すると思います。私の悪い
-Artyer

ここでは絶対に間違っている可能性がありますが、文字列にはサブストリングが見つからない場合に返されるメソッドがあると思います。-1は文字列の後ろを指すため、必要なことは、その長さの係数を取得することだけで、try-exceptが不要であることを意味します。find-1pw
ケード

1
あなたは-1%len(str)文字列の最後にインデックスを取得するでしょう。str.indexそして、str.findも取るstartパラメータを、私は、置き換えることができると仮定しw[p:].index(i[1:])w.index(i[1:],p)。全体的に、それは次のようになりますelse:p=(w.find(i[1:],p)+p)%len(p);w=w[:p]+w[p:].replace(i[1:],'',1)
アーティアー

0

JavaScript(ES6)、117バイト

(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

説明:面倒なポインターを使用する代わりに、ストリングの左半分をにt、右半分をに保持しsます。さらに、splitおよびjoin削除を実行するための便利な方法です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.