Wicka-wub eine Schnur

8

Davon inspiriert .

Wenn eine Zeichenfolge als Eingabe nur aus Groß- und Kleinbuchstaben besteht, wicka-wub sie.

Wie wicka-wub ich eine Schnur?

Der verwendete Beispieltext lautet "DJMcMayhem".

Teilen Sie die Zeichenfolge vor jedem Großbuchstaben, damit Sie erhalten ["D", "J", "Mc", "Mayhem"].

Nehmen Sie als nächstes die beiden Hälften der Liste als Unterlisten. Das gibt uns [["D", "J"],["Mc", "Mayhem"]]. Wenn die Liste eine ungerade Länge hat (dh 3), enthält die erste Unterliste den mittleren Teilstring (dh [[a,b], [c]]).

Erstellen Sie eine Liste von wickas und wubs. Die Anzahl von wickas sollte so groß sein wie die Länge des ersten Teils der Eingabeliste (dh ["D", "J"] -> ["wicka", "wicka"]), und die Anzahl von wubssollte so groß sein wie die Länge des zweiten Teils der Eingabeliste. In unserem Fall gibt dies ["wicka", "wicka", "wub", "wub"].

Fügen Sie nun die Unterlisten der Eingabeliste zu einzelnen Zeichenfolgen zusammen und reduzieren Sie sie.

Wir haben derzeit ["DJ", "McMayhem"]und ["wicka", "wicka", "wub", "wub"].

Verbinden Sie die wicka/ wubListe mit -s : wicka-wicka-wub-wub. Stellen Sie a vor -. Wenn die Eingabe mehr als einen Großbuchstaben enthält, fügen Sie einen anderen hinzu -.

Jetzt haben wir ["DJ", "McMayhem"]und "-wicka-wicka-wub-wub-".

Hängen Sie die wicka-wubZeichenfolge an das Ende des ersten Elements in der Eingabeliste an, um zu erhalten ["DJ-wicka-wicka-wub-wub-","McMayhem"].

Zuletzt wiederholen Sie die Zeichen im zweiten Teil der Zeichenfolge mit ihrem 0-indizierten Wert in der ursprünglichen Eingabezeichenfolge. In unserem Beispiel bedeutet dies, dass die erste Mzweimal, dann cdreimal und die nächsten Mvier Mal wiederholt wird . Treten Sie der Liste bei, sodass der zweite Teil (der Teil, in dem Sie gerade Buchstaben wiederholt haben) an den ersten Teil ( "DJ-wicka-wicka-wub-wub-") angehängt wird .

Endergebnis der Eingabe:

"DJ-wicka-wicka-wub-wub-MMcccMMMMaaaaayyyyyyhhhhhhheeeeeeeemmmmmmmmm"

Gesamtprozess:

["D", "J", "Mc", "Mayhem"] =>
[["D", "J"], ["Mc", "Mayhem"]] => 
["DJ", "McMayhem"] and ["wicka", "wicka", "wub", "wub"] =>
["DJ", "McMayhem"] and "-wicka-wicka-wub-wub-" =>
["DJ-wicka-wicka-wub-wub-", "McMayhem"] =>
"DJ-wicka-wicka-wub-wub-MMcccMMMMaaaaayyyyyyhhhhhhheeeeeeeemmmmmmmmm"

Deine Aufgabe

Ihre Aufgabe besteht darin, bei einer Zeichenfolge, die nur aus Groß- und Kleinbuchstaben besteht, die Wicka-Wubbed-Version dieser Zeichenfolge auszugeben.

Ein paar Regeln

  • Die Eingabe kann vollständig aus Kleinbuchstaben oder vollständig aus Großbuchstaben oder einer beliebigen Anzahl von Buchstaben bestehen, jedoch aus keinen anderen Zeichen.
  • Wenn die Eingabe nur aus Kleinbuchstaben besteht, sollte die korrekte Ausgabe einfach die letzte Stufe sein (die Zeichenfolge mit den Zeichen, die entsprechend ihrer 0-indizierten Position wiederholt werden). Es sollte keine wickaoder wubin diesem Fall geben.
  • Es gelten Standardregeln, vollständige Programme oder Funktionen, bis zu Ihnen.
  • Das ist ein so gewinnt kürzester Code.

GoodLuck-wicka-wicka-wub-GGGGGGGGooooooooollllllllllfffffffffffeeeeeeeeeeerrrrrrrrrrrrrssssssssssssss

