長方形の反対側の角に行く最適なソリューション


13

あなたの仕事は、長方形の左下隅から正反対の右上隅までの最適な移動数を見つけるプログラムを作成することです。

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

バイト単位の最短プログラムが優先されます。

入力: (4, 5)

出力:

..##
..#.
.##.
.#..
X#..

移動回数:7


出力には、#「最適なソリューション」(左または下に移動しないソリューション)の数も含める必要がありますか?
マーティンエンダー

12
「申し訳ありませんが、これは私の最初のコードゴルフの質問なので、私はこれらを作るのがあまり得意ではありません。」メインに投稿する前に、チャレンジアイデアを投稿してフィードバックを受け取ることができるサンドボックスをお勧めします。PPCGへようこそ!:)
マーティンエンダー

@MartinBüttnerはい、#左または下に移動するのは非論理的であるため、移動カウントは基本的に数です。
ericw31415

各文字をスペースで区切っても大丈夫ですか?
ブルー

1
移動回数とアスキーアートを出力する必要がありますか?出力はどのように表示される必要がありますか?
ジェームズ

回答:


0

05AB1E27 24バイト

コード:

+Í,¹<'.×'#¶J²<×'X'#¹<×J,

説明:

+                         # Add the length and the height.
 Í                        # Decrease by two.
  ,                       # Print this value with a newline.
   ¹<'.×                  # Take the first input, decrease by 1 and multiply with ".".
        '#¶               # Push a "#"-character and a newline character.
           J              # Join the string.
            ²<            # Take the second input and decrease by 1.
              ×           # Multiply the joined string with this value.
               'X         # Push the "X"-character.
                 '#¹<×J   # Multiply the "#"-character with (first input - 1).
                       ,  # Pop and print with a newline.

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


バイトと文字の違いは何ですか?
リーキー修道女

2
@KennyLau投稿で言及するのを忘れずに... 05AB1EはCP-1252エンコーディングを使用します。ここでコードで使用される各文字は1バイトです。
アドナン

3

網膜54 53バイト

\d+
$*.
S_`(?<=(.+)¶.*).|\D
T`.`#`.¶|.*$
:m-1=`^#
X
#

改行で区切られた入力を受け取り、ソリューショングリッドに続いて移動カウントを出力します。

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

説明

\d+
$*.

両方の整数をその数に.変換します。つまり、それらを単項に変換します。

S_`(?<=(.+)¶.*).|\D

これは、単項の高さで.それぞれ.を一致させ、幅の単項表現をキャプチャすることにより、sのグリッドを構築します。S撮影した文字列を返すスプリットモードを起動し、|\Dそして_一緒に他のすべての文字列から削除されていることを確認してください。

T`.`#`.¶|.*$

これにより、各行の最後の文字と最後の行全体が#sに変わります。

