Piramida string yang rusak

10

Diberikan string n, buat piramida string terpecah-pecah relatif terhadap baris saat ini.

Baris pertama berisi string yang tidak dimodifikasi.

Baris kedua berisi string yang dipisahkan menjadi dua bagian oleh pipa.

Baris ketiga memisahkannya dengan pertiga ...

Dan seterusnya. Panjang setiap substring, di mana l adalah panjang string n sama dengan

lantai (l / n)

Karakter yang tersisa dimasukkan ke dalam substring mereka sendiri. Baris terakhir yang digunakan adalah baris pertama yang panjangnya 2 substring.

Kasus uji:

Input: Halo, dunia.

Keluaran:

Hello, world.

Hello,| world|.

Hell|o, w|orld|.

Hel|lo,| wo|rld|.

He|ll|o,| w|or|ld|.

Input: abcdefghij

Keluaran:

abcdefghij

abcde|fghij

abc|def|ghi|j

ab|cd|ef|gh|ij

Input: 01234567890abcdef

Keluaran:

01234567890abcdef

01234567|890abcde|f

01234|56789|0abcd|ef

0123|4567|890a|bcde|f

012|345|678|90a|bcd|ef

01|23|45|67|89|0a|bc|de|f

Aturan tambahan:

  • Anda dapat menulis program atau fungsi lengkap, mana yang menggunakan lebih sedikit kode.

  • Panjang input akan selalu minimal 4 karakter.

  • Anda HARUS menggunakan jeda baris jika bahasa Anda mendukungnya. Jika tidak memungkinkan, ganti jeda baris dengan:

  • Input akan selalu dapat dicetak ASCII.

  • Kurang 100% jika program Anda memecahkan P vs NP.


Papan peringkat:

Julian Lachniet
sumber
0 byte:return: false
Gabriel Benamy
3
Tantangan pertama yang bagus! Beberapa pertanyaan klarifikasi - apakah input hanya dapat dicetak ASCII (saya sangat menyarankan "ya")? Apa yang dimaksud dengan "jeda baris jika perlu"?
AdmBorkBork
3
Itu lelucon. P vs NP adalah masalah yang belum terpecahkan dalam komputasi. Leluconnya adalah jika Anda bisa menyelesaikannya, saya akan berhenti memperhatikan fakta bahwa program Anda tidak menyelesaikan tantangan.
Julian Lachniet
3
Masalah nyata yang belum terpecahkan dalam komputasi adalah "tab atau spasi" ...
FlipTack
3
Tidak, masalah sebenarnya adalah Internet Explorer.
Julian Lachniet

Jawaban:

0

JavaScript (ES6), 103 101 91 84 byte

Diperbaiki untuk menghormati persyaratan tantangan

f=(s,n=0,p=s.length/++n|0)=>p>1?s.match(eval('/.{1,'+p+'}/g')).join`|`+'\n'+f(s,n):''

Lambda fyang mengambil string input sebagai parameter pertama sdan mencetak secara rekursif untuk menghibur string split. Cukup mudah: selama panjang substring p,, di atas 1, cetak string yang dipisah dengan '|' setiap pkarakter, kemudian lanjutkan dengan menambahkan level berikut. Ini kemudian memanggil fungsi lagi dengan pmenjadi t / nlantai, di mana tpanjang string asli dan nmenjadi pembagi yang bertambah.

XavCo7
sumber
Saya tidak berpikir membagi ndengan 2 setiap kali itu benar.
Neil
@Neil Anda benar, kesalahan pada bagian saya. Saya memperbaiki masalah dan menyimpan 2 byte dalam proses.
XavCo7
@ ETHproductions Saya memikirkan hal itu, tetapi saya tidak tahu apakah itu akan dianggap sebagai STDOUT ... Saya kira saya perlu melakukan alert(f(s))setelahnya?
XavCo7
4

Perl, 46 + 1 = 47 byte

Jalankan dengan -nbendera

