Sufiks Meledak

20

Diberikan string ASCII, mengeluarkan sufiks yang meledak itu. Misalnya, jika string itu abcde, ada 5 sufiks, yang dipesan terpanjang hingga terpendek:

abcde
bcde
cde
de
e

Setiap sufiks kemudian meledak , artinya setiap karakter disalin sebanyak lokasi yang diindeks dalam sufiks tersebut. Misalnya, meledak sufiks abcde,

abcde
12345
abbcccddddeeeee

bcde
1234
bccdddeeee

cde
123
cddeee

de
12
dee

e
1
e

Secara keseluruhan, sufiks meledak abcdeadalah

abbcccddddeeeee
bccdddeeee
cddeee
dee
e

Aturan

  • Ini adalah sehingga kode terpendek menang.
  • Input akan terdiri dari karakter ASCII yang dapat dicetak. (Ini tidak termasuk baris baru tetapi termasuk spasi.)
  • Output akan memiliki setiap string pada baris yang terpisah.
  • Ruang tambahan diperbolehkan di setiap baris dan mungkin ada baris baru tambahan di akhir baris.

Uji Kasus

''

'a'
a

'bc'
bcc
c

'xyz'
xyyzzz
yzz
z

'code-golf'
coodddeeee-----ggggggooooooollllllllfffffffff
oddeee----gggggoooooolllllllffffffff
dee---ggggooooollllllfffffff
e--gggoooolllllffffff
-ggooollllfffff
goolllffff
ollfff
lff
f

's p a c e'
s  ppp    aaaaa      ccccccc        eeeeeeeee
 pp   aaaa     cccccc       eeeeeeee
p  aaa    ccccc      eeeeeee
 aa   cccc     eeeeee
a  ccc    eeeee
 cc   eeee
c  eee
 ee
e
mil
sumber
2
Terkait Terkait Terkait
Martin Ender
Apa yang terjadi pada 'ccodegolf'?
RosLuP

Jawaban:

14

Jelly , 5 byte

ṫJxJY

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

ṫJxJY  Main link. Argument: s (string)

 J     Indices; yield I := [1, ..., len(s)].
ṫ      Tail; get the suffixes of s starting at indices [1, ..., len(s)].
   J   Indices; yield I again.
  x    Repeat. The atom 'x' vectorizes at depth 1 (1D arrays of numbers/characters)
       in its arguments. This way, each suffix t gets repeated I times, meaning
       that the first character of t is repeated once, the second twice, etc.
       If left and right argument have different lengths, the longer one is
       truncated, so I can safely be applied to all suffixes.
    Y  Join, separating by linefeeds.
Dennis
sumber
8

J, 22 12 8 byte

Berkat miles untuk menghemat 14 byte!

