Patlamış Sonekler


20

Bir ASCII dizesi verildiğinde, bunun patlatılmış son eklerini çıktılayın. Örneğin, dize, abcdeen uzun ila en kısa sıralanan 5 sonek vardır:

abcde
bcde
cde
de
e

Daha sonra her son ek patlatılır , yani her karakter bu sonekteki tek dizinli konumu kadar defa kopyalanır. Örneğin, son eklerini patlatarak abcde,

abcde
12345
abbcccddddeeeee

bcde
1234
bccdddeeee

cde
123
cddeee

de
12
dee

e
1
e

Toplamda, patlatılmış ekleri abcdevardır

abbcccddddeeeee
bccdddeeee
cddeee
dee
e

kurallar

  • Bu yani kısa kod kazanır.
  • Giriş, yazdırılabilir ASCII karakterlerinden oluşacaktır. (Bu yeni satırları hariç tutar, ancak boşlukları içerir.)
  • Çıktının her dizesi ayrı bir satırda olacaktır.
  • Her satırda sondaki boşluklara izin verilir ve sonunda fazladan bir yeni satır olabilir.

Test Durumları

''

'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



'Ccodegolf' da ne olur?
RosLuP

Yanıtlar:


14

Jöle , 5 bayt

ṫJxJY

Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın .

Nasıl çalışır

ṫ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 bayt

14 bayt tasarruf için mil teşekkürler!

(#~#\)\.

Şimdi bu gerçekten güzel bir çözüm. Oldukça özlü.

Bu, girişin #~#\soneklerine ( \.) uygulanan kancadır . Kanca, girişte çağrıldığında y, şu şekilde ayrıştırılır:

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

İşte bazı ara sonuçlar:

   ]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

Test senaryoları

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

Harika, bazı baytları kaydetmenin başka bir yolu da zarf ön ekini kullanmaktır
mil

@miles ne demek istiyorsun?
Conor O'Brien

O aralık üreten daha kısa yol olarak her önek uzunluğunu alabilirsiniz
mil

Miles Ah, elbette.
Conor O'Brien

7

Python, 61 bayt

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 bayt

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

İstenen çıktıyı yazdırdıktan sonra bir hata ile sonlanır. Ideone üzerinde test edin .

Nasıl çalışır

F kendisini özyinelemeli olarak çağırmadan önce , indeksleri s[1:...]hesaplanmalıdır.

İlk enumerate(s[0]+s)getirileri çiftleri (i, c) karakterler c ait s - ilk karakter ile çoğaltılmış - ve karşılık gelen endeksleri i . Hazırlık s[0]burada iki amaca hizmet eder.

  • İlk karakteri s kez tekrarlanmalıdır, ancak ilk endeksidir 0 .

  • Tüm karakterler işlendikten sonra, IndexErrors[0] değerini yükseltir ve yineleme sınırına ulaşılana kadar satırsonu yazdırmak yerine f'nin bir hatayla sonlanmasına neden olur .

''.join(i*c for i,c in ...)STDOUT'a yankılanan i kere tekrarlanan her c'den düz bir dize oluşturur .print

Son olarak, Noneprint döndürdüğü ve basit olduğu için, özyinelemeli çağrı ilk işlemi olmayan s için yukarıdaki işlemi tekrarlar .s[1:None]s[1:]f(s[1:...])


6

Perl 6 , 38 bayt

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

-nKomut satırı anahtarı için 37 bayt + 1

Örnek:

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

Expanded:

# -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 bayt

@]Elyk:Erz:jac@w\

Çevrimiçi deneyin!

açıklama

@]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 bayt

.sRvyvyN>×}J,

Çevrimiçi deneyin!

açıklama

.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 bayt

Sl+{_eee~n1>}h

Çevrimiçi deneyin!

açıklama

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 bayt

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

Önde gelen bir satırsonu yazdıran özyinelemeli anonim işlev. Baştaki yeni satıra izin verilmezse, 3 ekstra bayt bunu sondaki yeni satıra dönüştürür:

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

Golfsiz yöntem ve test senaryoları ile tam program:

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 bayt

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

herhangi biri tarafından arabirim

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'

Anlamsızlığı severim. 63 baytlık kodunuzu kendi bloğuna koymanız ve ardından çağrıyı ayrı ayrı göstermeniz gerekir.
xnor

İhtiyacınız yok putStr., fonksiyon çıkışı olarak kabul ediyoruz. Kullanmak için import Data.Listolsa gerek tails.
xnor

Sen değiştirebilirsiniz uncurry ... zipile zipWith: unlines.map(concat.zipWith replicate[1..]).tails.
nimi

Evet kesinlikle! zipWith replicateİ zaman uyandı kısaltması da bana oluştu. Yazık tailsdeğil Preludei alamadan tailsgelen Data.Listtam olmadan örtük import outgrowing olmadan hala ve foldreşdeğer. IOKazan plakası olmadan saflık ile ilgili olarak da mapM_ putStrLnbaharatları okuyucuların zevkine bırakıp unlinesikisini de yapmam. Bir blok tanımlamak e=bayt sayısına mal olur.
Roman Czyborra

