できるだけ正方形に近いグリッドを作成します


10

グリッドをできるだけ正方形に近づける関数またはプログラムを作成する

  • 入力として整数N、整数(1、2、3、25など)が与えられます
  • 出力は、できるだけ正方形に近いN文字の完全な長方形グリッドである必要があります
  • (志望)正方形は、ユーザーが指定したOまたはXの文字のいずれかで構成されている必要があります

ポイント

  • OまたはXのみにハードコード:+1
  • 出力を回転するためのparam(0/1、true / false、類似のもの)(5または8など):-10
  • 正方形を設計します(何らかのパターンでOとXの両方を使用します):-5

両方のタイプの文字(x / y軸> = 3)を含み、水平方向または垂直方向に反転してもパターンは同じである場合、パターンは有効と見なされます(XとOsの交換が許可されています)。

INPUT: 4         INPUT: 5       INPUT: 8              INPUT: 9
OO               OOOOO          XXXX                  XOX
OO                              XXXX                  OXO  
                                or rotated 90deg      XOX

許可されない例(同じ長さの行または列ではない)

BAD RESULT: 5a        BAD RESULT: 5b      BAD RESULT: 8
OOO                   OO                  OOO
OO                    OO                  OOO
                      O                   OO

可能であれば、オンラインの例を提供してください。


機能は十分ですか、それとも完全なプログラムが必要ですか?
John Dvorak

「正方形をデザイン... 9の場合は中心を変更」-パターンがチェッカーボードではない正確な状況とは?例を挙げていただけますか?
John Dvorak

編集について:私は正しく読むのでは"xo"[i]なく、3つのポイントを得るのiですか?それはそれの価値がないようです。一般的に、すべての報酬は少し低いようです。
John Dvorak

「ある種のパターン」はちょっとあいまいです。最初の「x」を「o」に置き換えてもカウントされますか?
John Dvorak

いい質問だ。唯一の興味深いボーナス/ペナルティはローテーションです。個人的には、1つのハードコードされた文字に固執し(つまり、ペナルティをデフォルトにする)、ローテーションの文字以外のすべてのボーナス/ペナルティを排除します。ボーナスやペナルティが多すぎるのは良い考えではありません。重要なことは、主要な問題を明確に特定することです。
Level River St

回答:


6

CJam、16(31-10-5)

これには2つの整数が入力されます。1つ目は方向0または12つ目で、2つ目はグリッドの数OまたはXグリッド内です。

代替Oとを出力しXます。

