Kırık dizelerin Piramidi


10

Bir n dizesi verildiğinde, geçerli satıra göre parçalara bölünmüş bir dize piramidi oluşturun.

İlk satır değiştirilmemiş dizeyi içerir.

İkinci satır, bir boru ile yarıya ayrılmış dize içerir.

Üçüncü sıra üçte bir ayırır ...

Ve bunun gibi. Her alt dizenin uzunluğu, burada l, n dizesinin uzunluğuna eşittir

Zemin (l / n)

Geri kalan karakterler kendi alt dizelerine konur. Kullanılan son satır, alt dizelerin 2 uzunluğunda olduğu ilk satırdır.

Test Durumları:

Girdi: Merhaba dünya.

Çıktı:

Hello, world.

Hello,| world|.

Hell|o, w|orld|.

Hel|lo,| wo|rld|.

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

Giriş: abcdefghij

Çıktı:

abcdefghij

abcde|fghij

abc|def|ghi|j

ab|cd|ef|gh|ij

Giriş: 01234567890abcdef

Çıktı:

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

Ek kurallar:

  • Hangisi daha az kod kullanıyorsa, tam bir program veya işlev yazabilirsiniz.

  • Giriş her zaman en az 4 karakter uzunluğunda olacaktır.

  • Diliniz destekliyorsa satır sonlarını KULLANMALISINIZ. Mümkünse, satır sonlarını:

  • Giriş her zaman yazdırılabilir ASCII olacaktır.

  • Programınız P ve NP'yi çözüyorsa eksi% 100.


Liderler Sıralaması:


0 bayt:return: false
Gabriel Benamy

3
Güzel ilk meydan okuma! Birkaç açıklama sorusu - Giriş yalnızca yazdırılabilir ASCII mi (kesinlikle "evet" i öneririm)? "Mümkün olduğunda satır sonları gerekli" ne anlama geliyor?
AdmBorkBork

3
Bu bir şaka. P vs NP hesaplamada çözülmemiş bir sorundur. Şaka şudur ki, eğer çözebilirseniz, programınızın meydan okumayı çözmediği gerçeğini umursamayacağım.
Julian Lachniet

3
Bilgi işlemdeki asıl çözülmemiş sorun "sekmeler veya boşluklar" ...
FlipTack

3
Hayır, asıl sorun Internet Explorer.
Julian Lachniet

Yanıtlar:


0

JavaScript (ES6), 103 101 91 84 bayt

Zorluk gereksinimlerine uyma sorunu giderildi

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

fGirdi dizesini ilk parametre olarak alan sve yinelenen şekilde bölünmüş dizeyi konsollamak için yazdırılan Lambda . Oldukça basit: Alt dize uzunluğu, p1'in üzerinde olduğu sürece , dizeyi '|' ile bölünerek yazdırın Her pkarakter, sonra aşağıdaki seviyesini ekleme devam edin. Bu, daha sonra işlevi , orijinal dize uzunluğu ve artırılmış bir bölücü polan t / ndöşemeyle tekrar çağırır .tn


nHer seferinde 2'ye bölmenin doğru olduğunu düşünmüyorum .
Neil

@Neil haklısın, benim açımdan hata. Sorunu çözdüm ve işlemde 2 bayt kaydettim.
XavCo7

@ETHproductions Bunu düşündüm, ama bunun STDOUT olarak sayılıp sayılmayacağını bilmiyorum ... Sanırım alert(f(s))hemen sonra yapmam gerekecekti ?
XavCo7

4

Perl, 46 + 1 = 47 bayt

-nBayrakla koş

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

Çevrimiçi deneyin!

Kod dökümü

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

Bu, daha uzun girdiler için işe yaramıyor gibi görünüyor.
Neil

2

Pyth, 16 bayt

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

burada dene


1
Bu test senaryoları için işe yarayabilir, ancak daha uzun girdiler için işe yaradığını sanmıyorum.
Neil

2

C 145 131 128 125 bayt

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

Bu, bir dizeyi bağımsız değişkeni olarak alan ve çıktıyı STDOUT'a yazdıran bir işlevdir.

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

Bu bir kez nasıl çalışır i*i>l? Bölümleri tekrarlamaya başlayacak gibi görünüyor.
Neil

@Neil Ne demek istediğinden emin değilim. Bir örnek verebilir misiniz?
Kapı tokmağı

@Neil Ah, boş ver, ne dediğini anlıyorum. Bu, spesifikasyonda, her bir alt dizenin uzunluğunun açıkça olduğunu belirten bir delik gibi görünmektedir floor(l/n); Daha uzun girişler için amaçlanan OP'nin ne olduğunu veya OP'nin bunu beklediğinden emin değilim.
Kapı tokmağı

1

Pyth, 17 bayt

jmj\|cQ/lQdSh/lQ3

açıklama

     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

1

Javascript, 98 Bayt

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

İşlev x(a). Şunu kullanarak ara:

console.log(x("ABCDEF"))



0

Python 3, 123 bayt

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

Daha uzun tellerde, alt telin uzunluğu için formül olduğu gibi bazı parçalar tekrarlanacaktır floor(l/n). Örneğin, 13 karakter uzunluğunda bir dize ile, 5'lere bölünmüş dize, 6'lara bölünmüş dize ile aynı olacaktır floor(13/5)==floor(13/6). OP'nin bunu beklediğinden veya bir gözetim olup olmadığından emin değilim.

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.