すべての方向で長方形の反対側の角に移動-より難しく


17

これは基本的にこの質問と同じですが、難しいことを除きます。再び、長方形の左下隅から右上隅に到達するプログラムを作成します。ただし、今回は斜めの移動が許可されています。

プログラムは順序付きペアを受け入れ、(width, height)これらを長方形の寸法として使用します。プログラムは、ソリューションのASCIIアートを作成し(.空の正方形、#ソリューションの一部、およびX開始正方形に使用)、エンドポイントに到達するために必要な移動の数をカウントします。

入力: (5, 6)

出力:

....#
....#
...#.
..#..
.#...
X....
Move count: 5

バイト単位の最短回答が勝ちます!


7
そうではありません。ソリューションには多くの編集が必要です
ブルー

4
提案された複製と同様に、この課題は、ゴルフにとって重要な些細な単純な問題であり、素晴らしい組み合わせです。類似性にもかかわらず、この課題には異なるアプローチが必要であり、以前の課題に対する十分にゴルフされたソリューションは、ここで競争力があるように簡単に修正することはできません。
trichoplax

しかし、より明確なタイトルで行うことができます
...-trichoplax

ええ、何かアイデアはありますか?
ericw31415

1
@LuisMendo最小は可能な限り最小のグリッドです。1 by 1
ericw31415

回答:


1

MATL、38バイト

'.#X'!iSPXytf0)Jh1w(tzqDQI1()Gd0<?!]XP

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

説明

ましょうmn、このようなソートされた入力、ことmに以上ですn。コードは最初に次のようにmx n行列を作成します。

  • 主対角線に沿って、最後の列の下部にある値2。これはcharacterに対応します#。これらのエントリの数から1を引いたものが移動カウントです。
  • に対応するエントリ(1,1)の値3 X
  • 残りのエントリには、文字に対応する1が含まれます .

必要に応じて、マトリックスが転置され、目的の形状になります。行列の最初の次元は幅ではなく高さなので、2番目の入力に対応することに注意してください。

次に、行列が上下逆Xになり、最初の列の下部に表示されます。そのエントリは、文字列'.#X'へのインデックスとして使用され、目的の2D char配列を生成します。

'.#X'    % push this string
!        % transpose into a column
i        % input array
SP       % sort it in non-increasing order
Xy       % identity matrix with that size: fill diagonal with 1, rest entries are 0
tf0)     % linear index of last 1
Jh       % append 1j (imaginary unit): linear index of lowest part of last column
1w(      % fill those entries with 1
tzq      % duplicate. Number of nonzero entries minus 1: this is the move count
D        % display move count (and remove it from the stack)
Q        % add 1. Matrix now contains values 1 and 2
I1(      % set first entry (in linear order) to value 3
)        % use matrix as index into the initial string. Gives 2D char array
Gd0<     % push input array again. Is it decreasing?
?        % if so
  !      %   transpose char array
]        % end
XP       % flip upside down. Implicitly display

1
移動回数とは言いません...?
ericw31415

@ ericw31415ごめんなさい。今すぐ解決
ルイスメンドー

5

Pyth、46 45 44バイト

eSKtMQjsM_mm?sJ,kd?q#J.umtWbbNeSKK\#\.\XhQeQ

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

説明:

move-count-printing:

  K     assign K to...
     Q  the input, a 2-length array...
   tM   with each element decremented
eS      take the max and output it (this is the number of moves)


main path-finding logic:

    mm                     hQeQ  map over x-values and y-values...
        J,kd                     assign J to [x,y]
      ?s                         if both x and y are NOT zero (sum is truthy)...
            ?q#J[...]              if [x,y] is present in [...] (see below)...
                     \#            ... put a # at this position in the output
                       \.          ... else, put a . at this position
                         \X      ... else, put the X here (at [0,0])
jsM_                             reverse and output in the proper format


the [...] part in the code above, which finds positions where #s go:

.u      eSKK  cumulative reduce on <number of moves> elements, starting at K,
                which is [max_x, max_y] as assigned at the beginning
  m    N      map over x and y...
   tWbb       decrement, only if the value is > 0

