セミジグザグを構築する


29

N入力として正の整数が与えられます。あなたの仕事はN、それぞれの長さの側面のセミジグザグを構築することNです。タスクを明確に説明することは比較的難しいため、例をいくつか示します。

  • N = 1

    O
    
  • N = 2

    O
     OO
    
  • N = 3

    OO
     OO
      OOO
    
  • N = 4

    OOOO
     OO
      OO
       OOOO
    
  • N = 5

    OOOOOO
     OOO
      OOO
       OOO
        OOOOOO
    
  • N = 6

    OOOOOOOO
     OOO
      OOO
       OOO
        OOO
         おおおおおおおおおおおおお
    
  • N = 7

    おおおおおおおおおお
     OOOO
      OOOO
       OOOO
        OOOO
         OOOO
          OOOOOOOOOOOOOO
    
  • より大きなテストケース N = 9

ご覧のとおり、セミジグザグは対角線と水平線が交互に並んでおり、常に左上から右下の対角線で始まります。水平線上の文字はスペースで区切られていることに注意してください。

ルール

  • 空白文字以外の任意の文字を選択することもできますがO、一貫性がない場合もあります。

  • 結果を文字列または文字列のリストとして出力/返すことができ、それぞれが1 行を表します。

  • 末尾または先頭の改行がある場合があります。

  • デフォルトの抜け穴が適用されます。

  • 任意の標準的な手段で入力を取得し、出力を提供できます。

  • 可能であれば、提出物にテストリンクを追加してください。私はゴルフの努力を示し、説明があるどんな答えでも支持します。

  • これはなので、すべての言語でバイト単位の最短コードが勝ちます!



Oの間に水平なスペースを入れる必要がありますか?
HatsuPointerKun

1
@HatsuPointerKun 水平線上の文字はスペースで区切られていることに注意してください。–はい、スペースを入れる必要があります。
ミスターXcoder

1
ああ、はい。読むことを学ぶべきです。ありがとう
-HatsuPointerKun

1
@JohnHamilton答えは、入力として与えられた任意の数に対して理論的に機能するはずです。画面が何を保持できるかを心配してはいけません。
ミスターXcoder

回答:


10

、24バイト

FN«↶§7117ι×⁺#× ﹪ι²⁻Iθ¹»#

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

-5 ニールに感謝します。

AST:

Program
├F: For
│├N: Input number
│└Program
│ ├↶: Pivot Left
│ │└§: At index
│ │ ├'7117': String '7117'
│ │ └ι: Identifier ι
│ └Print
│  └×: Product
│   ├⁺: Sum
│   │├'#': String '#'
│   │└×: Product
│   │ ├' ': String ' '
│   │ └﹪: Modulo
│   │  ├ι: Identifier ι
│   │  └2: Number 2
│   └⁻: Difference
│    ├I: Cast
│    │└θ: Identifier θ
│    └1: Number 1
└Print
 └'#': String '#'

炭にとっては簡単すぎた:)
Xcoder氏17

@ Mr.Xcoderこれは実際には本当に手に負えないと感じています...ゴルフの仕方がわかりません。
エリックアウトゴルファー

OPは、キャラクターはどんなものでもよく、一貫している必要はないと言ったので、私はFN§⟦↘→↗→⟧ι⁻Iθ¹→(15バイトのみ)の線に沿って何かを探していましたが、チャコールでは方向のリストが正しく機能しないようです。同情。
チャーリー

@CarlosAlejoも試してみましたが、残念ながら機能しません。
エリックアウトゴルファー

1
@CarlosAlejoはFN✳§⟦↘→↗→⟧ι⁻θ¹O、デニス引っ張る後に動作します方向にキャストされている
ASCIIのみ

7

パイソン2157の 153バイト

n=input()
o,s=q='O '
def p(k,t=q*n+s*(4*n-6)):print(t*n)[k*~-n:][:n*3/2*~-n+1]
p(2)
for i in range(n-2):p(0,i*s+s+o+s*(4*n-7-2*i)+o+s*(2*n+i-2))
n>1>p(5)

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

  • n*3/2*~-n+1 は各行の幅です:⌊3n/2⌋・(n-1)+ 1文字。
  • 文字列q*n+s*(4*n-6)は、上部と下部の行を表します。繰り返してスライス[2*(n-1):]すると、一番上の行が得られます。スライス[5*(n-1):]すると、最下行になります。そのための定義pと呼び出しにp(2)p(5)。しかし、とにかく他のすべての行に対して繰り返しと行長のスライスが必要なのでp、ループで再利用します。
  • i*s+s+o+…真ん中の列のためだけの退屈な表現です。
  • n>1>p(5)が短絡するとn≯1p(5)評価されなくなります。したがって、の省略形ですif n>1:p(5)

