壊れたひものピラミッド


10

文字列nを指定して、現在の行を基準にして断片に分割された文字列のピラミッドを作成します。

最初の行には、変更されていない文字列が含まれています。

2行目には、パイプで半分に分割された文字列が含まれています。

3行目では、3番目の行で区切られています...

等々。各部分文字列の長さ。ここで、lは文字列nの長さと等しく、

床(l / n)

残った文字は独自のサブストリングに入れられます。使用される最後の行は、部分文字列の長さが2である最初の行です。

テストケース:

入力:こんにちは、世界。

出力:

Hello, world.

Hello,| world|.

Hell|o, w|orld|.

Hel|lo,| wo|rld|.

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

入力:abcdefghij

出力:

abcdefghij

abcde|fghij

abc|def|ghi|j

ab|cd|ef|gh|ij

入力:01234567890abcdef

出力:

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

追加のルール:

  • 完全なプログラムまたは関数のどちらか少ない方のコードを使用して記述できます。

  • 入力は常に少なくとも4文字の長さになります。

  • 言語でサポートされている場合は、改行を使用する必要があります。不可能な場合は、改行を:

  • 入力は常に印刷可能なASCIIになります。

  • プログラムがP対NPを解決する場合は100%マイナス。


リーダーボード:


0バイト:return: false
ガブリエルベナミー

3
素敵な最初の挑戦!いくつかの明確化のための質問-入力は印刷可能なASCIIのみですか(私は「はい」を強くお勧めします)?「可能な場合は改行が必要」とはどういう意味ですか?
AdmBorkBork 2016

3
それは冗談だ。P対NPは、計算における未解決の問題です。冗談は、あなたがそれを解決できれば、あなたのプログラムが挑戦を解決しないという事実について気にするのをやめるということです。
ジュリアンラクニエ16

3
コンピューティングにおける実際の未解決の問題は「タブまたはスペース」...
FlipTack

3
いいえ、本当の問題はInternet Explorerです。
Julian Lachniet、2016

回答:


0

JavaScript(ES6)、103 101 91 84バイト

チャレンジ要件を尊重するように修正

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

f入力文字列を最初のパラメーターとして取りs、分割文字列をコンソールに再帰的に出力するラムダ。かなり簡単です:サブストリングの長さpが1を超えている限り、文字列を'|'で分割して出力します すべてのp文字、次のレベルの追加に進みます。これは次に、フロアリングpされた状態で関数を再度呼び出しますt / n。ここtで、は元の文字列の長さでありn、インクリメントされたディバイダーです。


n毎回2で割るのは正しいとは思いません。
Neil

@ニールあなたは正しい、私の側の間違い。私は問題を修正し、プロセスで2バイトを節約しました。
XavCo7 2016

@ETHproductions私はそれについて考えましたが、それがSTDOUTとしてカウントされるかどうかはわかりません... alert(f(s))直後に行う必要があると思いますか?
XavCo7 2016

4

Perl、46 + 1 = 47バイト

-n旗を持って走る

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

オンラインでお試しください!

コードの内訳

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

これは、より長い入力に対しては機能しないようです。
Neil

2

Pyth、16バイト

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

ここで試してください


1
これはテストケースではうまくいくかもしれませんが、より長い入力ではうまくいかないと思います。
Neil

2

C、145の 131 128 125バイト

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

これは、文字列を引数として取り、出力を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);}

これはどのように機能しi*i>lますか?セクションを繰り返し始めるように見えます。
Neil

@ニール私はあなたが何を意味するのかわからない。例を挙げていただけますか?
ドアノブ

@ニールああ、気にしないで、あなたの言っていることがわかります。これは仕様の穴のようであり、各部分文字列の長さがであることを明示的に述べていfloor(l/n)ます。入力が長い場合の意図された動作が何であるか、またはOPがそれを予期していたかどうかはわかりません。
ドアノブ

1

Pyth、17バイト

jmj\|cQ/lQdSh/lQ3

説明

     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バイト

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

機能x(a)。を使用して呼び出す

console.log(x("ABCDEF"))



0

Python 3、123バイト

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

長い文字列では、部分文字列の長さの式がであるため、一部が繰り返されfloor(l/n)ます。たとえば、13文字の長さの文字列の場合、5に分割された文字列は、6に分割された文字列と同じになりますfloor(13/5)==floor(13/6)。OPがこれを期待していたのか、それとも見落としであったのかはわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.