ทางออกที่ดีที่สุดเพื่อไปยังมุมตรงข้ามของรูปสี่เหลี่ยมผืนผ้า


13

งานของคุณคือการเขียนโปรแกรมที่ค้นหาจำนวนการเคลื่อนไหวที่เหมาะสมที่จะได้รับจากมุมล่างซ้ายของรูปสี่เหลี่ยมผืนผ้าไปที่มุมบนขวาตรงข้าม

(width, height)โปรแกรมของคุณจะรับเข้าเป็นคู่ได้รับคำสั่ง สิ่งเหล่านี้จะเป็นขนาดของสี่เหลี่ยมผืนผ้าที่คุณจะใช้งาน โปรแกรมของคุณจะสร้าง ASCII- ศิลปะของการแก้ปัญหา (ใช้.สำหรับสี่เหลี่ยมที่ว่างเปล่าและ#เป็นส่วนหนึ่งของการแก้ปัญหาXสำหรับการเริ่มต้นสแควร์) และนับจำนวนของการเคลื่อนไหวที่ใช้ไปถึงจุดสิ้นสุด ไม่อนุญาตให้ใช้การเคลื่อนไหวในแนวทแยง หากมีหลายวิธีให้เลือกทางออกหนึ่ง

โปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ

ตัวอย่าง

การป้อนข้อมูล: (4, 5)

เอาท์พุท:

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

ย้ายจำนวน: 7


ดังนั้นผลลัพธ์ควรมีจำนวน#ใน "ทางออกที่ดีที่สุด" (ซึ่งเป็นวิธีการแก้ปัญหาใด ๆ ที่ไม่เคยย้ายซ้ายหรือลง) เช่นกัน?
Martin Ender

12
เรื่อง "ขออภัยนี่เป็นคำถามรหัสกอล์ฟครั้งแรกของฉันดังนั้นฉันจึงไม่ค่อยเก่งในการทำสิ่งเหล่านี้" ฉันขอแนะนำ sandboxที่คุณสามารถโพสต์ความคิดที่ท้าทายและรับข้อเสนอแนะก่อนโพสต์ไว้ที่ main และยินดีต้อนรับสู่ PPCG! :)
Martin Ender

@ MartinBüttnerใช่การนับการเคลื่อนไหวนั้นเป็นจำนวน#เพราะมันไม่มีเหตุผลที่จะไปทางซ้ายหรือลง
ericw31415

มันเป็นการดีที่จะแยกถ่านแต่ละตัวด้วยช่องว่าง?
Blue

1
เราต้องส่งออกจำนวนย้ายและศิลปะ ASCII หรือไม่? ผลลัพธ์ควรมีลักษณะอย่างไร
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


ความแตกต่างระหว่างไบต์และตัวละครคืออะไร?
Leun Nun

2
@KennyLau ฉันลืมที่จะพูดถึงว่าในโพสต์ของฉัน ... 05AB1E ใช้การเข้ารหัส CP-1252 ตัวละครแต่ละตัวที่ใช้ในรหัสที่นี่คือ 1 ไบต์
Adnan

3

เรติน่า54 54ไบต์

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

รับอินพุตคั่นด้วย linefeed และเอาต์พุตตารางโซลูชันตามด้วยจำนวนการย้าย

ลองออนไลน์!

คำอธิบาย

\d+
$*.

เปลี่ยนจำนวนเต็มทั้งสองให้เป็นจำนวนมาก.เช่นแปลงให้เป็นจำนวนเต็ม

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

สิ่งนี้จะสร้างกริดของ.s โดยจับคู่แต่ละตัว.ในความสูงของยูนารีและจับภาพการแสดงความกว้างของยูนารี Sเปิดใช้งานโหมดการแบ่งซึ่งจะส่งกลับสตริงจับและ|\Dและ_ร่วมกันให้มั่นใจว่าทุกอย่างอื่นจะถูกลบออกจากสตริง

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

สิ่งนี้จะเปลี่ยนอักขระตัวสุดท้ายของแต่ละบรรทัดรวมทั้งบรรทัดสุดท้ายทั้งหมดเป็น#s