(#~#\)\.

Sekarang ini solusi yang sangat bagus. Cukup ringkas juga.

Ini adalah pengait yang #~#\diterapkan pada sufiks ( \.) dari input. Pengait, saat dipanggil pada input y, didekomposisi sebagai berikut:

(#~#\) y
y #~ #\ y

Berikut adalah beberapa hasil antara:

   ]s =: 's p a c e'
s p a c e
   #\ s
1 2 3 4 5 6 7 8 9
   (quote) s
's p a c e'
   (quote;#)\ s
+-----------+-+
|'s'        |1|
+-----------+-+
|'s '       |2|
+-----------+-+
|'s p'      |3|
+-----------+-+
|'s p '     |4|
+-----------+-+
|'s p a'    |5|
+-----------+-+
|'s p a '   |6|
+-----------+-+
|'s p a c'  |7|
+-----------+-+
|'s p a c ' |8|
+-----------+-+
|'s p a c e'|9|
+-----------+-+
   1 2 3 # '123'
122333
   3 3 3 # '123'
111222333
   ]\. s
s p a c e
 p a c e
p a c e
 a c e
a c e
 c e
c e
 e
e
   quote\. s
's p a c e'
' p a c e'
'p a c e'
' a c e'
'a c e'
' c e'
'c e'
' e'
'e'
   (#~#\) s
s  ppp    aaaaa      ccccccc        eeeeeeeee
   (#~#\)\. s
s  ppp    aaaaa      ccccccc        eeeeeeeee
 pp   aaaa     cccccc       eeeeeeee
p  aaa    ccccc      eeeeeee
 aa   cccc     eeeeee
a  ccc    eeeee
 cc   eeee
c  eee
 ee
e

Uji kasus

   f =: (#~#\)\.
   f
(#~ #\)\.
   f ''
   f 'a'
a
   f 'bc'
bcc
c
   f 'xyz'
xyyzzz
yzz
z
   f 'code-golf'
coodddeeee-----ggggggooooooollllllllfffffffff
oddeee----gggggoooooolllllllffffffff
dee---ggggooooollllllfffffff
e--gggoooolllllffffff
-ggooollllfffff
goolllffff
ollfff
lff
f
   f 's p a c e'
s  ppp    aaaaa      ccccccc        eeeeeeeee
 pp   aaaa     cccccc       eeeeeeee
p  aaa    ccccc      eeeeeee
 aa   cccc     eeeeee
a  ccc    eeeee
 cc   eeee
c  eee
 ee
e

   ]tc =: <;._1 '|' , '|a|bc|xyz|code-golf|s p a c e'
++-+--+---+---------+---------+
||a|bc|xyz|code-golf|s p a c e|
++-+--+---+---------+---------+
   ,. f &. > tc
+---------------------------------------------+
+---------------------------------------------+
|a                                            |
+---------------------------------------------+
|bcc                                          |
|c                                            |
+---------------------------------------------+
|xyyzzz                                       |
|yzz                                          |
|z                                            |
+---------------------------------------------+
|coodddeeee-----ggggggooooooollllllllfffffffff|
|oddeee----gggggoooooolllllllffffffff         |
|dee---ggggooooollllllfffffff                 |
|e--gggoooolllllffffff                        |
|-ggooollllfffff                              |
|goolllffff                                   |
|ollfff                                       |
|lff                                          |
|f                                            |
+---------------------------------------------+
|s  ppp    aaaaa      ccccccc        eeeeeeeee|
| pp   aaaa     cccccc       eeeeeeee         |
|p  aaa    ccccc      eeeeeee                 |
| aa   cccc     eeeeee                        |
|a  ccc    eeeee                              |
| cc   eeee                                   |
|c  eee                                       |
| ee                                          |
|e                                            |
+---------------------------------------------+
Conor O'Brien
sumber
Keren, cara lain untuk menghemat beberapa byte adalah dengan menggunakan kata sandi awalan
mil
@miles apa maksudmu?
Conor O'Brien
Anda bisa mendapatkan panjang setiap awalan sebagai cara yang lebih pendek untuk menghasilkan rentang itu
mil
@miles Ah, tentu saja.
Conor O'Brien
7

Python, 61 byte

f=lambda s,i=0:s[i:]and-~i*s[i]+f(s,i+1)or s and'\n'+f(s[1:])

Alternatif 63:

f=lambda s,b=1:s and f(s[:-1],0)+s[-1]*len(s)+b*('\n'+f(s[1:]))
Tidak
sumber
6

Python 3, 91 68 65 byte

def f(s):f(s[1:print(''.join(i*c for i,c in enumerate(s[0]+s)))])

Berakhir dengan kesalahan setelah mencetak output yang diinginkan. Uji di Ideone .

Bagaimana itu bekerja

Sebelum f dapat menyebut dirinya secara rekursif, indeks s[1:...]harus dihitung.

Pertama enumerate(s[0]+s)menghasilkan semua pasangan (i, c) karakter c dari s - dengan karakter pertamanya digandakan - dan indeks yang sesuai i . Prepending s[0]melayani dua tujuan di sini.

  • Karakter pertama s harus diulangi sekali, tetapi indeks pertama adalah 0 .

  • Setelah semua karakter diproses, s[0]akan menaikkan IndexError , menyebabkan f untuk berakhir dengan kesalahan daripada mencetak baris baru sampai batas rekursi tercapai.

''.join(i*c for i,c in ...)membangun string datar masing-masing c diulang i kali, yang printgema untuk STDOUT.

Akhirnya, karena printmengembalikan None dan s[1:None]sederhananya s[1:], panggilan rekursif f(s[1:...])mengulangi proses di atas untuk s tanpa karakter pertama.

Dennis
sumber
6

Perl 6 , 38 byte

m:ex/.+$/.map:{put [~] .comb Zx 1..*}

37 byte + 1 untuk -nsakelar baris perintah

Contoh:

$ perl6 -ne 'm:ex/.+$/.map:{put [~] .comb Zx 1..*}' <<< 'code-golf'
coodddeeee-----ggggggooooooollllllllfffffffff
oddeee----gggggoooooolllllllffffffff
dee---ggggooooollllllfffffff
e--gggoooolllllffffff
-ggooollllfffff
goolllffff
ollfff
lff
f

Diperluas:

# -n command line switch takes each input line and places it in 「$_」

# You can think of it as surrounding the whole program with a for loop
# like this:
for lines() {

  # match
  m
  :exhaustive # every possible way
  / .+ $/     # at least one character, followed by the end of the string

  .map:

  {
    put           # print with newline
      [~]         # reduce using string concatenation ( don't add spaces between elements )
        .comb     # split into individual chars
        Z[x]      # zip using string repetition operator
        1 .. *    # 1,2,3,4 ... Inf
  }

}
Brad Gilbert b2gills
sumber
5

Brachylog , 17 byte

@]Elyk:Erz:jac@w\

Cobalah online!

Penjelasan

@]E                 E is a suffix of the Input
   lyk              The list [0, ..., length(E) - 1]
      :Erz          The list [[0th char of E, 0], ..., [Last char of E, length(E) - 1]]
          :ja       For all elements of that list, concatenate the Ith char I times to itself
             c      Concatenate the list into a string
              @w    Write followed by a line break
                \   False: backtrack to another suffix of the Input
Fatalisasi
sumber
4

05AB1E , 13 byte

.sRvyvyN>×}J,

Cobalah online!

Penjelasan

.s              # push list of suffixes of input
  R             # reverse the list
   vy           # for each string
     vy   }     # for each char in string
       N>×      # repeat it index+1 times
           J,   # join and print with newline
