交互パターン


16

削除されたstackoverflowの質問で、誰かが以下を投稿しました:

交番パターンを印刷するプログラムまたは機能を記述*し、#指定された整数に基づきますn。いくつかの例:

入力:n=1
出力:

*

入力n=5
出力:

*####
###**
***##
###**
*####

入力:n=8
出力:

*#######
######**
***#####
####****
****####
#####***
**######
#######*

かなりクールなコードゴルフの挑戦のように見えたので、ここにあります。

これらのパターンはどのように構築されますか?

最初の行はシングル*で始まり、後続のn-1量が続き#ます。
2行目は、2つが含まれている*と、n-2大手の量#
3行目は3 *で始まり、その後に続くn-3量が続き#ます。

中間(n/2)に達したら、の量で再度カウントします*。これは上記の例で見ることができます。

入力が奇数の場合、行の逆のペア(最初と最後、2番目と最後から2番目など)はまったく同じであることに注意してください。このn=5例では、最初と最後の行は*####;です。最後の行の2番目と2番目の行は###**です。
ただし、偶数の入力番号の場合、行の逆のペアは逆になります。このn=8例では、最初と最後の行は*#######and #######*です。最後の行の2番目と2番目の行は######**and **######です。等

チャレンジルール:

  • およびの代わりに、任意の2つの印刷可能な文字を使用できます。and を使用できます。および; および; 等。あなたが使用したものをあなたの回答に明記してください。*#AB37<>
  • n正の整数(>= 1)であると仮定できます。
  • STDOUTに出力する代わりに、各行の文字列のリスト/配列または文字の2Dマトリックスを出力できます。

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、非コードゴルフ言語で回答を投稿しないようにしてください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準的な規則が適用されるため、STDIN / STDOUT、適切なパラメーターと戻り値型、完全なプログラムを備えた関数/メソッドを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、回答の説明を追加することを強くお勧めします。