2

JavaScript(ES6)、132

2バイト保存されたthx @Neilを編集

(w,h)=>[...Array(--h)].map((_,i)=>R(w-i)+'#'+R(i),--w,R=(n,c='.')=>c.repeat(n>w?w:n>0&&n)).join`
`+`
x${R(w-h,'#')+R(h)}
`+(h>w?h:w)

テスト

f=(w,h)=>[...Array(--h)].map((_,i)=>R(w-i)+'#'+R(i),--w,R=(n,c='.')=>c.repeat(n>w?w:n>0&&n)).join`
`+`
x${R(w-h,'#')+R(h)}
`+(h>w?h:w)

function test() {
  var w,h
  [w,h]=I.value.match(/\d+/g)
  O.textContent=f(w,h)
}  

test()
Test <input id=I value="4 5"><button onclick="test()">-></button>
<pre id=O></pre>


w--,R=...に移動して2バイト節約しますmap()
ニール

0

Javascript(外部ライブラリを使用)(235バイト)

これは大変でした!まあ...私の母の図書館はこの母にとって本当に正しい仕事ではなかった しかし、私は挑戦が好きでした

(x,y)=>{r=x-1;s=y-1;m=Math.max(r,s);n=Math.min(r,s);l=_.RangeDown(s,y).WriteLine(z=>_.Range(0,x).Write("",w=>z==0&&w==0?"X":(z==w||(z==s&&w>=n)||(w==r&&z>=n))?"#":"."));return l+"\r\nMove count: "+(l.length-l.split("#").join("").length)}

libへのリンク:https : //github.com/mvegh1/Enumerable

コードの説明:2つの変数の関数を作成します。x-1とy-1を変数に保存します。それらの最大値と最小値を変数に格納します。yのカウントに対して、(y-1)から数値の垂直に下降する範囲を作成します。垂直範囲の各要素について、複雑な述語に従って、現在の要素の行を記述します。この述部は、xのカウントに対して、0からの整数の昇順範囲を作成します。その範囲内の各要素について、複雑な述語に従って1つの文字列に連結します。この述部は、左下にあるかどうかをチェックし、そうでない場合は対角線にあるかどうかをチェックし、そうでない場合はXまたはY境界にあるかどうかをチェックします。最後に、そのすべてが変数に格納されました。次に、移動カウントを取得するには、基本的に#をカウントします。次に、それを保存された変数に連結し、結果を返します

それは口いっぱいの笑でした。この投稿中に4バイトを節約する方法を見つけたため、スクリーンショットのバイトカウントが間違っています

編集:私は他の答えは彼らの出力に「移動カウント:」を入れていないと思いますが、私はそうです。それが要件ではない場合、それはバイトの束を削る...

ここに画像の説明を入力してください


0

Python 3、161 156バイト

def f(w,h):
 x=[['.']*w for i in[0]*h];i=0
 while i<w or i<h:x[~min(i,h-1)][min(i,w-1)]=['#','X'][i<1];i+=1
 for i in x:print(''.join(i))
 print(max(w,h)-1)

引数を介して入力を受け取り、ascii-artに続いて移動カウントをSTDOUTに出力する関数。

使い方

プログラムは最初にリストのリストを作成します。各リストはグリッドの1行を表し、コンポーネントリストの各要素は.です。あるべき各要素には#、出力グリッドが正方形の場合、その位置を表す縦座標が等しいというプロパティがあります。したがって、何らかのインデックスiをループし、その#場所に挿入すると(i, i)、目的の出力が得られます。ただし、グリッドは常に正方形とは限らないため、必要に応じてインデックスと幅/高さの最小値(ゼロインデックス付けにより減少)を取得することにより、インデックスはグリッドに固定されます。インデックスがゼロの場合、現在の位置は左下のエントリでなければならないため、X代わりに挿入されます。次に、各行の要素が連結され、各行がSTDOUTに出力されます。動きの数は、幅/高さの最大値です。これも印刷されます。

Ideoneでお試しください

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