Wicka-wub uma string

8

Inspirado por isso.

Dada uma string como entrada que consiste apenas em caracteres do alfabeto maiúsculas e minúsculas, faça um wicka-wub .

Como faço para wicka-wub uma string?

O texto de exemplo usado é "DJMcMayhem".

Divida a string antes de cada letra maiúscula, para obter ["D", "J", "Mc", "Mayhem"].

Em seguida, tome as duas metades da lista como sublistas. Isso nos dá [["D", "J"],["Mc", "Mayhem"]]. Se a lista tiver um comprimento ímpar (ou seja, 3), a primeira sub-lista conterá a substring do meio (ou seja [[a,b], [c]]).

Criar uma lista de wickas e wubs. O número de wickas deve ser igual ao comprimento da primeira parte da lista de entrada (ou seja ["D", "J"] -> ["wicka", "wicka"]), e o número de s wubsdeve ser igual ao comprimento da segunda parte da lista de entrada. No nosso caso, isso dá ["wicka", "wicka", "wub", "wub"].

Agora junte as sublistas da lista de entrada em cadeias simples e achatadas.

Atualmente, temos ["DJ", "McMayhem"]e ["wicka", "wicka", "wub", "wub"].

Junte-se à wicka/ wublista com -s: wicka-wicka-wub-wub. Anexar a -. Se houver mais de uma letra maiúscula na entrada, acrescente outra -.

Agora nós temos ["DJ", "McMayhem"]e "-wicka-wicka-wub-wub-".

Anexe a wicka-wubstring ao final do primeiro item na lista de entrada, para obter ["DJ-wicka-wicka-wub-wub-","McMayhem"].

Por fim, repita os caracteres na segunda parte da sequência pelo valor indexado em 0 na sequência de entrada original. No nosso exemplo, isso significa que o primeiro Mseria repetido duas vezes, depois as ctrês vezes e as próximas Mquatro vezes. Entre na lista, para que a segunda parte (a parte em que você acabou de repetir as letras) seja anexada à primeira parte ( "DJ-wicka-wicka-wub-wub-").

Resultado final da entrada:

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

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

Sua tarefa

Sua tarefa é, dada uma sequência que consiste apenas em caracteres do alfabeto maiúsculas e minúsculas, produza a versão em wicka-wubbed dessa sequência.

Algumas regras

  • A entrada pode consistir inteiramente em letras minúsculas ou inteiramente em letras maiúsculas ou em qualquer número de cada um, mas nenhum outro caractere.
  • Se a entrada consistir em letras minúsculas, a saída correta deve ser simplesmente o estágio final (a sequência com os caracteres repetidos de acordo com a posição indexada em 0). Não deve haver wickaou wubnesse caso.
  • As regras padrão se aplicam, programas ou funções completos, até você.
  • Este é um portanto o código mais curto vence.

GoodLuck-wicka-wicka-wub-GGGGGGGGooooooooollllllllllfffffffffffeeeeeeeeeeerrrrrrrrrrrrrssssssssssssss

Casos de teste

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
fonte
Sandbox
caird coinheringaahing 31/08
Você pode adicionar um teste com 5letras maiúsculas?
Rod
Esta é uma implementação de referência ungolfed em Python
caird coinheringaahing
1
Posso usar "Wubba Lubba Dub Dub"? Porém, não me salva bytes: P.
Magic Octopus Urn
2
foobarbazSimplesmente deveria retornar foobarbaz? Existe uma segunda parte?
Erik the Outgolfer

Respostas:

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

Perl 5 , 142 bytes

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

Agora, isso corresponde corretamente a todos os casos de teste fornecidos.

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)

Experimente online!

Nota : O TIO inclui -la execução de todos os testes de uma só vez.

Dom Hastings
fonte
1

Kotlin 1.1 - 494 492 bytes

Submissão

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

Teste

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

Corrida

Funciona no KotlinLang, mas não no TryItOnline, pois o 1.1 não é suportado

Percorreu o meu compressor, salvou 2 bytes

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

Experimente online!

Adicionado 47 bytes, graças ao Sr. Xcoder;)

Economizou 11 bytes graças a Jonathan Frech

Economizou 22 bytes graças a Halvard Hummel

Economizou mais 2 bytes graças ao Sr. Xcoder

jferard
fonte
1
Falha em foobar.
Mr. Xcoder
@ Mr.Xcoder Fixed!
jferard
2
Adicionado 47 bytes, graças a Mr. Xcoder;) > _>
Mr. Xcoder
Possíveis 270 bytes .
Jonathan Frech
248 bytes
Halvard Hummel