:m-1=`^#
X

วิธีนี้ใช้ตัวเลือกมากมายในการแปลงเฉพาะแถวแรก#ในแถวสุดท้ายเป็นX(เราต้องตรวจสอบให้แน่ใจว่าเฉพาะแถวสุดท้ายเท่านั้นที่ได้รับผลกระทบเนื่องจากอินพุตความกว้าง 1) mเปิดใช้งานโหมดหลายบรรทัดซึ่งทำให้^ตรงกับจุดเริ่มต้นของบรรทัด -1=บอกให้ Retina ทำการแทนในนัดสุดท้ายเท่านั้น ในที่สุด:ปิดโหมดเงียบเริ่มต้นเช่นที่กริดถูกพิมพ์ไปยัง STDOUT เป็นผลกลาง

#

ในที่สุดเราก็นับจำนวน#ในสตริงซึ่งสอดคล้องกับจำนวนการเคลื่อนไหว


อาจมีการเพิ่มในตัวลงในเรติน่าสำหรับการแปลงเป็นเอก
Cyoce

3

Pyke ขนาด 26 ไบต์

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

ลองที่นี่


หรือแบบ noncompetitive 34 ไบต์ให้เพิ่มการใช้โหนดด้วย ast)

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

ลองที่นี่!

หรือ 30 ไบต์หากอนุญาตให้เว้นวรรคเป็นช่องว่างภายใน

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

ทำไมถึงไม่มีการแข่งขัน?
Leun Nun

3
ฉันเปลี่ยนภาษาหลังจากความท้าทายถูกโพสต์
บลู

@muddyfish ข้อผิดพลาดเซิร์ฟเวอร์ภายในเมื่อคุณคลิกลองที่นี่
Insane

@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คุณอาจช่วยฉันตีกอล์ฟนี้ได้ไหม?
Leun Nun

@KennyLau ฉันไม่รู้จัก Pyth ...
Martin Ender

@ MartinBüttnerมันค่อนข้างน่าอายสำหรับ Pyth จะพ่ายแพ้ขวา
รั่วนูน

AtMQคุณสามารถรวมทั้งสองได้รับมอบหมายครั้งแรกกับ นี้กำหนดสองค่าและG H
Jakube

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 ในขณะที่
Cyoce


1

ทับทิมขนาด 48 ไบต์

นี่เป็นฟังก์ชั่นที่ไม่ระบุตัวตนซึ่งเป็นไปตามเมตาโพสต์นี้เป็นที่ยอมรับเว้นแต่คำถามจะระบุว่า "โปรแกรมแบบเต็ม" ปกติแล้วฉันจะไม่พูดเรื่องนี้ แต่ปัญหานั้นง่ายมากและการทำโปรแกรมจะเพิ่มคะแนนขึ้นอย่างมาก

อินพุตเป็นสองอาร์กิวเมนต์ Return value เป็นอาร์เรย์ที่มีสตริงศิลปะ 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

มันเป็นเพียงแค่แถว h-1 ของจุด w-1 ตามด้วย a #และ newline ฉันใส่#ในตอนท้ายเพื่อที่จะใช้เป็นหนึ่งเดียว#\nที่แท้จริงสำหรับทั้งสอง#และการขึ้นบรรทัดใหม่ (รหัสมีการขึ้นบรรทัดใหม่ที่เกิดขึ้นจริงมากกว่าลำดับหนี.) แถวสุดท้ายคือแล้วXตามด้วย W-1 #'s

มันก็สั้นเพื่อพร่องคุณค่าของ W และชั่วโมงในระหว่างการสร้างศิลปะ ASCII w+hเพื่อให้การคำนวณสุดท้ายก็คือ



1

MATL , 28 26 25 ไบต์

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

แก้ไข (10 มิถุนายน 2559): ลิงค์ด้านล่างมีการแก้ไข ( 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

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, 137 132 ไบต์

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 + จะช่วยให้คุณประหยัดได้ไม่กี่ไบต์
บลู


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.