:X"OX"*X<\Xmqi){(_X\%}g_X\/?/N*

これは単なる関数本体です。試してみるにl~は、次のようにコードの前に追加してください。

l~:X"OX"*X<\Xmqi){(_X\%}g_X\/?/N*

のような入力を与える

0 10

のような出力を得るために

OXOXO
XOXOX

または次のように入力

1 10

ために

OX
OX
OX
OX
OX

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


使い方:

l~                                 "Put the two input integers to stack";
  :X                               "Assign the number of cells to X";
    "OX"*                          "Take string "OX" and repeat it X times";
         X<                        "Slice it to take only first X characters";
           \                       "Swap top two stack elements, now string is at bottom";
            Xmqi)                  "Take square root of X, ceil it and put on stack";
                 {(_X\%}g          "Keep decrementing until it is perfectly divisible by X";
                         _X\/      "Copy it, divide X by that and put it on stack";
                             ?     "Based on first input integer, take either of numbers";
                              /    "Divide the XOXO string that many times";
                               N*  "Join the string parts with a new line";

実行例:

l~ed:X"OX"*edX<ed\edXmqi)ed{(_X\%}ged_edXed\ed/ed?ed/edN*ed

#INPUT:
1 10

#OUTPUT:
Stack: [1 10]

Stack: [1 "OXOXOXOXOXOXOXOXOXOX"]

Stack: [1 "OXOXOXOXOX"]

Stack: ["OXOXOXOXOX" 1]

Stack: ["OXOXOXOXOX" 1 4]

Stack: ["OXOXOXOXOX" 1 2]

Stack: ["OXOXOXOXOX" 1 2 2]

Stack: ["OXOXOXOXOX" 1 2 2 10]

Stack: ["OXOXOXOXOX" 1 2 10 2]

Stack: ["OXOXOXOXOX" 1 2 5]

Stack: ["OXOXOXOXOX" 2]

Stack: [["OX" "OX" "OX" "OX" "OX"]]

Stack: ["OX
OX
OX
OX
OX"]

OX
OX
OX
OX
OX

3

APL(36-5-10 = 21)

{'OX'⍴⍨⍺⌽⊃∆/⍨⍵=×/¨∆←∆[⍋|-/¨∆←,⍳2/⍵]}

左の引数は回転、右の引数はサイズです。また、単純なパターンを使用します(「X」と「O」を交互に使用します)。

      0{'OX'⍴⍨⍺⌽⊃∆/⍨⍵=×/¨∆←∆[⍋|-/¨∆←,⍳2/⍵]}¨4 5 8 9
 OX  OXOXO  OXOX  OXO 
 OX         OXOX  XOX 
                  OXO 
      1{'OX'⍴⍨⍺⌽⊃∆/⍨⍵=×/¨∆←∆[⍋|-/¨∆←,⍳2/⍵]}¨4 5 8 9
 OX  O  OX  OXO 
 OX  X  OX  XOX 
     O  OX  OXO 
     X  OX      
     O       

説明:

  • ∆←,⍳2/⍵:からすべての可能な数のペアを生成し1に保存します。
  • ∆←∆[⍋|-/¨∆... ]各ペアの2つの数値の絶対差で昇順に並べ替え、結果をに格納します。
  • ⊃∆/⍨⍵=×/¨∆:各ペアについて、数値を掛け合わせます。に乗算するペアのみを選択し、最初に一致するペアを選択します(これは、ソートのために「最も正方形」です)。
  • ⍺⌽:長さのリスト(2つの要素を持つ)をによって回転します。
  • 'OX'⍴⍨:そのサイズの行列を作成し、とを交互に入力OXます。


2

CJam、 25 22 21(31〜10)

これは関数本体です。完全なプログラムが必要な場合はriri、前に追加してください。コードブロックとして使用する場合は、で囲み{}ます。cjam.aditsu.netでテストします

2つの整数引数として入力を受け取ります。長方形が垂直(ゼロ以外の値)か水平(ゼロ)かを示すスイッチと、O使用するs の数です。

:Xmqi){(_X\%}g_X\/@{\}{}?'O*N+*

説明

:X "Assign the top item on the stack (the second input) to variable X";
mq "Take its square root";
i  "Convert to integer (round)";
)  "Increment it";

{  "Start code block";
  (  "Decrement";
  _X "Duplicate top item on stack; push X to the stack";
  \% "Swap top 2 items and take division remainder";
}g "Loop until top item on stack is 0; pop condition after checking it";

_X "Duplicate top item on stack; push X to the stack";
\/ "Swap top 2 items and divide";

"OMIT THIS BIT TO GET A 25-CHAR FUNCTION WITHOUT THE 10PT BONUS";
 @  "Rotate top 3 items on stack";
 {\}"Code block 1: swap top two items";
 {} "Code block 2: do nothing";
 ?  "If top item of stack is 0, run code block 1, otherwise run code block 2";

'O "Push the character O to the stack";
*  "Repeat it N times, where N is the second item from the top of the stack (O is first)";
N+ "Push a new line and concatenate it with the string on the top of the stack";
*  "Repeat the string N times";

1
大きな数のデクリメントは、バイトカウントを失うことなく、かなり速くなるはずです
edc65

1
誰が反対票を投じたのですか?どうして?

2
誰かがCJamを本当の言語と見なしていないからだと思うだけです。–
John Dvorak

あなたの説明はちょっと壊れています。現在編集していますか?
John Dvorak 14

@JanDvorakはい、編集の途中で、TabキーとEnterキーを誤って押しました。現在は修正されています。

2

JavaScript(E6)84(83 + 1)または101(116-10-5)

パターン+ローテーション(パラメーターf、0または1)-ボーナス15

F=(n,f)=>{
  for(r=x=0;y=n/++x|0,x<=y;)x*y-n?0:z=f?x:y;
  for(o='';n;)o+=(n--%z?'':(r^=1,c='\n'))+'OX'[r^(c^=1)];
  alert(o)
}

パターンなし、回転なし-ペナルティ1

F=n=>{
  for(x=0;y=n/++x|0,x<=y;)x*y-n?0:z=y;
  alert(('O'.repeat(z)+'\n').repeat(n/z));
}

FireFox / FireBugコンソールでテストする

F(30,0)

OXOXOX
XOXOXO
OXOXOX
XOXOXO
OXOXOX

F(30,1)

OXOXO
XOXOX
OXOXO
XOXOX
OXOXO
XOXOX

2

Python、79 75(ボーナスなし)

ボーナスはトリッキーに見えるので、これは非常に単純なPython関数です。

def f(N):c=max(x*((x*x<=N)>N%x)for x in range(1,N+1));print(N/c*'O'+'\n')*c

関心のあるオンラインの例:repl.it/Zq9
Martijn

1
テスト後にこれを変更しましたか?私はこれを試してみましたが、機能しません。たとえばf(8)、8 O秒の列が1つ与えられましたが、これは誤りです。
マリナス2014

@marinus:私はそれをテストしましたが、間違ったバージョンをコピーしたようです。Aがあった>があったはずです<。現在は修正されています。メモありがとうございます!
エミル

1

Ruby、74

f=->n{w=(1..n).min_by{|z|n%z>0?n:(n/z-n/(n/z))**2};$><<("X"*w+"\n")*(n/w)}

説明

  • 入力はラムダへの引数として取られます。それは期待していIntegerます。
  • n(入力)が1からまでのすべての整数で割り切れるかどうかを確認しnます。
    • もしそうなら、長さと幅の差を計算します。
    • そうでない場合は、大きな数(n)を返します。
  • 正方形に最もよく似合うように、長さと幅の差を最小にします。
  • (過度に簡潔な)String#*メソッドを使用して正方形を「描画」します。

なぜ私は反対票を投じたのですか?私の回答にはバグが含まれていますか?
britishtea 2014

あなたはタイプミスを持っています。最後の単語は「square」で、「sqaure」があります。(私は反対投票者ではありません。私はこの間違いを指摘しています)。
Ismael Miguel

1

APL(Dyalog Unicode)30-15 = 15 バイトSBCS

匿名中置ラムダ。受け取りNを左引数として右引数とPARAMとして。長方形には、XとOの縞模様があるか、チェックされます。

{⍉⍣⍺⍴∘'XO'⊃∘c⌈.5×≢c←⍸⍵=∘.×⍨⍳⍵}

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

{} "dfn"; 左引数(param)、右引数(N):

⍳⍵ɩndices 1…N

∘.×⍨ その九九

⍵=Nがそれに等しい マスク

maskマスクの真の値の指標

c← それをcc andidatesの場合)に格納します

 候補者を集計

.5× 半分を掛けたもの

 天井(切り上げ)

⊃∘c からその要素を選びます c

⍴∘'XO' これを使用して「XO」を周期的に再形成します

⍉⍣⍺ パラメータを転置する


1

05AB1E(レガシー)、スコア:7(22 バイト -15ボーナス)

„OXI∍¹tï[D¹sÖ#<}äIiø}»

オンラインそれを試してみてくださいまたはいくつかのより多くのテストケースを検証します

N最初に入力を受け取り、次に回転するかどうかに関係なくブール(0/ 1)を取ります。

05AB1Eの新しいElixir書き換えバージョンとは異なり、string-listを使用したzipは暗黙的に文字をフラット化して結合するため、Pythonのレガシーバージョン05AB1Eを使用します。

説明:

OX         # Push string "OX"
   I       # Extend it to a size equal to the first input
            #  i.e. 9 → "OXOXOXOXO"
            #  i.e. 10 → "OXOXOXOXOX"
¹t          # Take the first input again, and square-root it
            #  i.e. 9 → 3.0
            #  i.e. 10 → 3.1622776601683795
  ï         # Then cast it to an integer, removing any decimal digits
            #  i.e. 3.0 → 3
            #  i.e. 3.1622776601683795 → 3
   [        # Start an infinite loop:
    D       #  Duplicate the integer
     ¹sÖ    #  Check if the first input is evenly divisible by that integer
            #   i.e. 9 and 3 → 1 (truthy)
            #   i.e. 10 and 3 → 0 (falsey)
        #   #  And if it is: stop the infinite loop
    <       #  If not: decrease the integer by 1
            #   i.e. 3 → 2
   }        # After the infinite loop:
ä           # Divide the string into that amount of equal sized parts
            #  i.e. "OXOXOXOXO" and 3 → ["OXO","XOX","OXO"]
            #  i.e. "OXOXOXOXOX" and 2 → ["OXOXO","XOXOX"]
 Ii }       # If the second input is truthy:
   ø        #  Zip/transpose; swapping rows/columns of the strings
            #   i.e. ["OXOXO","XOXOX"] → ["OX","XO","OX","XO","OX"]
»           # And finally join the strings in the array by newlines
            #  i.e. ["OXO","XOX","OXO"] → "OXO\nXOX\nOXO"
            #  i.e. ["OX","XO","OX","XO","OX"] → "OX\nXO\nOX\nXO\nOX"
            # (and output the result implicitly)

0

GolfScript 26(41-10-5)

:x),1>{x\%!},.,2/=.x\/@{\}*'X'*n+*1>'O'\+