:m-1=`^#
X

これは、多数のオプションを使用#して、最後の行の最初の行のみを変換しますX(幅1の入力により、最後の行のみが影響を受けることを確認する必要があります)。m^の先頭に一致する複数行モードをアクティブにします。-1=Retinaに、最後の一致でのみ置換を実行するよう指示します。最後に、:中間結果としてグリッドがSTDOUTに出力されるように、デフォルトのサイレントモードをオフにします。

#

最後に、#移動の数に対応する文字列の数を単純にカウントします。


おそらく、単項に変換するには、網膜に組み込みを追加する必要があります。
チョイス

3

パイク、26バイト

DtQ+RtF; Q\.*t\#+)\X\#Qt*+

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


または、非競合34バイト、astの適用ノードを追加)

jUa]Dm!X|RZjht]q+".#X"R@)Fs
);jmts

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

または、パディングとしてスペースが許可されている場合は30バイト

jUa]Dm!X|RZjht]q+".#X"R@)Pjmts

なぜ非競争的ですか?
リーキー修道女

3
チャレンジが投稿された後、言語を変更しました
ブルー

@muddyfishここでクリックすると内部サーバーエラーが発生する
非常識な

@Insaneはバグを修正しました(うまくいけば)時間の内部テストは日が変わるたびに失敗していました。
ブルー

2

Pyth、32 29 24バイト

AtMQVH+*\.G\#;+\X*\#G+GH

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

サンプル入力:

(4, 5)

サンプル出力:

...#
...#
...#
...#
X###
7

使い方:

AtMQVH+*\.G\#;+\X*\#G+GH
                           assign('Q',eval_input())
AtMQ                       assign('[G,H]',Pmap(lambda d:tail(d),Q))
    VH       ;             for N in range(H):
      +*\.G\#                  implicit_print(plus(times(".",G),"#"))
              +\X*\#G      implicit_print(plus("X",times("#",G)))
                     +GH   implicit_print(plus(G,H))

以前の試み:

JthQK@Q1+*++*\.J\#btK+\X*\#Jt+JK

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

サンプル入力:

(4, 5)

サンプル出力:

...#
...#
...#
...#
X###
7

使い方:

JthQK@Q1+*++*\.J\#btK+\X*\#Jt+JK
                                 assign('Q',eval_input())        --Q is now an official pair of numbers (4, 5)
JthQ                             assign("J",decrement(first(Q))) --gets the first element, and then take 1 from it, and assign it to J
    K@Q1                         assign("K",lookup(Q,1))         --K is now the second element (count from 0) of the pair.
        +            +\X*\#J     concat(-----------------------------------------------------------,concat("X",times("#",J)))
         *         tK                   repeat(--------------------------------------,decrement(K))
          +       b                            concat(-------------------------,"\n")
           +    \#                                    concat(-------------,"#")
            *\.J                                             repeat(".",J)
                            t+JK decrement(add(J,K)) <--- auto-print

@MartinBüttnerたぶんこれをゴルフするのを手伝ってもらえますか?
リーキー修道女

@KennyLau私はどのPyth ...知らない
マーティン・エンダー

MartinBüttner@非常に倒さなければならないPythために恥ずかしい、右
漏れ修道女

最初の2つの割り当てをと組み合わせることができAtMQます。これにより、2つの値がGとに割り当てられHます。
寂部

1

CJam、35 33バイト

q~\(_2$(+p'.*a*'#f+)W%_"X#"era+N*

フォームの入力を取得width heightし、最初の行に移動カウントを出力し、その後にソリューショングリッドを出力します。

ここでテストしてください。

これは同じバイト数でも機能します:

q~\('.*a*'#f+)W%_"X#"era+N*_'#e=p

しばらくCJamソリューションを見たことがない。
チョイス


1

ルビー、48バイト

これは匿名関数であり、このメタ投稿によれば、質問に「完全なプログラム」と記載されていない限り許容されます。私は通常、これについてはつまらないものではありませんが、問題は非常に単純であり、プログラムを実行すると、スコアが大幅に増加します。

入力は2つの引数です。戻り値は、ASCIIアート文字列と#パス内の番号を含む配列です。

->w,h{[(?.*(w-=1)+'#
')*(h-=1)+?X+?#*w,w+h]}

テストプログラムで

f=->w,h{[(?.*(w-=1)+'#
')*(h-=1)+?X+?#*w,w+h]}

puts f[4,5]

出力

...#
...#
...#
...#
X###
7

これは、w-1ドットのh-1行の単なる文字列で、その後に#改行が続きます。改行と改行の両方に#単一の#\nリテラルを使用するために末尾に配置し#ます(コードにはエスケープシーケンスではなく実際の改行が含まれます)。最後の行にはXw-1が続き#ます。

ASCIIアートの生成中にwとhの値をデクリメントする方が短いため、最終的な計算は単純になりw+hます。


1

JavaScript(ES6)、60バイト

w=>h=>--w+--h+`
${"."[r="repeat"](w)}#`[r](h)+`
X`+"#"[r](w)

使用法

f(4)(5)

7
...#
...#
...#
...#
X###

1

MATL28 26 25バイト

+qq35IMwX"46 5Lt4$(88HG(c

編集(2016年6月10日):以下のリンクには、言語の変更に適応するための変更5Lが含まれています(に置き換えられますIL

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

説明

+       % take two inputs. Add them
qq      % subtract 2
35      % push ASCII for '#'
IMw     % push the two inputs again. Swap them
X"      % 2D char array of '#'  repeated as indicated by inputs
46      % push ASCII for '.'
5Lt4$(  % fill all but last and row columns with that
88HG(   % fill 88 (ASCII for 'X') at linear index given by second input
c       % convert to char

0

Scala、118バイト

(w:Int,h:Int)=>{print(Array.fill(h-1,w-1)('.')map(new String(_))mkString("","#\n","#\nX"));Seq.fill(w-1)(print("#"))}


(w:Int,h:Int)=>{...}           //define a function with 2 Ints as parameters
print(                        //print ...   
  Array.fill(h-1,w-1)('.')    //an array of arrays with dimensions (h-1,w-1)
                              //and fill it with a dot
  map(new String(_))          //map each inner array of chars to a string
  mkString("","#\n","#\nX")   //create a string from the array, with
                              //an empty string before the array,
                              //"#\n" as a seperator between the elements
                              //and "#\nX" at the end   
);
Seq.fill(w-1)(print("#"))     //w-1 times print "#"

0

Haskell、64バイト

c!n=c<$[2..n]
w#h=unlines$('.'!w++"#")!h++['X':'#'!w,show$w+h-2]

使用例:

*Main> putStr $ 4 # 5
...#
...#
...#
...#
X###
7

使い方:

c!n = c <$ [2..n]                       -- helper function: make (n-1) copies of c

                                        -- main function
                     !h                 -- (h-1) times
       ('.'!w ++ "#")                   --    (w-1) dots and a hash sign
                       ++[      ,     ] -- followed by
                          'X' : '#'!w   --    an 'X' and (w-1) hash signs
                            show$w+h-2  --    and the number of steps
unlines                                 -- join everything with newlines in-between

0

Java、137132バイト

w->h->{String s="";int i=0,j;for(;i<h;i++){for(j=1;j<w;j++)s+=".";s+="#\n";}s+="X";for(j=1;j<w;j++)s+=".";s+="\n"+(w+h-2);return s;}

しかし、Javaは冗談ではありません
...-ericw31415

s = s +の代わりにs + =を使用すると、数バイト節約できます
-Blue


0

Python、48。

lambda w,h:('.'*(w-1)+'#\n')*(h-1)+'X'+'#'*(w-1)

それを使用するf=には、上の行の前に追加し、次のように呼び出します。

f(4, 5)

結果:

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