Emigna
sumber
4

CJam , 14 byte

Sl+{_eee~n1>}h

Cobalah online!

Penjelasan

Sl+   e# Read input and prepend a space.
{     e# While the string is non-empty...
  _   e#   Make a copy.
  ee  e#   Enumerate. Gives, e.g. [[0 ' ] [1 'a] [2 'b] [3 'c]].
  e~  e#   Run-length decode. Gives "abbccc".
  n   e#   Print with trailing linefeed.
  1>  e#   Discard first character.
}h
Martin Ender
sumber
4

C #, 101 byte

f=s=>{var r="\n";for(int i=0;i<s.Length;)r+=new string(s[i],++i);return""==s?r:r+f(s.Substring(1));};

Fungsi anonim rekursif, yang juga mencetak baris baru. Jika baris baru terkemuka tidak diizinkan, 3 byte tambahan mengubahnya menjadi baris tambahan:

f=s=>{var r="";for(int i=0;i<s.Length;)r+=new string(s[i],++i);return""==s?r:r+"\n"+f(s.Substring(1));};

Program lengkap dengan metode ungolfed dan uji kasus:

using System;

namespace ExplodedSuffixes
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<string, string> f = null;
            f = s =>
            {
                var r = "\n";
                for (int i = 0; i < s.Length; )
                    r += new string(s[i], ++i);
                return "" == s ? r : r + f(s.Substring(1));
            };

            // test cases:
            string x = "abcde";
            Console.WriteLine("\'" + x + "\'" + f(x));
            x = "";
            Console.WriteLine("\'" + x + "\'" + f(x));
            x = "a";
            Console.WriteLine("\'" + x + "\'" + f(x));
            x = "bc";
            Console.WriteLine("\'" + x + "\'" + f(x));
            x = "xyz";
            Console.WriteLine("\'" + x + "\'" + f(x));
            x = "code-golf";
            Console.WriteLine("\'" + x + "\'" + f(x));
            x = "s p a c e";
            Console.WriteLine("\'" + x + "\'" + f(x));
        }
    }
}
adrianmp
sumber
4

Haskell, 48 byte

e=map(concat.zipWith replicate[1..]).scanr(:)[] 