うわー、素晴らしいソリューション、とても賢い。あなたは私のupvote獲得した
氏Xcoder

うわー、Pythonがそのような比較でショートサーキットを持っていることを知らなかった、+ 1。
ザカリー

6

Mathematica、126 125 121 112 104 89 86バイト

(m=" "&~Array~{#,#^2-#+1};Do[m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X",{j,#},{i,#}];m)&
  • #は、無名関数の入力番号です(最後に&)。
  • m=" "&~Array~{#,#^2-#+1};与えられた次元の配列を#,#^2-#+1定数の匿名関数 "output a space"の出力で埋めることにより、適切なサイズのスペース文字のマトリックスを作成し" "&ます。
  • Do[foo,{j,#},{i,#}]ネストされたdoループのペアです。j範囲は1to #であり、そのi範囲は1toから#です。
  • m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X"およびにX基づいて、マトリックスの対応する部分を文字に設定します。からバイトを保存するために、負のインデックスを使用しています。(このコードの元のバージョンのように書くのを忘れていました。)Jenny_mathyは、9バイトを節約するために、モジュラー剰余を使用して(を使用するのではなく)リストに直接インデックス付けできることを指摘しました、そしてJungHwan Minは、配列の一部を設定でき、バイトを節約するという奇妙な動作と一般性を使用するため、使用する必要がありますji-i#-i+1Mod[j,4]j~Mod~4SwitchReplacePart1[i,#,-i][[j~Mod~4]][[foo]]{1,i,#,-i}[[j~Mod~4+1]]
  • JungHwan Minが指摘したようにmetaは文字のリストが文字列であることを確立したので、文字のマトリックスの行に関数をマッピングする必要はありません。

次のようなコードを貼り付け、Shift + EnterまたはテンキーEnterを押すことで、Wolfram Cloudサンドボックスでこれをテストできます。

(m=" "&~Array~{#,#^2-#+1};Do[m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X",{j,#},{i,#}];m)&@9//MatrixForm

1
非常に素晴らしい!StringJoinを "" <>#&に置き換えて、4バイトを節約できます
-J42161217

@Jenny_mathyヒントをありがとう!それは非常に便利なようです。
マーク

2
Switch [...]を{1、i、#、-i} [[j〜Mod〜4 + 1]]に置き換えて9バイト節約することもできます!
J42161217

1
ReplacePartここでは実際には必要ありません。m=ReplacePart[...]することができm[[{1,i,#,-i}[[j~Mod~4+1]],j#-#+i+1-j]]="X"-あなたのことができ、リストのを。それは15バイトを取り除きます。SetPart
ジョンファンミン

1
{1,i,#,-i}[[j~Mod~4+1]]することもできます1[i,#,-i][[j~Mod~4]]。式[[0]]Headofを返すため、このトリックは機能します。
ジョンファンミン

4

C ++、321 234バイト

ザカリーのおかげで-87バイト

#include<vector>
#include<string>
auto z(int n){std::vector<std::string>l;l.resize(n,std::string(n*n+n/2*(n-1),32));l[0][0]=79;int i=0,j,o=0;for(;i<n;++i)for(j=1;j<n;++j)l[i%4?i%4-1?i%4-2?0:n-j-1:n-1:j][i*n+j-i+(o+=i%2)]=79;return l;}

文字列のベクトルを返します


:私は、318羽のバイトに、それを降りrepl.it/JpJ2
ザカリー

修正、239バイトに削減
ザカリー

スパム、申し訳ありませんが、234バイト:repl.it/JpJ2/3
ザカリー

1
どういたしまして!
ザカリー

@ザカリー、本当にありがとうございます
-HatsuPointerKun

4

Mathematica、179バイト

Rotate[(c=Column)@(t=Table)[{c@(a=Array)[" "~t~#<>(v="o")&,z,0],c@t[t[" ",z-1]<>v,z-1],c@a[t[" ",z-2-#]<>v&,z-1,0],c@t[v,z-Boole[!#~Mod~4<1]-1]}[[i~Mod~4+1]],{i,0,(z=#)-1}],Pi/2]&

@JungHwanMinの編集


こんなに短いとは思っていませんでした。
ミスターXcoder

質問:Mod[z,4]==0に置き換えることができますMod[z,4]<1か?
ミスターXcoder

はい、ゴルフをすることができます
...-J42161217

3
私は実際にMathematicaを知りませんが、あなたは置き換えることができるMod[#,4]#~Mod~4するために-1バイト?
ミスターXcoder

1
おっと...誤って投票されました。答えを編集して、逆さまにすることができますか?
ジョンファンミン

4

05AB1E21 20 19バイト

コード

新しいキャンバスモードを使用します。

Fx<)Nè'ONÉúR3212NèΛ

05AB1Eエンコードを使用します。オンラインでお試しください!

説明:

F                      # For N in range(0, input)
 x<)                   #   Push the array [input, 2 × input - 1]
    Nè                 #   Retrieve the Nth element
      'ONÉúR           #   Push "O" if N is odd, else "O "
            3212Nè     #   Retrieve the Nth element of 3212
                  Λ    #   Write to canvas

入力6の場合、これにより、キャンバスに次の引数が(同じ順序で)与えられます。

[<num>, <fill>, <patt>]
[6,     'O',     3]
[11,    'O ',    2]
[6,     'O',     1]
[11,    'O ',    2]
[6,     'O',     3]
[11,    'O ',    2]

キャンバスの機能を説明するために、上記のリストから最初の引数セットを選択します。

数値6は、キャンバスに書き込まれる文字列の長さを決定します。フィラーは、キャンバスに書き込むために使用されますO。この場合は、です。フィラー文字列を循環的に実行します。文字列の方向は、最後の引数である方向によって決まります。方向は次のとおりです。

7  0  1
 \ | /
6- X -2
 / | \
5  4  3

これは、3が方向を南東に設定することを意味します。これはオンラインで試すことができます


また、キャンバスモードは開発中で非常に不安定であることに注意してください。
アドナン

:O 05AB1Eがチャコールに変化しています(これもチャコールO_oを叩いています)
ASCIIのみ

@ASCIIのみええ、すべてのASCIIベースの言語(チャコール、SOGL、Vなど)の台頭を見て、05AB1Eがバックグラウンドに沈むのを見て、それについて何かしなければなりませんでした:p
Adnan

木炭をコピーしましたか?:P 05ab1eにはキャンバスと方向印刷もあります(ただし、木炭はPythonを使用した長さのこのスタイルの印刷のみをサポートしています)
ASCIIのみ

2

SOGL V0.12、36のバイト

╝.H∫2\?.╝}F2%?№@.┌Ο};1w⁄Hh1ž}.4%1>?№

ここで試してみてください!

基本的な考え方は、入力範囲の番号ごとに、対角線部分または水平の点線部分を追加することを選択することです。その場合、追加を容易にするために配列を反転します。説明:

╝                                     get a diagonal from the bottom-left corner with the length of the input - the starting canvas
 .H∫                        }         for each number in the range [1,inp-1] do, pushing counter
    2\?  }                              if it divides by 2, then
       .╝                                 create another diagonal of the input
          F2%                           push counter % 2
             ?     }                    if that [is not 0]
              №                           reverse the current canvas upside down
               @.┌Ο                       get an alternation of spaces and dashes with the dash amount of the input length
                    ;                   get the canvas on top of the stack
                     1w⁄                get its 1st element length
                        H               decrease it
                         h              swap the bottom 2 items - the canvas is now at the bottom and the current addition ontop
                          1             push 1
                           ž            at 1-indexed coordinates [canvasWidth-1, 1] in the canvas insert the current part made by the Ifs
                             .4%1>?   if input%4 > 1
                                   №    reverse the array vertically

1の入力が許可されていない場合、それο.∫2%?.╝}F2\?№@.┌Ο};1w⁄Hh1ž}.4%1>?№も機能します。ランダムな数の乱数が許可されている場合.∫2%?.╝}F2\?№@.┌Ο};1w⁄Hh1ž}.4%1>?№も機能します。私は怠け者と実装されていませんでした場合は}F2%?置き換えることができため-4バイト


2

Mathematica、106 87バイト

SparseArray[j=i=1;k=#-1;Array[{j+=Im@i;k∣#&&(i*=I);j,#+1}->"o"&,l=k#+1,0],{#,l}," "]&

SparseArrayオブジェクトを返しますString。出力を視覚化するために、を追加できますGrid@。caseに対してエラーをスローしますが1、無視しても安全です。

説明

j=i=1

iおよびjを1に設定します。

k=#-1

k入力に設定-1。

l=k#+1

設定するlにはk*input + 1

Array[ ..., l= ...,0]

反復l回数は、から始まる0ずつ増加、1毎回...


j+=Im@i

虚数成分の追加iにしj...

k∣#&&(i*=I)

現在の反復がで割り切れる場合、虚数単位kで乗算iします...

{... j,#+1}->"o"

作成Ruleされた位置にある要素を変更するオブジェクト{j, current iteration + 1}への"o"


SparseArray[ ...,{#,l}," "]

作成しSparseArray、生成使用してオブジェクトRuleの寸法で、オブジェクトを{input, l}使用して、" "ブランクとして。

Wolfram Sandboxで試してみてください!


1
ケースn = 3に何か問題がある
-J42161217

1
n = 2、4、5、6にも正確性の問題がありますが、これは7以上で機能すると思います。私は興味があります:SparseArray配列としてカウントするかどうかについての先例はありますか?Gridまたはを使用して視覚化できますMatrixFormが、ここでは通常、「文字列のリスト」としてカウントしません。文字の2D配列で十分な場合、たとえば、ソリューションの8バイト(Jenny_mathyのヘルプの前の12バイト)が削減されます。
マーク

1
@MarkS。また、メタコンセンサスごとに文字列の配列は問題ありません。不明な点がある場合は、OPに問い合わせてください(私たちではなく、ルールを作成します)。このサイトで「SparseArray」を簡単に検索すると、大量のSparseArray応答が得られるので、問題ないと思います。
ジョンファンミン

1
@MarkS。また、このページにはMathematicaのゴルフに関する多くのトリックがあります。
ジョンファンミン

1
@JungHwanMinあなたが尋ねたように答えを編集しました
-J42161217

2

Pythonの3228の226 224 215 197 195バイト

-11バイト@Mrに感謝します。Xcoder

-2バイト@Mrに感謝します。Xcoder

def f(n,s=range):
 x=y=t=c=0;z=[]
 for i in s(n*n-n+2):c+=i%(n-(2<=n))<1;z+=[[x,y]];t=max(t,x);x+=2-c%2;y+=[-1,1][c%4<3]*(c%2)
 return'\n'.join(''.join(' O'[[k,j]in z]for k in s(t))for j in s(n))

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

説明とゴルフの少ないコード:

def f(n):
 x=y=t=c=0;z=[]                       #initialize everything
 for i in range(n*n-n+2):             #loop n*n-n+2 times which is the numberr of 'o's expected
    c+=i%[~-n,n]<n-1                  #if one cycle has been completed, increase c by 1, if n>1.                                            
    z+=[[x,y]]                        #add [x,y] to z(record the positions of 'o')
    t=max(t,x)                        #trap maximum value of x-coordinate(to be used later while calculatng whole string)
    r=[[2,0],[1,1],[2,0],[1,-1]][c%4] #r gives direction for x and y to move, adjust it as per c i.e. cycles
    x+=r[0];y+=r[1]                   #yield newer values of x and y 
 return '\n'.join(''.join(' o'[[k,j]in z]for k in range(t))for j in range(n)) #place space or 'o' accordingly as per the recorded posititons in z

1
とてもいい仕事です。おめでとうございます!
ミスターXcoder

@ Mr.Xcoderありがとうございます。これは大変でした。特に正しい範囲を特定するのに問題がありました。
officialaimm


1
215のバイトはif 2>n:return'o'非常に冗長です。のc+=i%[~-n,n][2>n]<1代わりに回避策を作成しましたc+=i%~-n<1
Xcoder氏17

1
申し訳ありませんが非常に遅れの改善のために、195バイトを
氏Xcoderは、

1

Haskell、197バイト

a n c=take(2*n)$cycle$c:" "
r i n x y=take(div(3*n)2*(n-1)+1)$(' '<$[1..i])++(cycle$"O "++(a(2*n-i-3)y)++"O "++(a(n+i-2)x))
z n=take n$(r 0 n 'O' ' '):[r i n ' ' ' '|i<-[1..n-2]]++[r(n-1)n ' ' 'O']

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

@LynnのおかげOで、ジグザグの水平セグメント上のs 間のスペースが修正されましたが、多くのバイトがかかりました!

いくつかの説明:

  • rは出力の行0 y y y y y 0 x x x 0 y ...です。フォーマット、数、xおよびy行と初期値に依存しますn
  • 上部行のための、x='0'及びy=' '
  • 中央の行、x=' 'およびy=' '
  • 一番下の行のための、x=' '及びy='0'
  • take(div(3*n)2*(n-1)+1) 適切な場所で無限の行を切り取ります
  • すべての出力は場合を除き、1つのトップ行と1つの底部の列を有するn=1take nこのケースを扱います。

素敵なゴルフ!これらのスペースをいくつか削除できると思います。そしてreplicate n xに置き換えることができますx<$[1..n]。また、あなたの答えにはO、ジグザグの水平セグメント上のs 間のスペースがありません。
リン

@Lynnありがとう!水平のセグメントにスペースがあると、私の方法は面倒になりますが、とにかくコードを修正したかったです
...-jferard

演算子を使用して不要なスペースを削除すると、かなり節約できますこちらを参照してください
ბიმო

1

パイソン2155の 151 146 137バイト

m=input()
n=m-1
r=range(n+2)
for L in zip(*[' '*i+'O'+n*' 'for i in(r+[n,m]*~-n+r[-2::-1]+([m,0]*n)[:-1])*m][:1+3*m/2*n]):print''.join(L)

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


@ Mr.Xcoderああ。なるほど。
TFeld

@ Mr.Xcoderが修正されました。
TFeld

私は1年遅れてゴルフのパーティーにしていますが、`L`[2::5]オーバーバイトが保存されます''.join(L)
氏Xcoder
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.