say s/.{$=}(?=.)/$&|/gr while($==y///c/++$,)-2

Cobalah online!

Rincian kode

-n                                              #Reads input into the $_ variable
say s/.{$=}(?=.)/$&|/gr while($==y///c/++$,)-2
                                 y///c          #Transliteration.  Implicitly operates on $_, replacing every character with itself and counting replacements
                                                #y///c effectively returns the length of $_
                                      /++$,     #Increments $, (which starts off at 0) and divides the length of $_ by $,
                              $==               #Stores the result of this division into $=
                                                #$= forces its contents to be an integer, so it truncates any decimal
                             (             )-2  #Returns 0 if $= is equal to 2
                        while                   #Evaluates its RHS as the condition.  If truthy, evaluates its LHS.
    s/          /   /gr                         #Substitution.  Implicitly operates on $_.
                                                #Searches for its first argument and replaces it with its second argument, repeating until it's done, and returns the new string.  $_ is not modified.
      .{$=}                                     #Looks for a string of $= characters...
           (?=.)                                #...that is followed by at least one non-newline character, but does not include this character in the match...
                 $&|                            #...and replaces it with itself followed by a pipe character.
say                                             #Output the result of the substitution.
Gabriel Benamy
sumber
Ini sepertinya tidak bekerja untuk input yang lebih lama.
Neil
2

Pyth, 16 byte

Vh/lQ3j\|cQ/lQhN

V                # For N in range(1, \/ )
 h/lQ3           # 1+lenght(input)/3
      j\|        # join with '|'
         cQ      # chop input in
           /lQhN # lenght(input)/(N+1) pieces

coba di sini

tongkat
sumber
1
Ini mungkin bekerja untuk kasus uji tapi saya tidak berpikir itu bekerja untuk input yang lebih lama
Neil
2

C, 145 131 128 125 byte

l,n,i=1,j;f(char*s){l=strlen(s);puts(s);do{n=l/++i;for(j=0;j<l;)j&&(j%n||putchar('|')),putchar(s[j++]);puts("");}while(n>2);}

Ini adalah fungsi yang mengambil string sebagai argumennya dan mencetak output ke STDOUT.

l,n,i=1,j;       // declare some variables
f(char*s){       // declare the function
l=strlen(s);     // get the length of the string
puts(s);         // output the initial version, with trailing newline
do{n=l/++i;      // n is the number of characters per "section",
                 //  and we'll do-while n>2 to stop at the right time
for(j=0;j<l;)    // loop through the characters of the string
j&&(             // if j != 0,
j%n||            // and j % n == 0,
putchar('|')),   // insert a | before this character
putchar(s[j++]); // print the character
puts("");        // print a newline after the loop
}while(n>2);}
Gagang pintu
sumber
Bagaimana cara kerjanya sekali i*i>l? Sepertinya akan mulai mengulangi bagian.
Neil
@ Neil Saya tidak yakin apa yang Anda maksud. Bisakah Anda memberi contoh?
Gagang Pintu
@Neil Ah, sudahlah, aku mengerti apa yang kamu katakan. Yang tampaknya menjadi lubang dalam spesifikasi, yang secara eksplisit menyatakan bahwa panjang setiap substring adalah floor(l/n); Saya tidak yakin apa perilaku yang dimaksud untuk input yang lebih lama atau jika OP mengantisipasi hal itu.
Gagang Pintu
1

Pyth, 17 byte

jmj\|cQ/lQdSh/lQ3

Penjelasan

     cQ/lQ         Divide into equal pieces (with the last shorter)
  j\|              Join with pipes
 m        d        Map to each row index...
           Sh/lQ3  ... up to the first row with substrings of length 2
j                  Join with newlines

sumber
1

Javascript, 98 Bytes

a=>{for(b=1;2<=a.length/b;)eval("console.log(a.match(/.{1,"+(a.length/b|0)+"}/g).join('|'))"),b++}

Fungsi x(a). Panggilan menggunakan

console.log(x("ABCDEF"))

Julian Lachniet
sumber
0

Ruby 60 + 1 = 61 byte

+1 byte untuk -nbendera.

z= ~/$/
(z/3+1).times{|n|puts $_.scan(/.{1,#{z/(n+1)}}/)*?|}

Lihat di Ideone: http://ideone.com/RtoReG

Yordania
sumber
0

Python 3, 123 byte

f=lambda s:print(*['|'.join(s[i:i+n]for i in range(0,len(s),n))for n in[len(s)//i for i in range(1,len(s)//2+1)]],sep='\n')

Pada string yang lebih panjang, beberapa bagian akan diulangi, seperti rumus untuk panjang substring floor(l/n). Misalnya dengan string 13 karakter, string yang dipecah menjadi 5 akan sama dengan string yang dipisah menjadi 6's floor(13/5)==floor(13/6). Saya tidak yakin apakah OP mengharapkan ini atau apakah itu kekhilafan.

Cormac
sumber