Wicka-wub sebuah string

8

Terinspirasi oleh ini.

Diberikan string sebagai input yang hanya terdiri dari karakter alfabet huruf besar dan kecil, wicka-wub .

Bagaimana cara memasang string?

Contoh teks yang digunakan adalah "DJMcMayhem".

Pisahkan string sebelum setiap huruf besar, jadi Anda dapatkan ["D", "J", "Mc", "Mayhem"].

Selanjutnya, ambil dua bagian dari daftar sebagai sublists. Ini memberi kita [["D", "J"],["Mc", "Mayhem"]]. Jika daftar adalah panjang ganjil (yaitu 3), sublist pertama akan berisi substring tengah (yaitu [[a,b], [c]]).

Buat daftar wickas dan wubs. Jumlah wickas harus sebanyak panjang bagian pertama dari daftar input (yaitu ["D", "J"] -> ["wicka", "wicka"]), dan jumlah wubsharus sebanyak panjang bagian kedua dari daftar input. Dalam kasus kami, ini memberi ["wicka", "wicka", "wub", "wub"].

Sekarang gabungkan sublist dari daftar input ke dalam string tunggal dan ratakan.

Saat ini kami memiliki ["DJ", "McMayhem"]dan ["wicka", "wicka", "wub", "wub"].

Bergabung dengan wicka/ wubdaftar dengan -s: wicka-wicka-wub-wub. Berlaku a -. Jika ada lebih dari satu huruf kapital di input, tambahkan yang lain -.

Sekarang kita punya ["DJ", "McMayhem"]dan "-wicka-wicka-wub-wub-".

Tambahkan wicka-wubstring ke akhir item pertama dalam daftar input, untuk mendapatkan ["DJ-wicka-wicka-wub-wub-","McMayhem"].

Terakhir, ulangi karakter di bagian kedua dari string dengan nilai 0-indexed mereka di string input asli. Dalam contoh kita, itu berarti yang pertama Makan diulang dua kali, lalu ctiga kali, dan Mempat kali berikutnya . Bergabunglah dengan daftar, jadi bagian kedua (bagian yang baru saja Anda ulangi hurufnya) ditambahkan ke bagian pertama ( "DJ-wicka-wicka-wub-wub-").

Hasil akhir dari input:

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

Total proses:

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

Tugas Anda

Tugas Anda adalah, diberi string yang hanya terdiri dari karakter alfabet huruf besar dan kecil, menghasilkan versi wicka-wubbed dari string itu.

Beberapa aturan

  • Masukan dapat seluruhnya terdiri dari huruf kecil, atau seluruhnya huruf besar, atau jumlah masing-masing, tetapi tidak ada karakter lain.
  • Jika input terdiri dari huruf kecil seluruhnya, output yang benar harus menjadi tahap akhir (string dengan karakter diulang sesuai dengan posisi 0-diindeks). Seharusnya tidak ada wickaatau wubdalam kasus itu.
  • Aturan standar berlaku, program atau fungsi lengkap, terserah Anda.
  • Ini adalah sehingga kode terpendek menang.

GoodLuck-wicka-wicka-wub-GGGGGGGGooooooooollllllllllfffffffffffeeeeeeeeeeerrrrrrrrrrrrrssssssssssssss

Uji kasus

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
sumber
Sandbox
caird coinheringaahing
Bisakah Anda menambahkan tes dengan 5huruf besar?
Rod
Ini adalah implementasi referensi yang tidak disatukan dalam Python
caird coinheringaahing
1
Bisakah saya menggunakan "Wubba Lubba Dub Dub" sebagai gantinya? Tidak menyelamatkan saya byte: P.
Magic Octopus Mm
2
Haruskah foobarbazkembali saja foobarbaz? Apakah ada bagian kedua?
Erik the Outgolfer

Jawaban:

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

Tidak Disatukan:

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

Perl 5 , 142 byte

130 byte kode + 12 untuk -F(?=[A-Z]).

Ini sekarang dengan benar cocok dengan semua test case yang disediakan.

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)

Cobalah online!

Catatan : TIO termasuk -luntuk menjalankan semua tes sekaligus.

Dom Hastings
sumber
1

Kotlin 1.1 - 494 492 byte

pengajuan

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

Uji

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

Lari

Bekerja di KotlinLang, tetapi tidak pada TryItOnline karena 1.1 tidak didukung

Berlari melalui kompresor saya, menghemat 2 byte

jrtapsell
sumber
0

Python 3 , 234 281 270 248 246 byte

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

Cobalah online!

Menambahkan 47 byte, terima kasih kepada Tn. Xcoder;)

Disimpan 11 byte berkat Jonathan Frech

Disimpan 22 byte berkat Halvard Hummel

Disimpan 2 byte lebih banyak berkat Tn. Xcoder

jferard
sumber
1
Gagal untuk foobar.
Tn. Xcoder
@ Mr.Xcoder Diperbaiki!
jferard
2
Ditambahkan 47 byte, terima kasih kepada Tn. Xcoder;) > _>
Tn. Xcoder
Kemungkinan 270 byte .
Jonathan Frech
248 byte
Halvard Hummel