Wicka-wub una cadena

8

Inspirado por esto.

Dada una cadena como entrada que consta solo de caracteres del alfabeto en mayúsculas y minúsculas, wicka-wub it.

¿Cómo hago wicka-wub una cadena?

El texto de ejemplo utilizado es "DJMcMayhem".

Divide la cadena antes de cada letra mayúscula, para obtener ["D", "J", "Mc", "Mayhem"].

A continuación, tome las dos mitades de la lista como sublistas. Esto nos da [["D", "J"],["Mc", "Mayhem"]]. Si la lista tiene una longitud impar (es decir, 3), la primera sublista contendrá la subcadena central (es decir [[a,b], [c]]).

Crea una lista de wickasy wubs. El número de wickas debe ser tan largo como la longitud de la primera parte de la lista de entrada (es decir ["D", "J"] -> ["wicka", "wicka"]), y el número de s wubsdebe ser tan largo como la longitud de la segunda parte de la lista de entrada. En nuestro caso, esto da ["wicka", "wicka", "wub", "wub"].

Ahora une las sublistas de la lista de entrada en cadenas individuales y aplana.

Actualmente tenemos ["DJ", "McMayhem"]y ["wicka", "wicka", "wub", "wub"].

Unirse a la wicka/ wublista con -s: wicka-wicka-wub-wub. Anteponer a -. Si hay más de una letra mayúscula en la entrada, agregue otra -.

Ahora tenemos ["DJ", "McMayhem"]y "-wicka-wicka-wub-wub-".

Agregue la wicka-wubcadena al final del primer elemento en la lista de entrada, para obtener ["DJ-wicka-wicka-wub-wub-","McMayhem"].

Por último, repita los caracteres en la segunda parte de la cadena por su valor indexado 0 en la cadena de entrada original. En nuestro ejemplo, eso significa que el primero Mse repetiría dos veces, luego las ctres veces y las siguientes Mcuatro veces. Únase a la lista, de modo que la segunda parte (la parte en la que acaba de repetir letras) se agrega a la primera parte ( "DJ-wicka-wicka-wub-wub-").

Resultado final de la entrada:

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

Proceso total:

["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"

Tu tarea

Su tarea es, dada una cadena que consta de solo caracteres alfabéticos en mayúscula y minúscula, generar la versión wicka-wubbed de esa cadena.

Algunas reglas

  • La entrada puede consistir completamente en letras minúsculas, o letras mayúsculas, o cualquier número de cada una, pero no otros caracteres.
  • Si la entrada consta de letras minúsculas enteras, la salida correcta debería ser simplemente la etapa final (la cadena con los caracteres repetidos según su posición indexada en 0). No debería haber wickao wuben ese caso.
  • Aplican reglas estándar, programas completos o funciones, depende de usted.
  • Este es un por lo que gana el código más corto.

GoodLuck-wicka-wicka-wub-GGGGGGGGooooooooollllllllllfffffffffffeeeeeeeeeeerrrrrrrrrrrrrssssssssssssss

Casos de prueba

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
fuente
Sandbox
caird coinheringaahing
¿Puedes agregar una prueba con 5letras mayúsculas?
Rod
Esta es una implementación de referencia sin protección en Python
caird coinheringaahing
1
¿Puedo usar "Wubba Lubba Dub Dub" en su lugar? Sin embargo, no me ahorra bytes: P.
Urna mágica del pulpo
2
¿Debería foobarbazsimplemente regresar foobarbaz? ¿Hay alguna segunda parte?
Erik the Outgolfer

Respuestas:

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

Sin golf:

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
fuente
1

Perl 5 , 142 bytes

Código de 130 bytes + 12 para -F(?=[A-Z]).

Esto ahora coincide correctamente con todos los casos de prueba proporcionados.

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)

Pruébalo en línea!

Nota : TIO incluye -lejecutar todas las pruebas a la vez.

Dom Hastings
fuente
1

Kotlin 1.1 - 494 492 bytes

Sumisión

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()

Prueba

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")
}

Corriendo

Funciona en KotlinLang, pero no en TryItOnline ya que 1.1 no es compatible

Corrí a través de mi compresor, guardé 2 bytes

jrtapsell
fuente
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])

Pruébalo en línea!

Se agregaron 47 bytes, gracias al Sr. Xcoder;)

Guardado 11 bytes gracias a Jonathan Frech

Guardado 22 bytes gracias a Halvard Hummel

Ahorré 2 bytes más gracias al Sr. Xcoder

jferard
fuente
1
Falla por foobar.
Sr. Xcoder
@ Mr.Xcoder fijo!
jferard
2
Se agregaron 47 bytes, gracias a Mr. Xcoder;) > _>
Mr. Xcoder
Posibles 270 bytes .
Jonathan Frech
248 bytes
Halvard Hummel