dihubungkan oleh salah satu dari

ghc exploded_suffixes.hs -e 'e"abcde"'
ghc exploded_suffixes.hs -e 'mapM_ putStrLn.e=<<getLine' <<<code-golf
ghc exploded_suffixes.hs -e 'Control.Monad.forever$putStr.unlines.e=<<getLine'
Roman Czyborra
sumber
Saya suka pointfree-ness. Anda harus meletakkan kode 63-byte Anda di dalam bloknya sendiri dan kemudian menunjukkan doa secara terpisah.
xnor
Anda tidak perlu putStr., kami menerima sebagai fungsi output. Anda memang perlu import Data.Listmenggunakannya tails.
xnor
Anda dapat mengganti uncurry ... zipdengan zipWith: unlines.map(concat.zipWith replicate[1..]).tails.
nimi
Ya memang! The zipWith replicatemempersingkat juga terjadi kepada saya ketika saya terbangun. Kasihan yang tailstidak ada di dalam Preludesaya dapat mengambil tailsdari Data.Listsecara implisit tanpa penuh import dan masih tanpa melebihi yang foldrsetara. Mengenai kemurnian tanpa IOboiler-plate saya juga akan meninggalkanmapM_ putStrLn bumbu sesuai selera pembaca dan tidak melakukan unlineskeduanya. Mendefinisikan sebuah blok e=akan membutuhkan hitungan byte.
Roman Czyborra
Menggunakan nama yang memenuhi syarat tanpa importsbukanlah standar Haskell, tetapi fitur dari ghcirepl. Bergantung pada hal-hal seperti itu dianggap sebagai bahasa yang terpisah, jadi saya sarankan untuk mengubah judul jawaban Anda menjadi sesuatu seperti Haskell (ghci). ( Lihat juga diskusi meta ini ).
nimi
3

Perl, 36 +1 ( -n) = 37 byte

/.+$(?{$.=say$&=~s%.%$&x$.++%rge})^/

Kebutuhan -ndan -E(atau -M5.010) untuk dijalankan:

perl -nE '/.+$(?{$.=say$&=~s%.%$&x$.++%rge})^/' <<< "code-golf"

Perhatikan bahwa ini hanya berfungsi pada satu instance setiap kali Anda menjalankannya (karena ia menggunakan variabel $.yang bertambah setiap kali sebuah baris dibaca, jadi ia 1hanya memegang pertama kali sebuah baris dibaca). (Tapi tidak ada masalah di sini, ^Djalankan saja dan jalankan kembali!)

Dada
sumber
3

Retina , 31 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

