CUSRS - Tamamen Yararsız String Refactoring System!


11

Giriş

Her zaman PPCG'de ortaya çıkan SBU (Kısa Ama Benzersiz) zorluklarının büyük bir hayranıyım. CUSRS, dizeleri yeniden düzenlemek için tasarlanmış bir sistemdir, CUSRS işlevi 2 parametre alır ve 1 String verir.

Meydan okuma

Aşağıdakileri yapmak için bir program, işlev, lambda veya kabul edilebilir bir alternatif üretin:

Verilen String inputve String refactorrefactor, (örnek olarak) inputkullanılarak refactoraşağıdaki gibi:

refactorString biçiminde olacaktır ((\+|\-)\w* *)+(örneğin düzenli ifade):

+Code -Golf -lf +al

Her bölüm gerçekleştirilecek bir yeniden düzenleme eylemidir input. Her programın da bir işaretçisi vardır.

+ Soneki (artı olmadan) Dize'deki işaretçilerin geçerli konumuna ekler ve ardından işaretçiyi 0'a sıfırlar.

Her işlem Dizeye uygulanmalı inputve sonuç döndürülmelidir.

Misal:

input:
Golf +Code //pointer location: 0

output:
CodeGolf //pointer location: 0

-Soneki bulana kadar işaretçiyi Dize boyunca artırır. Sonek Dize'den kaldırılacak ve işaretçi kaldırılan metnin sol tarafında bırakılacaktır. Herhangi bir sonek bulunmazsa, işaretçi Dize sonuna kadar ilerler ve orada kalır.

input:
Golf -lf //pointer location 0

output:
Go //pointer location 2

Örnekler

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"

Örnek Kod

Örnek Java, hiç golf değil.

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

kurallar

  • Standart Loopholes Uygula
  • Bayt cinsinden en kısa kod kazanır


Çıktı ne için olmalı aaa -a?
ETHproductions

|aaboru işaretçidir.
Shaun Wild

@Emigna Söz konusu soruya baktığımda, benimkinin uygulanmasının çok farklı olacağına inanıyorum.
Shaun Wild

-Sonek bulunmazsa ne olur ?
16:17

Yanıtlar:


1

APL, 91 90 bayt

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

Bu, dizeyi sağ bağımsız değişkeni ve komutları sol bağımsız değişkeni olarak alır, şöyle:

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

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)

Bir alt dize bulamazsa işaretçinin sonuna hareket ettiğini gösteren örnek:

Input: HelloThere -x +Friend
Output: HelloThereFriend

13 bayt kurtardığı için Artyer'e özel teşekkürler.

Artyer'e, begparametresi aracılığıyla başka bir 3 bayt kurtardığı için başka bir teşekkürler index.

Eski cevap:

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)

İşaretçinin çalıştığını gösteren örnek (işaretçideki faktörleri hesaba katmasanız ve ilk kez değiştirseniz bile Q'daki tüm örnekler çalışır):

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

Düzenleme: 2 dakika önce cevabım asker tarafından yapılan bir yoruma göre geçersiz.

aaa -b + b, aaab ile sonuçlanır çünkü işaretçi sonuna kadar gider.

Edit2: Sabit.


1
w,*x=input().split()Ve if'-'>i:yerine if i[0]=='+':ve sekme karakteri bazı bayt kurtaracak yerine 2 boşluk 2 girintiler için
Artyer

Sekmeleri ve boşlukları karıştırmaya çalışırsam alırım TabError: inconsistent use of tabs and spaces in indentation. Öneriler için teşekkürler, bu özellikleri bilmiyordum! Onları hemen eklemeye başlayacağım.
redstarcoder

@redstartcoder Sekme numarasının sadece Python 2'de çalıştığını tahmin ediyorum. Kötü
Artyer

Ben kesinlikle burada yanlış olabilir, ama ben dizeleri bu alt dize bulamazsanız dönecek bir yöntemi var düşünüyorum . -1 dizenin arkasına işaret ettiğinden, yapmanız gereken tek şey, uzunluğuna göre bir modül almaktır ; bu, denemeye ihtiyacınız olmadığını gösterir. find-1pw
Kade

1
-1%len(str)Dizinin sonunda dizini almak için yapardınız . str.indexve str.findayrıca bir startparametre almak , bu yüzden w[p:].index(i[1:])ile değiştirebilirsiniz varsayalım w.index(i[1:],p). Genel olarak, olurdu else:p=(w.find(i[1:],p)+p)%len(p);w=w[:p]+w[p:].replace(i[1:],'',1).
Artyer

0

JavaScript (ES6), 117 bayt

(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

Açıklama: Hantal bir işaretçi kullanmak yerine, dizenin sol yarısını tve sağ yarısını içeride tutuyorum s. Ayrıca, splitve joinkaldırma gerçekleştirmek için uygun bir yoldur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.