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



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.

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                                            |
+---------------------------------------------+

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

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.


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
  }

}

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

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

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

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

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'

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



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

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

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

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.


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

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.


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


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

Ruby, 51 byte

Menggunakan -nbendera untuk +1 byte.

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

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)

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.


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

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
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.