Dikdörtgenin karşı köşesine gitmek için en uygun çözüm


13

İşiniz, bir dikdörtgenin sol alt köşesinden doğrudan sağ üst köşeye gitmek için en uygun hareket sayısını bulan bir program yazmaktır.

Programınız girişi sıralı bir çift olarak kabul edecektir (width, height). Bunlar üzerinde çalışacağınız dikdörtgenin boyutları olacaktır. Programınız, çözümün bir ASCII-sanatını ( .boş kare ve #çözümün bir kısmı Xiçin , kare başlatmak için kullanın) oluşturur ve bitiş noktasına ulaşmak için gereken hareket sayısını sayar. Çapraz hareketlere izin verilmez. Birden fazla çözüm varsa, çıktı alınacak çözümü seçin.

Bayt cinsinden en kısa program kazanır.

Misal

Giriş: (4, 5)

Çıktı:

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

Hareket sayısı: 7


Peki çıktı #da "en uygun çözüm" (hiç sola veya aşağı hareket etmeyen herhangi bir çözüm) sayısını içermelidir ?
Martin Ender

12
Re "Üzgünüm, bu benim ilk kod golf sorum bu yüzden bunları yapmak çok iyi değilim." Meydan okuma fikirleri gönderebileceğiniz ve ana mesaj göndermeden önce geri bildirim alabileceğiniz sanal alanı öneriyorum . Ve PPCG'ye hoş geldiniz! :)
Martin Ender

@ MartinBüttner Evet, hareket sayısı esasen sayıdır #çünkü sola veya aşağı gitmek mantıksızdır.
ericw31415

Her bir karakteri boşluklarla ayırmak uygun mudur?
Mavi

1
Hareket sayısını VE ASCII sanatını çıktılamak zorunda mıyız? Çıktı tam olarak nasıl görünmelidir?
James

Yanıtlar:


0

05AB1E , 27 24 bayt

Kod:

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

Açıklama:

+                         # 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.

Çevrimiçi deneyin! . CP-1252 kodlamasını kullanır .


Bayt ve karakter arasındaki fark nedir?
Leaky Nun

2
@KennyLau Mesajlarımda ... 05AB1E CP-1252 kodlaması kullandığını belirtmeyi unutuyorum, burada kodda kullanılan her karakter 1 bayt.
Adnan

3

Retina , 54 53 bayt

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

Satır besleme ile ayrılmış girdiyi alır ve çözüm ızgarasını takiben hareket sayısını çıkarır.

Çevrimiçi deneyin!

açıklama

\d+
$*.

Her iki tamsayıyı bu kadar .s'ye çevirin , yani onları tekli'ye dönüştürün.

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

Bu, .her birini .tekli yükseklikte eşleştirerek ve genişliğin tekli gösterimini yakalayarak bir s ızgarası oluşturur . SYakalanan dizeleri döndürür bölme modunu aktive eder ve |\Dve _birlikte başka her şeyin dize kaldırılır sağlamak.

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

Bu, her satırın son karakterini ve son satırın tamamını #s'ye dönüştürür .

:m-1=`^#
X

Bu, yalnızca #son satırdaki ilk satırı dönüştürmek için bir ton seçenek kullanır X(genişlik-1 girişleri nedeniyle yalnızca son satırın etkilendiğinden emin olmamız gerekir). hatların başlangıcına uyması için mçok hatlı modu etkinleştirir ^. -1=Retina'ya oyuncu değişikliğini sadece son maçta gerçekleştirmesini söyler. Son olarak, :ızgara bir sonuç olarak STDOUT'a yazdırılacak şekilde varsayılan sessiz modu kapatır.

#

Son olarak, #dize içerisindeki sayıyı hareket sayısına karşılık gelen sayıyoruz .


Belki de yerleşik olmayana dönüştürmek için retinaya bir yerleşik eklenmelidir.
Cyoce

3

Pyke, 26 bayt

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

Burada deneyin


Veya rekabetçi olmayan 34 bayt, bir ast ile uygulama düğümü ekleyin)

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

Burada deneyin!

Veya dolgu olarak izin verilen alanlarda 30 bayt

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

Neden rekabetçi değil?
Leaky Nun

3
Meydan okuma gönderildikten sonra dili değiştirdim
Blue

@muddyfish Buradan deneyin'i tıklattığınızda dahili sunucu hatası
Insane

@Insane hatayı düzeltti (umarım) Gün değiştiğinde dahili test başarısız oluyordu.
Mavi

2

Pyth, 32 29 24 bayt

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

Çevrimiçi deneyin!

Örnek giriş:

(4, 5)

Örnek çıktı:

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

Nasıl çalışır:

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))

Önceki deneme:

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

Çevrimiçi deneyin!

Örnek giriş:

(4, 5)

Örnek çıktı:

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

Nasıl çalışır:

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 Belki bunu golf oynamada bana yardım edebilirsin?
Leaky Nun

@KennyLau Hiç Pyth bilmiyorum ...
Martin Ender

@ MartinBüttner Pyth için mağlup olmak çok utanç verici, sağ
Leaky Nun

İlk iki ödevi ile birleştirebilirsiniz AtMQ. Bu, iki değeri Gve öğesine atar H.
Jakube


1

Ruby, 48 bayt

Bu, soru "tam program" belirtilmediği sürece, bu meta gönderiye göre kabul edilebilir olan anonim bir işlevdir . Normalde bu konuda bilgiç olmazdım ama problem çok basit ve bir program yapmak skorda% anlamlı bir artış olacak.

Girdi iki bağımsız değişkendir. Dönüş değeri, ASCII resim dizesini ve #yoldaki sayısını içeren bir dizidir .

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

Test programında

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

puts f[4,5]

Çıktı

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

Bu sadece bir dizi h-1 satır w-1 nokta, ardından bir #ve satırsonu. Her ikisini de ve satırsonu için #tek bir #\nhazır bilgi kullanmak için sonuna kadar koydum #(kod, bir kaçış dizisi yerine gerçek bir satırsonu içeriyor.) Son satır daha sonra Xw-1 #'i takip ediyor.

ASCII sanat üretimi sırasında w ve h değerlerini azaltmak daha kısaydı, böylece son hesaplama basittir w+h.


1

JavaScript (ES6), 60 bayt

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

kullanım

f(4)(5)

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

1

MATL , 28 26 25 bayt

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

DÜZENLEME (10 Haziran 2016): aşağıdaki bağlantı , dildeki değişikliklere uyum sağlamak için bir değişiklik içerir ( 5Lile değiştirilir IL)

Çevrimiçi deneyin!

açıklama

+       % 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 bayt

(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 bayt

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

Kullanım örneği:

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

Nasıl çalışır:

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, 137131 bayt

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 tam olarak bir şaka değil ...
ericw31415

s + = s = s + yerine birkaç bayt kurtaracak
Blue

0

Lua, 81 bayt

Çevrimiçi deneyin!

golfed:

w,h=(...)print((("."):rep(w-1).."#\n"):rep(h-1).."X"..("#"):rep(w-1))print(w+h-2)

Ungolfed:

w,h=4,5
print((("."):rep(w-1).."#\n"):rep(h-1).."X"..("#"):rep(w-1))
print(w+h-2)

0

Python, 48.

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

Kullanmak için f=yukarıdaki satırdan önce ekleyin ve şöyle arayın:

f(4, 5)

Sonuç:

...#
...#
...#
...#
X###
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.