Testfälle

input => output

DJMcMayhem => DJ-wicka-wicka-wub-wub-MMcccMMMMaaaaayyyyyyhhhhhhheeeeeeeemmmmmmmmm
PPCG => PP-wicka-wicka-wub-wub-CCGGG
foobarbaz => fooooobbbbaaaaarrrrrrbbbbbbbaaaaaaaazzzzzzzzz
FooBarBaz => FooBar-wicka-wicka-wub-BBBBBBaaaaaaazzzzzzzz
HelloWorld => Hello-wicka-wub-WWWWWoooooorrrrrrrllllllllddddddddd
Test => Test-wicka
UPPER => UPP-wicka-wicka-wicka-wub-wub-EEERRRR
fooBarBaz => fooBar-wicka-wicka-wub-BBBBBBaaaaaaazzzzzzzz
Caird Coinheringaahing
quelle
Sandbox
Caird Coinheringaahing
Können Sie einen Test mit 5Großbuchstaben hinzufügen ?
Rod
Dies ist eine ungolfed Referenzimplementierung in Python
Caird Coinheringaahing
1
Kann ich stattdessen "Wubba Lubba Dub Dub" verwenden? Spart mir aber keine Bytes: P.
Magic Octopus Urn
2
Sollte foobarbazeinfach zurückkehren foobarbaz? Gibt es überhaupt einen zweiten Teil?
Erik der Outgolfer

Antworten:

1

Java 8 (782 Bytes)

import com.google.common.collect.*;import java.util.*;import java.util.function.*;public class p{Function<String,String>b=s->{List<String>p=Arrays.asList(s.split("(?=[A-Z])"));if(!s.matches("[^A-Z]*[A-Z].+")){String w="";int i=0;for(char c:String.join("",s).toCharArray()){w+=String.join("",Collections.nCopies(i,Character.toString(c)));i++;}return w;}String h="-";List<List<String>>k;if(p.size()!=1){k=Lists.partition(p,2);String w=String.join("",k.get(0))+h+String.join(h,Collections.nCopies(k.get(0).size(),"wicka"))+h+String.join(h,Collections.nCopies(k.get(1).size(),"wub"))+h;int i=String.join("", k.get(0)).length();for(char c:String.join("",k.get(1)).toCharArray()){w+=String.join("",Collections.nCopies(i,Character.toString(c)));i++;}return w;}return p.get(0)+h+"wicka";};}

Ungolfed:

import com.google.common.collect.*;

import java.util.*;
import java.util.function.*;

public class p {
    Function<String, String> b = s -> {
        List<String> p = Arrays.asList(s.split("(?=[A-Z])"));

        if (!s.matches("[^A-Z]*[A-Z].+")) {
            String w = "";

            int i = 0;

            for (char c : String.join("", s).toCharArray()) {
                w += String.join("", Collections.nCopies(i, Character.toString(c)));

                i++;
            }

            return w;
        }

        String h = "-";

        List<List<String>> k;

        if (p.size() != 1) {
            k = Lists.partition(p, 2);

            String w = String.join("", k.get(0)) + h + String.join(h, Collections.nCopies(k.get(0).size(), "wicka")) + h + String.join(h,    Collections.nCopies(k.get(1).size(), "wub")) + h;

            int i = String.join("", k.get(0)).length();

            for (char c : String.join("", k.get(1)).toCharArray()) {
                w += String.join("", Collections.nCopies(i, Character.toString(c)));

                i++;
            }
            return w;
        }

        return p.get(0) + h + "wicka";
    };
}
Roberto Graham
quelle
1

Perl 5 , 142 Bytes

130 Bytes Code + 12 für -F(?=[A-Z]).

Dies stimmt nun korrekt mit allen bereitgestellten Testfällen überein.

map$a+=y///c,@E=($z=/[A-Z]/)?splice@F,0,@F/2+.5:();print@E,("-wicka"x@E,"-wub"x@F,"-"x!!@F)x$z,map$_ x$a++,$z?map/./g,@F:('',/./g)

Probieren Sie es online aus!

Hinweis : TIO umfasst -ldas gleichzeitige Ausführen aller Tests.

Dom Hastings
quelle
1

Kotlin 1.1 - 494 492 Bytes

Einreichung