M&!`.+

$.%`$*»
%+r`»($|.)
$1$1

Cobalah online!

Martin Ender
sumber
3

Jawa, 150 127 byte

Edit:

  • -23Off byte. Terima kasih kepada @Kevin Cruijssen

Snipet:

f->{String s[]=f.split(""),o="";int i=-1,j,l=s.length;for(;++i<l;)for(j=-2;++j<i;o+=s[i]);return l<1?"":o+"\n"+f.substring(1);}

Tidak Terkumpul:

public static String explodeSuff(String suff){
  char [] s = suff.toCharArray();
  String out = "";
  if(s.length==0)return "";
  for(int i=-1;++i<s.length;){
    for(int j=-2;++j<i;){
      out+=s[i];
    }
  }
  return out+"\n"+suff.subString(1);
}
Roman Gräf
sumber
Hai, Anda bisa bermain golf cukup sederhana hanya dengan menghilangkan spasi dan beberapa trik kecil:f->{String s[]=f.split(""),o="";int i=-1,j,l=s.length;for(;++i<l;)for(j=-2;++j<i;o+=s[i]);return l<1?o:o+"\n"+f.substring(1);}
Kevin Cruijssen
2

Racket 184 byte

(let p((l(string->list s))(ol'()))(cond[(null? l)(display(list->string(flatten ol)))]
[else(p(cdr l)(append ol(list #\newline)(for/list((i l)(n(length l)))(for/list((j(+ 1 n)))i))))]))

Tidak Terkumpul:

(define(f s)
 (let loop((l(string->list s))
             (outl '()))
    (cond
      [(null? l)
       (display
        (list->string
         (flatten outl)))]
      [else
       (loop
        (rest l)
        (append outl
                (list #\newline)
                (for/list ((i l)
                           (n (length l)))
                  (for/list ((j (add1 n)))
                    i
                    ))))]  )))


(f "abcde")
(f "xyz")

Keluaran:

abbcccddddeeeee
bccdddeeee
cddeee
dee
e

xyyzzz
yzz
z
juga
sumber
2

JavaScript (ES6), 65 byte

f=s=>s?[s.replace(/./g,(c,i)=>c.repeat(i+1)),...f(s.slice(1))]:[]
<input oninput=o.textContent=f(this.value).join`\n`><pre id=o>

Upaya sebelumnya:

67: s=>[...s].map((_,i)=>s.slice(i).replace(/./g,(c,i)=>c.repeat(i+1)))
84: s=>s.replace(/./g,`$&$'
    `).match(/.+/g).map(s=>s.replace(/./g,(c,i)=>c.repeat(i+1)))
89: f=(s,t=s.replace(/./g,(c,i)=>c.repeat(i+1)))=>t?[]:[t,...f(s,t.replace(/(.)(?=\1)/g,''))]
Neil
sumber
2

PHP, 103 byte (99 dengan tag pendek)

<?php for($s=$argv[1];""!=$s[$i++];$o.="
")for($j=0;""!=$l=$s[$j+$i-1];)$o.=str_pad('',++$j,$l);echo$o;

Saya cukup yakin ini bukan jawaban sesingkat mungkin.

pengguna59178
sumber
2

MATL , 12 byte

&+gYRYs"G@Y"

Saya suka ketika tanda kutip datang bersamaan!

Cobalah online!

Penjelasan

Ini bekerja dengan membangun matriks yang kolomnya digunakan, satu per satu, untuk menjalankan-panjang mendekode input. Sebagai contoh, untuk input 'abcde'matriks adalah

1 0 0 0 0
2 1 0 0 0
3 2 1 0 0
4 3 2 1 0
5 4 3 2 1

Kode:

&+g    % Implicit input. NxN matrix of ones, where N is input size
YR     % Set entries above diagonal to zero
Ys     % Cumulative sum of each column. This gives the desired matrix 
"      % For each column
  G    %   Push input (for example 'abcde')
  @    %   Push current column (for example [0;0;1;2;3])
  Y"   %   Run-length decode (example output 'cddeee')
       % Implicit end
       % Implicit display
Luis Mendo
sumber
1

Python 3, 95 byte

def f(s):return'\n'.join(''.join(s[j:][i]*(i+1)for i in range(len(s)-j))for j in range(len(s)))

Ini secara mengejutkan lebih sulit daripada yang saya harapkan. Saya redid seluruh fungsi saya mungkin 4 kali.

zawata
sumber
1

Java 7.140 byte

void c(char[]a,int l,int j){if(l<1)return;c(a,--l,++j);for(int i=0,k;i<j;i++)for(k=0;k++<=i;)System.out.print(a[i+l]);System.out.println();}

Tidak disatukan

 void c(char[]a,int l,int j)
{
if (l < 1) 
return ;
c(a , --l , ++j) ;
for(int i = 0 , k; i < j ; i++)
for(k = 0 ; k++ <= i ;)
System.out.print(a[i+l]);
System.out.println();
}

Baris berikut memberi saya sangat sakit. Saya tidak tahu bagaimana saya bisa golf itu (karena ada dua loop untuk mematahkan kondisi untuk dimasukkan ke "\n"dalam pernyataan cetak).
System.out.println();

Numberknot
sumber
Bagaimana dengan metode yang tepat yang tidak perlu mengirimkan panjang array juga sebagai argumen? Saat ini orang dapat memicu pengecualian IndexOutOfBounds dengan mengirimkan nilai yang salah secara tidak sengaja ...
adrianmp
1

Pyke, 12 byte

VilS],A*s
}t

Coba di sini!

Biru
sumber
1

Ruby, 51 byte

Menggunakan -nbendera untuk +1 byte.

(k=0;puts$_.gsub(/./){$&*k+=1};$_[0]="")while$_>$/
Nilai Tinta
sumber
1

R, 108 byte

Baca input dari stdin dan cetak ke stdout

s=scan(,"");n=nchar(s);for(i in 1:n)cat(do.call("rep",list(strsplit(s,"")[[1]][i:n],1:(n-i+1))),"\n",sep="")

Saya merasa penggunaannya do.callsesuai di sini. Pada dasarnya dibutuhkan dua input: 1. nama fungsi dalam bentuk string (di repsini) dan daftar argumen dan 2. berulang-ulang menerapkan panggilan fungsi menggunakan argumen dalam daftar.

Misalnya:

  • rep("c",3) menghasilkan vektor "c" "c" "c"
  • do.call("rep",list(c("a","b","c"),1:3)) menghasilkan vektor "a" "b" "b" "c" "c" "c"
  • yang setara dengan panggilan berturut-turut rep("a",1), rep("b",2)danrep("c",3)
Billywob
sumber
1

Vim, 43 byte

qqYlpx@qq@qqr0<C-H><C-V>{$:s/\v%V(.)\1*/&\1/g<CR>@rq@r

Makro pertama memisahkan akhiran, makro kedua "meledak" mereka. Mungkin bisa dikalahkan. Ruang menjengkelkan.

udioica
sumber
1

C, 186 Bytes

#include <string.h>
#define S strlen
p(char* s){char *t=s;char u[999]="";for(int i=0;i<S(s);i++){for(int j=i+1;j>0;j--){sprintf(u+S(u),"%c",*t);}t++;}printf("%s\n",u);if(S(s)>1)p(s+1);}

Ini mungkin dapat dipersingkat sedikit, tetapi saya hanya ingin mencobanya. Ini percobaan kedua saya di golf, jadi beri saya petunjuk (* lol) yang Anda bisa. Dibutuhkan string sebagai parameter dan melakukan peledakan dari sana. u digunakan sebagai penyangga yang menyimpan string yang meledak.

Tidak Terkumpul:

#include <string.h>
#define S strlen 
p(char* s){
    char *t=s;
    char u[999]="";
    for(int i=0;i<S(s);i++){
        for(int j=i+1;j>0;j--){
            sprintf(u+S(u),"%c",*t);
        }
        t++;
    }
    printf("%s\n",u);
    if(S(s)>1)p(s+1);
}
bioweasel
sumber
1

Acc !!, 150 byte

Diharapkan input pada stdin, diakhiri dengan karakter tab.

N
Count c while _/128^c-9 {
_+N*128^(c+1)
}
Count i while _-9 {
Count j while _/128^j-9 {
Count k while j+1-k {
Write _/128^j%128
}
}
Write 10
_/128
}

Penjelasan

Ini sebenarnya tugas yang cukup bagus untuk Acc !! , karena hanya perlu membaca string dan mengulanginya dengan beberapa loop bersarang. Kami membaca string ke akumulator, memperlakukannya sebagai urutan basis-128 digit, dengan karakter pertama di ujung orde rendah. Setelah Count cloop pembukaan , nilai akumulator dapat dikonseptualisasikan seperti ini (menggunakan xyzinput sebagai contoh):

128^   3  2  1  0
     tab  z  y  x

(Nilai akumulator aktual untuk contoh ini adalah 9*128^3 + 122*128^2 + 121*128 + 120= 20888824.)

Kita kemudian dapat mengulangi string dengan mengulangi peningkatan kekuatan 128. Dan kita bisa mengulangi sufiks dengan membagi akumulator dengan 128 setelah setiap iterasi, memotong karakter.

Dengan lekukan dan komentar:

# Initialize the accumulator with the first input character
N
# Loop until most recent input was a tab (ASCII 9)
Count c while _/128^c - 9 {
    # Input another character and add it at the left end (next higher power of 128)
    _ + N * 128^(c+1)
}

# Loop over each suffix, until only the tab is left
Count i while _ - 9 {
    # Loop over powers of 128 until the tab
    Count j while _/128^j - 9 {
        # Loop (j+1) times
        Count k while j + 1 - k {
            # Output the j'th character
            Write _ / 128^j % 128
        }
    }
    # Output a newline
    Write 10
    # Remove a character
    _/128
}
DLosc
sumber