Niteliksiz adları kullanmak importsstandart Haskell değil, ghcirepl'in bir özelliği . Bu tür şeylere bağlı olarak ayrı bir dil sayılır, bu yüzden cevabınızın başlığını benzer bir şeye değiştirmenizi öneririm Haskell (ghci). ( Ayrıca bu meta tartışmaya bakın ).
nimi

3

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

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

Çalıştırılması gerekenler -nve -E(veya -M5.010):

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

Her çalıştırdığınızda yalnızca bir örnek üzerinde çalıştığına dikkat edin (çünkü $.bir satırın her okunuşunda artırılan değişkeni kullanır , bu nedenle 1yalnızca ilk satır okunduğunda tutar). (Ama burada sorun yok, sadece ^Dve tekrar çalıştır!)



3

Java, 150 127 bayt

Düzenle:

  • -23 bayt kapalı. @Kevin Cruijssen sayesinde

Snippet:

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

Ungolfed:

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

Merhaba, boşlukları ve bazı küçük hileleri kaldırarak oldukça golf edebilirsiniz: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

Raket 184 bayt

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

Ungolfed:

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

Çıktı:

abbcccddddeeeee
bccdddeeee
cddeee
dee
e

xyyzzz
yzz
z

2

JavaScript (ES6), 65 bayt

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>

Önceki denemeler:

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 bayt (kısa etiketlerle 99)

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

Bunun mümkün olan en kısa cevap olmadığından eminim.


2

MATL , 12 bayt

&+gYRYs"G@Y"

Alıntı işaretleri bir araya geldiğinde seviyorum!

Çevrimiçi deneyin!

açıklama

Bu, sütunları birer birer kullanılan girişin kodunu çözmek için kullanılan bir matris oluşturarak çalışır. Örnek olarak, girdi 'abcde'için matris

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

Kod:

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

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

Bu, beklediğimden şaşırtıcı derecede zordu. Tüm fonksiyonumu belki 4 kez tekrar ettim.


1

Java 7.140 bayt

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

Ungolfed

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

Bana çok acı veren çizgiyi takip ediyorum. Nasıl golf oynayabileceğimi bilmiyorum (çünkü "\n"baskı ifadesini koymak için koşulu kırmak için iki döngü var ).
System.out.println();


Dizi uzunluğunu bağımsız değişken olarak göndermeyi gerektirmeyen uygun bir yönteme ne dersiniz? Şu anda biri yanlışlıkla yanlış bir değer göndererek bir IndexOutOfBounds istisnasını tetikleyebilir ...
adrianmp


1

Ruby, 51 bayt

-n+1 baytlık bayrağını kullanır .

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

1

R, 108 bayt

Stdin'den girişleri ve stdout'a baskıları okuyun

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

do.callBurada kullanımının uygun olduğunu hissettim . Temelde iki giriş alır: 1. bir dize şeklinde bir işlev adı (rep burada) ve bağımsız değişkenler listesi ve 2. yinelemeli olarak uygular, listedeki bağımsız değişkenleri kullanarak işlevi çağırır.

Örneğin:

  • rep("c",3) vektörü üretir "c" "c" "c"
  • do.call("rep",list(c("a","b","c"),1:3)) vektörü üretir "a" "b" "b" "c" "c" "c"
  • bu art arda çağrı eşdeğerdir rep("a",1), rep("b",2)verep("c",3)

1

Vim, 43 bayt

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

İlk makro sonekleri ayırır, ikinci makro onları "patlatır". Muhtemelen katlanılabilir. Alanlar can sıkıcı.


1

C, 186 Bayt

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

Bu muhtemelen biraz kısaltılabilir, ama sadece denemek istedim. Golf benim ikinci denemek, bu yüzden bana herhangi bir işaretçiler (* lol) verebilir. Bir dizgiyi parametre olarak alır ve patlamayı oradan yapar. u, patlatılmış dizeyi saklayan bir tampon olarak kullanılır.

Ungolfed:

#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 bayt

Sekme karakteriyle sonlandırılmış stdin girdisini bekler.

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
}

açıklama

Bu aslında Acc için oldukça iyi bir görev !! , yalnızca bir dize okumayı ve bazı iç içe döngülerle yinelemeyi gerektirdiğinden. Dizeyi akümülatöre okuruz, bunu düşük sıralı uçta ilk karakter olacak şekilde baz-128 basamaklı bir dizi olarak ele alırız. Açılış Count cdöngüsünden sonra, akümülatör değeri şu şekilde kavramsallaştırılabilir ( xyzörnek giriş olarak kullanılarak ):

128^   3  2  1  0
     tab  z  y  x

(Bu örnek için gerçek akümülatör değeri 9*128^3 + 122*128^2 + 121*128 + 120='dir 20888824.)

Daha sonra 128'lik artan güçler üzerinde yineleyerek ip üzerinde yineleme yapabiliriz. Ve her bir yinelemeden sonra akümülatörü 128'e bölerek bir karakteri keserek sonekleri yineleyebiliriz.

Girinti ve yorumlarla:

# 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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.