typealias S=String
fun Iterable<*>.j(s:S="")=this.joinToString(s)
fun s(s:S):S{var c=0
val m=mutableListOf<S>()
var t=""
s.map{if(it.isUpperCase()){c+=1
if(t!=""){m.add(t)
t=""}}
t+=it}
if(c==0)return e(s,1)
m.add(t)
val p=Math.ceil(m.size/2.0).toInt()
val f=m.subList(0,p)
val z=m.subList(p,m.size)
val w=List(f.size,{"wicka"})
val u=List(z.size,{"wub"})
val x=f.j()
var v="-"+(w+u).j("-")
if(c>1)v+="-"
return x+v+e(z.j(),x.length)}
fun e(s:S,o:Int)=s.mapIndexed{c,i->List(c+o,{i}).j()}.j()

Prüfung

typealias S=String
fun Iterable<*>.j(s:S="")=this.joinToString(s)
fun s(s:S):S{var c = 0
val m=mutableListOf<S>()
var t=""
s.map{if(it.isUpperCase()){c+=1
if(t!=""){m.add(t)
t=""}}
t+=it}
if(c==0)return e(s,1)
m.add(t)
val p=Math.ceil(m.size/2.0).toInt()
val f=m.subList(0,p)
val z=m.subList(p,m.size)
val w=List(f.size,{"wicka"})
val u=List(z.size,{"wub"})
val x=f.j()
var v="-"+(w+u).j("-")
if(c>1)v+="-"
return x+v+e(z.j(),x.length)}
fun e(s:S,o:Int)=s.mapIndexed{c,i->List(c+o,{i}).j()}.j()

data class TestData(val input: String, val output: String)

fun main(args: Array<String>) {
    val tests = listOf(
            TestData("DJMcMayhem", "DJ-wicka-wicka-wub-wub-MMcccMMMMaaaaayyyyyyhhhhhhheeeeeeeemmmmmmmmm"),
            TestData("PPCG", "PP-wicka-wicka-wub-wub-CCGGG"),
            TestData("foobarbaz", "fooooobbbbaaaaarrrrrrbbbbbbbaaaaaaaazzzzzzzzz"),
            TestData("FooBarBaz", "FooBar-wicka-wicka-wub-BBBBBBaaaaaaazzzzzzzz"),
            TestData("HelloWorld", "Hello-wicka-wub-WWWWWoooooorrrrrrrllllllllddddddddd"),
            TestData("Test", "Test-wicka"),
            TestData("UPPER", "UPP-wicka-wicka-wicka-wub-wub-EEERRRR"),
            TestData("fooBarBaz", "fooBar-wicka-wicka-wub-BBBBBBaaaaaaazzzzzzzz")
    )

    for (test in tests) {
        var out = s(test.input)
        if (out != test.output) {
            System.err.println("TEST FAILED")
            System.err.println("IN  " + test.input)
            System.err.println("EXP " + test.output)
            System.err.println("OUT " + out)
            return
        }
    }
    println("Test Passed")
}

Laufen

Funktioniert unter KotlinLang, jedoch nicht unter TryItOnline, da 1.1 nicht unterstützt wird

Lief durch meinen Kompressor, sparte 2 Bytes

jrtapsell
quelle
0

Python 3 , 234 281 270 248 246 Bytes

s,j=input(),"".join;f=lambda l,n:j(c*i for i,c in enumerate(j(l),n));import re;u=re.split("([A-Z])",s);l=len(u)
m=[j(u[i:i+2])for i in range(1,l,2)];i=-~l//4;d=j(m[:i]);print((j([d+"-wicka"*i+"-wub"*(l//2-i)+"-",f(m[i:],len(d))]),f(u[0],1))[l<2])

Probieren Sie es online aus!

47 Bytes hinzugefügt, danke an Mr. Xcoder;)

Dank Jonathan Frech wurden 11 Bytes gespeichert

Dank Halvard Hummel wurden 22 Bytes gespeichert

Dank Mr. Xcoder wurden 2 weitere Bytes gespeichert

jferard
quelle
1
Schlägt für foobar.
Herr Xcoder
@ Mr.Xcoder behoben!
Jferard
2
47 Bytes hinzugefügt, danke an Mr. Xcoder;) > _>
Mr. Xcoder
Mögliche 270 Bytes .
Jonathan Frech
248 Bytes
Halvard Hummel