사각형의 반대편 모서리로 이동하는 최적의 솔루션


13

당신의 임무는 직사각형의 왼쪽 하단에서 오른쪽 상단으로 직진하는 데 필요한 최적의 이동 수를 찾는 프로그램을 작성하는 것입니다.

프로그램은 입력을 주문 쌍으로 받아들 (width, height)입니다. 이것들은 당신이 사용할 직사각형의 치수가 될 것입니다. 프로그램은 ASCII 아트 솔루션 ( .빈 사각형 및 #솔루션의 일부, X사각형 시작에 사용)을 작성하고 엔드 포인트에 도달하는 데 걸리는 이동 수를 계산합니다. 대각선 이동은 허용되지 않습니다. 여러 솔루션이있는 경우 출력 할 솔루션을 하나 선택하십시오.

바이트 단위의 최단 프로그램이 이깁니다.

입력: (4, 5)

산출:

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

이동 횟수 : 7


따라서 출력 #에 "최적 솔루션"(왼쪽 또는 아래쪽으로 절대 움직이지 않는 솔루션) 의 숫자가 포함되어야 합니까?
Martin Ender

12
Re "죄송합니다. 이것이 나의 첫 번째 골프 골프 질문입니다. 도전 아이디어를 게시하고 의견을 메인에 게시하기 전에 의견을받을 수 있는 샌드 박스를 추천하겠습니다 . 그리고 PPCG에 오신 것을 환영합니다! :)
Martin Ender 2016

@ MartinBüttner 예, 이동 횟수는 기본적 #으로 왼쪽 또는 아래쪽으로 이동하는 것이 비논리적이므로 그 수입니다 .
ericw31415

각 문자를 공백으로 구분해도됩니까?
Blue

1
이동 수와 아스키 아트를 출력해야합니까? 출력은 정확히 어떻게 표시되어야합니까?
James

답변:


0

05AB1E , 27 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 인코딩을 사용합니다 .


바이트와 ​​문자의 차이점은 무엇입니까?
Leaky Nun

2
@KennyLau 내 게시물에서 언급하는 것을 잊어 버렸습니다 ... 05AB1E는 CP-1252 인코딩을 사용하며 여기 코드에서 사용되는 각 문자는 1 바이트입니다.
Adnan

3

망막 , 54 53 바이트

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

라인 피드로 분리 된 입력을 취하고 솔루션 그리드와 이동 횟수를 출력합니다.

온라인으로 사용해보십시오!

설명

\d+
$*.

두 정수를 그 숫자로 바꾸십시오 ..

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

이것은 단항 높이에서 .각각을 일치 .시키고 폭의 단항 표현을 캡처하여 s 격자를 만듭니다 . 는 S캡처 된 문자열을 반환 분할 모드를 활성화하고 |\D_함께 다른 모든 것이이 문자열에서 제거되었는지 확인합니다.

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

이렇게하면 각 줄의 마지막 문자와 전체 마지막 줄이 #s 로 바뀝니다 .

:m-1=`^#
X

이것은 많은 옵션을 사용 #하여 마지막 행 의 첫 번째 항목 만로 변환 합니다 X(너비 행 입력으로 인해 마지막 행만 영향을 받도록해야합니다). m^의 시작과 일치하는 여러 줄 모드를 활성화 합니다. -1=Retina에게 마지막 경기에서만 교체를 수행하도록 지시합니다. 마지막으로 :그리드가 중간 결과로 STDOUT에 인쇄되도록 기본 자동 모드를 끕니다.

#

마지막으로, 우리는 단순히 #문자열 의 숫자 를 세는데, 이것은 움직임의 수에 해당합니다.


아마도 단항으로 변환하기 위해 내장을 망막에 추가해야 할 수도 있습니다.
Cyoce

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

경쟁이 아닌 이유는 무엇입니까?
Leaky Nun

3
도전이 게시 된 후 언어를 변경했습니다
Blue

@muddyfish 여기를 클릭하면 내부 서버 오류가 발생합니다
Insane

@Insane는 버그를 고쳤습니다.
Blue

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 어쩌면 당신이 골프를 도와 드릴까요?
Leaky Nun

@ KennyLau 나는 Pyth를 모른다 ...
Martin Ender

@ MartinBüttner Pyth가 패배 한 것은 당황 스럽습니다.
Leaky Nun

처음 두 과제를와 결합 할 수 있습니다 AtMQ. 그러면 두 값이 G및에 할당 H됩니다.
Jakube


1

루비, 48 바이트

이것은 익명 기능이며, 이 메타 게시물 에 따르면 질문에 "전체 프로그램"이 표시되지 않는 한 허용됩니다. 나는 일반적으로 이것에 대해 현명하지는 않지만 문제는 매우 간단하며 프로그램을하는 것이 점수를 크게 % 증가시킵니다.

입력은 두 개의 인수입니다. 반환 값은 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 행의 문자열이며 그 뒤에 a #와 줄 바꿈이 있습니다. #마지막에는 개행 문자와 개행 문자 #\n모두에 단일 리터럴 을 사용하기 위해 끝 부분에 넣었습니다. #(코드에는 이스케이프 시퀀스가 ​​아닌 실제 개행 문자가 포함되어 있습니다.) 마지막 행은 Xw-1 #입니다.

ASCII 아트 생성 중에 w와 h의 값을 줄이는 것이 더 짧았으므로 최종 계산은 간단 w+h합니다.


1

자바 스크립트 (ES6), 60 바이트

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

용법

f(4)(5)

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

1

MATL , 28 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

스칼라, 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

하스켈, 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

자바, 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;}

자바는 농담은 아니지만 ...
ericw31415

s = s + 대신 s + =는 몇 바이트를 절약합니다
Blue


0

파이썬, 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.