スタックに2つのパラメーターがあることを期待します。

  • 0通常または1転置用
  • n

パターンは、ボードがXsでいっぱいで、左上隅がであるというものOです。言うまでもなく、このパターンはボードを移調するときにも維持されます。

デモ:通常転置


0

Mathematica、71文字

f@n_:=#<>"\n"&/@Array["O"&,{#,n/#}&[#[[⌊Length@#/2⌋]]&@Divisors@n]]<>""

0

プチコンピュータBASIC、72バイト

INPUT N,S$FOR I=1TO SQR(N)IF N%I<1THEN M=I
NEXT
?(S$*M+" "*(32-M))*(N/M)


0

Retina 0.8.2、66バイト+ 1バイトのペナルティ= 67

.+
$*X
((^|\3)(X(?(3)\3)))+(\3)*$
$3 $3$#4$*X
X(?=X* (X+))| X+
$1¶

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

.+
$*X

入力をXsの文字列に変換します。

((^|\3)(X(?(3)\3)))+(\3)*$

外側のキャプチャの最初のパスは文字列の先頭に一致し、その後のパスでは内側のキャプチャの以前の値が一致します。次に、内部のキャプチャが増分され、一致します。この結果、外側のキャプチャによって消費される文字列の量は内側のキャプチャの2乗になるため、入力の平方根を超えることはできません。その間、後続の繰り返しにより、内部のキャプチャが文字列の長さの要素になることが保証されます。

$3 $3$#4$*X

発見された因子を保存し、後続の繰り返し回数を追加して、他の除数を計算します。

X(?=X* (X+))| X+
$1¶

因子を長方形に再配置します。


0

チャコール、33バイト-10-5 = 18

Nθ≔⌊Φ⊕θ¬∨‹×ιιθ﹪θιηE÷θη⭆η§XO⁺ιλ¿N⟲

オンラインでお試しください!リンクはコードの詳細バージョンです。説明:

Nθ

入力N

≔⌊Φ⊕θ¬∨‹×ιιθ﹪θιη

範囲0..を取り、N平方が以上Nで除算される数値のみを保持しN、それらの数値の最小値を取ります。

E÷θη⭆η§XO⁺ιλ

発見された因子を使用して、チェッカーボードパターンを使用して適切な幅と高さの長方形を出力します。(これはUOη÷θηXO¶OX1バイトを節約するためのものですが、現時点ではバグがあります。)

¿N⟲

2番目の入力がゼロ以外の場合は、出力を回転させます。(2番目の入力を許容するか、0または2許容できる場合⟲Nは、1バイト節約することができます。)

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