テストケース(最初n=1からn=10

*

*#
#*

*##
#**
*##

*###
##**
**##
###*

*####
###**
***##
###**
*####

*#####
####**
***###
###***
**####
#####*

*######
#####**
***####
###****
***####
#####**
*######

*#######
######**
***#####
####****
****####
#####***
**######
#######*

*########
#######**
***######
#####****
*****####
#####****
***######
#######**
*########

*#########
########**
***#######
######****
*****#####
#####*****
****######
#######***
**########
#########*

*と#の代わりに、任意の2つの異なる文字を使用できます。」-印刷可能にする必要がありますか?NULとSOH(ASCIIコード0と1)を使用できますか?
ngn

@ngn申し訳ありませんが、印刷可能な文字のみです。チャレンジの説明で明確になります。
ケビンCruijssen

回答:


14

ゼリー、9バイト

>þµoṚUÐeY

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

説明

>þ           Create a table of (x>y) over [1…n]×[1…n]:
               [0 1 1 1 1]
               [0 0 1 1 1]
               [0 0 0 1 1]
               [0 0 0 0 1]
               [0 0 0 0 0]
  µ          Take this array, and...
   oṚ        OR it with its reverse:
               [0 1 1 1 1]
               [0 0 1 1 1]
               [0 0 0 1 1]
               [0 0 1 1 1]
               [0 1 1 1 1]
    UÐe      Apply U (reverse) to even-indexed rows.
       Y     Join by newlines.

17

Python 2、62バイト

lambda n:["%*s"%(i%2*2*n-n,"x"*min(i+1,n-i))for i in range(n)]

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

用途xとスペース。

行は次のように計算されます。

"%-5s" % "x"      == "x    "
"%5s"  % "xx"     == "   xx"
"%-5s" % "xxx"    == "xxx  "
"%5s"  % "xx"     == "   xx"
"%-5s" % "x"      == "x    "

%*s指定子を使用してnとの間を選択します-n



6

MATL、34 31 18バイト

:t!>tPY|!"@X@oQ&P!

MATL Onlineでお試しください

*に0、#に1を使用します。リンのゼリーの回答に基づいています


古い回答、31バイト:

2/tk:wXk:Ph"X@ot~XHh@Gy-hHQ&PY"

MATL Onlineでお試しください

*に1、#に0を使用します。

         % implicit input, say 5
2/       % divide input number by 2 [2.5]
tk       % make a copy and floor that [2.5, 2]
:        % create range 1 to the floored value [2.5, [1, 2]]
wXk      % bring out the division result and this time ceil it
         %  [[1, 2], 3]
:        % create range 1 to that [[1, 2], [1, 2, 3]]
Ph       % flip the last array and concatenate horizontally 
         %  [[1, 2, 3, 2, 1]]
"        % loop through the array
  X@o    % Is the current loop index odd? 1 for odd, 0 for even
  t~     % duplicate and logical negate that
  XH     % copy that value to clipboard H
  h      % and concatenate the values ([1 0] on odd iterations, [0 1] on even) 
  @      % push current value from array (say 2, then stack is [[0 1], 2)
  G      % push input again
  y-     % subtract current array value from input [[0 1], 2, 3]
  h      % concatenate those two [[0 1], [2, 3]]
  H      % get the stored value from clipboard H (1 for even iterations, 0 for odd) 
  Q      % increment that
  &P     % flip the array in that dimension: in even iterations, this flips
         %   across columns and hence inverts the two values. [[0 1], [3, 2]]
         %   in odd iterations, it's a no-op
  Y"     % run-length decoding - repeat the element from first array the number of times
         %  specified in the second array
         % implicit loop end, implicit output

6

APL(Dyalog Classic)、18バイト

a[↑⊢∘⌽\(⊂>⊢⌊⌽)⍳⎕]

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

AB代わりに出力*#

評価された入力n

⍳⎕ ベクトル 0 1 ... n-1

⊢⌊⌽自身()とその逆()の間の最小()- 列車を参照

⊂>⊢⌊⌽全体としてのベクトル()はそれぞれの⊢⌊⌽ベクトルより小さい-ブール(0/1)ベクトルのベクトルを返す

⊢∘⌽\ 他のすべてのベクトルを逆にする

マトリックスに混ぜる

⎕a大文字の英語のアルファベット、'AB...Z'

⎕a[ ]置き換える0 1'A' 'B'


好奇心から。0と1のマトリックスをスペースなしで単純に出力するには、何バイトですか?私は仮定している⎕a[...}に変換Aし、Bスペースのないこととして、それらを維持するよりも短くなっている01、あなたのようにそれらを保つ場合はバイト単位であまり差がある場合、あなたはそれを使用しまし考慮スペースを入れず、ちょうど好奇心01
ケビンクルーイッセン

1
@KevinCruijssenとしてゴルフ私ができる限り、それは同じ長さになります-のいずれか⎕d[... ]または⊃¨⍕¨後者の式では... ⍕¨「それぞれをフォーマット」されて-それは、ネストされたchar型にそれぞれ番号を回すベクトル私たちは「最初の各必要があるので、 "(⊃¨)char スカラーのみを取得します(したがって、印刷時に空白は取得しません)。
ngn

5

、21バイト

≔⮌…⁰NθEθ⭆蛧⟦μλ⟧κ⌊⟦κι

オンラインでお試しください!とを使用01ます。Linkは、コードの冗長バージョンにあると含ま§*#への出力を変換している*し、#質問に。説明:

    N                   Input number
  …⁰                    Range from 0
 ⮌                      Reversed
≔    θ                  Assign to `q`
      Eθ                Map over reversed range
        ⭆θ              Map over reversed range and join
           §⟦μλ⟧κ       Alternate between range and reversed range column
                 ⌊⟦κι   Minimum of range and reversed range row
          ›             Greater
                        Implicitly print each row on its own line

5

ゼリー 12  15 バイト

+3 n=1エッジケースのバグを修正:(

R«Ṛ$‘r⁸ṬUÐe0YE?

OPで定義されたとおりに01for *およびfor を使用して出力を出力する整数を受け入れる完全なプログラム#

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

どうやって?

R«Ṛ$‘r⁸ṬUÐe0YE? - Main Link: integer, n
R               - range -> [1,2,3,4,...,n]
   $            - last two links as a monad:
  Ṛ             -   reverse -> [n,...,4,3,2,1]
 «              -   minimum (vectorises) -> [1,2,3,4,...,4,3,2,1]
    ‘           - increment (vectorises) -> [2,3,4,5,...,5,4,3,2]
      ⁸         - chain's left argument, n
     r          - inclusive range (vectorises) -> [[2,3,...,n],[3,4,...n],[4,5,...n],[5,...n],...,[5,...n],[4,5,...n],[3,4,...n],[2,3,...,n]]
       Ṭ        - untruth (vectorises) -> [[0,1,1,...,1],[0,0,1,1,...,1],[0,0,0,1,...,1],[0,0,0,0,1,...,1],...,[0,0,0,0,1,...,1],[0,0,0,1,...,1],[0,0,1,1,...,1],[0,1,1,...,1]]
         Ðe     - apply to entries with even indices:
        U       -   upend              -> [[0,1,1,...,1],[1,1,...,1],[0,0,0,1,...,1],[1,...,1,0,0,0,0],...]
              ? - if...
             E  - ...condition: all equal? (only true when n=1, where we have [1,1])
           0    - ...then: zero
            Y   - ...else: join with newline characters
                - implicit print

これはまさに私のアルゴリズムのように見えますが、1の代わりに0を出力する別の実装であり、その逆も同様です。
エリックアウトゴルファー

はい、事実上同じことです...そして、私は自分の投稿を更新して修正を表示していません。
ジョナサンアラン


4

Java 10、145バイト

n->{var r=new char[n][n];for(int j=0,k;j<n;++j)for(k=0;k<n;)r[j][k]=k++<(j<n/2?j%2<1?j+1:n+~j:j%2>0?j:n-j)?j%2<1?'*':'#':j%2>0?'*':'#';return r;}

すべての三元はそれを少し乱雑にしますが、それはうまく動作します。ネストされたループやその他のさまざまなことを平坦化しようとしましたが、バイトカウントが増加するだけでした。こちらからオンラインでお試しください。

ゴルフをしていない:

n -> { // lambda taking an integer as output and returning a char[][]
    var r = new char[n][n]; // the output array; we make use of Java 10's var here (replace with char[][] for another 4 bytes to make this work in Java 8)
    for(int j = 0, k; j < n; ++j) // iterate over the lines
        for(k = 0; k < n; )       // iterate over the j'th line
            r[j][k] = // set the current character
                      k++ < // determine if we're in the first or second portion of the line:
                            (j < n/2 ? // for the first half of the output:
                                 j%2 < 1  // on even lines ...
                                 ? j + 1  // ... print the first symbol j+1 times ...
                                 : n + ~j // ... on odd lines, print it n-j-1 times.
                             : j%2 > 0 ?  // for the second half of the output, on odd lines ...
                                 j :      // ... print the first symbol j times ...
                                 n - j)   // ... on even lines, print it n-j times.
                      ? j%2 < 1 ? '*' : '#'  // for the first part of the line, use '*' on even lines, '#' otherwise
                      : j%2 > 0 ? '*' : '#'; // for the second part of the line, use '*' on odd lines, '#' otherwise
    return r; // return the completed array
}

ジャワ8 11、179の 127バイト

n->{String r="",a,b;for(int j=0;j<n;b="#".repeat(j<n/2?n+~j:j),r+=(j++%2<1?a+b:b+a)+"\n")a="*".repeat(j<n/2?j+1:n-j);return r;}

ここでオンライン試してみてください(TIOにはまだJava 11がありません。したがって、これは、と同じバイトカウントになるカスタムメソッドを使用しますString#repeat())。

なんと52バイトのゴルフをしてくれたKevin Cruijssenに感謝します!

ゴルフをしていない:

n -> { // lambda taking an int argument and returning a String
    String r = "", // the output String
           a,      // temporary String containing the '*'s
           b;      // temporary String containing the '#'s
    for(int j = 0; j < n; // loop over the lines
        b = "#".repeat( // repeat the '#' character ...
            j < n/2 ? n + ~j // ... n-j-1 times in the first half of the output ...
            : j), // ... j times in the second half
        r += (j++ % 2 < 1 ? a + b : b + a) + "\n") // assemble the j'th line and append it to the output: on even lines, the '*'s go first; on odd lines, the '#'s go first
        a = "*".repeat( // repeat the '*' character ...
              j < n/2 ? j + 1 // ... j+1 times in the first half of the output ...
              : n - j); // n-j times in the second half
    return r; // return the completed output
}

3
Java 11に変更する場合は"*".repeat(...)、and を使用して127バイトにゴルフできます"#".repeat(...)(直接印刷する代わりに文字列を返してにゴルフn-j-1するn+~j):n->{String r="",a,b;for(int j=0;j<n;b="#".repeat(j<n/2?n+~j:j),r+=(j++%2<1?a+b:b+a)+"\n")a="*".repeat(j<n/2?j+1:n-j);return r;}
Kevin Cruijssen

おかげで、バイト数を大幅に節約できます。ネストされたループを使用して、Java 10の145バイトバージョンを作成することができました。Java11のリリースを待つことはできませんrepeat()。その方法はゴルフに最適です。
OOBalance

4

LUA 148の  133バイト

function(n)t,a,b={},".","#"for i=1,n do r=i<n/2+1 and i or-~n-i s=a:rep(r)..b:rep(n-r)t[i]=i%2<1 and s:reverse()or s end return t end

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

@KevinCruijssenと@JoKingに感謝します。

function(n)
   t = {}; a = "."; b = "#"          -- initialize variables, output is in table
                                     -- strings are needed in variables for
                                     --   the str:rep and str:reverse syntax

   for i = 1, n do                          -- build the rows of the table
      r = i<=(n+1)/2 and i or n-i+1         -- logic used to count up then down
      str = a:rep(r)..b:rep(n-r)            -- append correct number of '.'s, fill
                                            --   in the rest with '#'s
      t[i]=i%2==0 and str:reverse() or str  -- logic used to control reversing
   end
   return t                                 -- return table
end

2
私はLuaをあまりよく知りませんが、5バイト節約できるようです:(n+1)/2to -~n/2; or n-i+1or-~n-i; i%2==0i%2<1; およびreverse() orreverse()or。また、TIOバージョンとバイトカウントの両方に、必要ではないと思われる末尾のセミコロンが含まれています。いい最初の答えですが。私から+1。PPCGへようこそ!:)
ケビンクルーイッセン

2
あなたが実際に必要としない任意のセミコロンのを。ケビンの提案を含む133バイト
ジョーキング

@KevinCruijssenありがとう!-~nあなたの提案で何をしているのか尋ねてもいいですか?間違いなく機能しますが、その理由はわかりません。
Azureハイツ

1
@AzureHeights確かに。~単項のビットごとの否定演算子です。ただし、codegolfingにとって重要なのは、それ~iがと同じ値を保持していることです-i-1。したがって、の-~i代わりにi+1およびの~-i代わりに使用できますi-1。これは2つの場合に役立ちます。あなたの答えの両方で利用できます:括弧を取り除くこと-、および~演算子は他の数学演算よりも優先されるため、そう(n+1)/2することができます-~n/2。他の便利な部分は、で行ったように、場合によってはスペースを取り除くことですor-~n-i
ケビンCruijssen

1
:あなたはそれについてより多くのビットを読みたい場合はここでは、2つの関連するヒントがあります使用は単項~のためx+1x-1し、単項の使用~のためにa-b-1a+b+1。すべての一般的なヒント、および言語固有のヒント(この場合はLuaでのゴルフのヒント)は、読み通すのが面白いかもしれません。:)
ケビンクルーイッセン




3

C(gcc)118108バイト

これは勝つつもりはありませんが、異なるアプローチです(または、少なくとも、そう思います!)。文字列操作を行う代わりに、 10バツ1 以上 [1 ..n]={999999}、適切なパターンを取得するために乗算できます。printf()次に、右揃えのためにゼロパディングを行います。

悲しいことに、int最大32桁のプラットフォームで最大9桁を実行するのに十分な範囲しかありません。そのため、longため、より大きなパターンます。MP算術をネイティブに行う言語は、これを何かに使用できる可能性があります。

提案してくれたceilingcatに感謝します。

h,j,k;p(h){h=h?10*p(--h):1;}f(i){for(j=0,h=i++;k=++j>i/2?i-j:j,j<i;printf("%0*d\n",h,~-p(k)*p(j%2*(h-k))));}

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


これがMP算術で機能するという概念の証明:

C#(Mono C#コンパイラ)187 165バイト

(143バイト+ using System.Numerics;ヘッダー内の22バイト)

q=>{var r="";for(int j=0,h=q+1,k;j<q;r+=((BigInteger.Pow(10,k)-1)*BigInteger.Pow(10,j%2*(q-k))).ToString("D"+q)+"\n")k=++j>h/2?h-j:j;return r;}

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


1
最大のネイティブ整数範囲外の数値による概念実証(C#およびBigIntegerを使用):オンラインで試してみてください!
ErikF

3

Vim、99キーストローク

入力引数を使用してvimを実行するのは常に興味深いことです。非常に不自然なので、驚くほど短くなることはありません。これにはおそらく他の良いアプローチがあります。

入力はそれ自体がバッファ内にあると想定されます。レジスタは空であると想定されます。エディターは、スクロールせずに結果を格納するのに十分な高さであると想定されます(これは、キーストロークを犠牲にして技術的に回避できます)。

"nD@ni<cr><esc>MmaGddM
<c-v>'aI*<esc>qwgvjokoI*<esc>@wq@w<esc>
:set ve=all<cr>@nlh<c-v>@nkr#
:%s/ /#/g<cr>o<esc>
2Gqqdt#$p2j0@qq@q

説明

 | Buffer state (odd and even case):
 | 5                    6

"nD              read input into register n
@ni<cr><esc>     add n newlines
MmaGddM<c-v>'a   visual block select center row(s)
I*<esc>          prepend a column of *
qw               record macro w
  gvjoko         expand selection up and down
  I*<esc>
  @w             recurse
q
@w<esc>          run macro w and exit visual block select

 | Buffer state:
 | *                    *
 | **                   **
 | ***                  ***
 | **                   ***
 | *                    **
 |                      *

:set ve=all<cr>  move anywhere!
@nlh<c-v>@nkr#   add last column of #s

 | Buffer state:
 | *   #                *    #
 | **  #                **   #
 | *** #                ***  #
 | **  #                ***  #
 | *   #                **   #
 |                      *    #

:%s/ /#/g<cr>      replace spaces with #

 | Buffer state:
 | *####                *#####
 | **###                **####
 | ***##                ***###
 | **###                ***###
 | *####                **####
 |                      *#####

o<esc>2G           prep and jump to line 2
qqdt#$p2j0@qq@q    (effectively) flip every other onward

 | Buffer state:
 | *####                *#####
 | ###**                ####**
 | ***##                ***###
 | ###**                ###***
 | *####                **####
 |                      #####*

また、base64では、実際の文字(入力を入力しinput、キーストロークを入力しkeysてを使用して実行vim -u NONE -s keys input

Im5EQG5pDRtNbWFHZGRNFidhSSobcXdndmpva29JKhtAd3FAdxs6c2V0IHZlPWFsbA1AbmxoFkBua3IjOiVzLyAvIy9nDW8bMkdxcWR0IyRwMmowQHFxQHE=


2

K(ngn / k)、22バイト

{"*#"i|:/'i>/:i&|i:!x}

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

{ } 引数付きの関数 x

!xリスト(0;1;...;x-1)

i: に割り当てます i

i&|iの最小(&iおよびその逆(|

i>/:より大きい(>)と比較iリストとて、右側のリストの各要素(/:)-ブール行列(リストのリスト)を返します

i|:/'各(のため')でjをi、逆(|:-私たちは、必要な:強制的に|対応する要素j回(単項する)n f/ x適用f n上の回x)。事実上、1行おきに反転します。

"*#" 文字列のインデックスとして行列要素を使用します "*#"

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