Tüm yönlerde dikdörtgenin karşı köşesine gidin - Daha sert


17

Bu daha zor hariç , aslında bu soru ile aynı şeydir . Yine bir dikdörtgenin sol alt köşesinden sağ üst köşeye giden bir program yazacaksınız. Ancak, bu sefer çapraz hareketlere izin verilir.

Program sıralı bir çifti kabul edecek (width, height)ve bunları bir dikdörtgenin boyutları olarak kullanacaktır. Programınız daha sonra çözümün bir ASCII-sanatını yaratacaktır ( .boş bir kare #için, çözümün bir kısmı Xiçin ve kare başlatmak için kullanın) ve bitiş noktasına ulaşmak için gereken hareket sayısını sayar.

Misal

Giriş: (5, 6)

Çıktı:

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

Bayt cinsinden en kısa cevap kazanır!


7
Değil, çözümler LOTS düzenleme gerektirecektir
Mavi

4
Bu meydan okuma, önerilen kopya gibi, golf için önemsiz olan basit bir problemdir, bu da harika bir kombinasyon. Benzerliğe rağmen, bu meydan okuma farklı bir yaklaşım gerektirir ve önceki meydan okuma için iyi golf çözümleri burada rekabetçi olacak şekilde değiştirilemez.
trichoplax

Daha ayırt edici bir başlık ile yapabilirdi ...
trichoplax

evet, herhangi bir fikir?
ericw31415

1
@LuisMendo Minimum, mümkün olan en küçük ızgaradır; 1 tarafından 1
ericw31415

Yanıtlar:


1

MATL , 38 bayt

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

Çevrimiçi deneyin!

açıklama

Izin vermek mve daha büyük veya eşit olarak nsıralanmış girişler molmak n. Kod başlangıçta aşağıdaki gibi bir mx nmatrisi oluşturur :

  • Ana köşegen boyunca ve son sütunun alt kısmında 2 değeri. Bu karaktere karşılık gelir #. Bu girişlerin sayısı eksi 1 hareket sayısıdır.
  • (1,1) girişindeki 3 değeri X.
  • Kalan girişler karaktere karşılık gelen 1 içerir .

Gerekirse, matris şimdi istenen şekle sahip olacak şekilde yerleştirilir. Bir matrisin ilk boyutunun genişlik değil yüksekliğidir, bu nedenle ikinci girişe karşılık gelir.

Daha sonra matris baş aşağı çevrilir, böylece Xilk sütunun altında görünür ve girişleri '.#X'istenen 2D karakter dizisini üretmek için dizeye indeks olarak kullanılır .

'.#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
Hareket sayısı sayılmaz ...?
ericw31415

@ ericw31415 Üzgünüm. Şimdi çözüldü
Luis Mendo

5

Pyth, 46 45 44 bayt

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

Burada deneyin.

Açıklama:

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

Düzenleme 2 kaydedilen thx bayt @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)

Ölçek

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=İçine ... taşıyarak 2 bayt kaydedin map().
Neil

0

Javascript (harici kitaplık kullanarak) (235 bayt)

Tanrım bu zor oldu! Eh ... kütüphanem bu haha ​​için gerçekten doğru bir görev değildi. Ama zorluğu sevdim

(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 bağlantısı: https://github.com/mvegh1/Enumerable

Kod açıklaması: 2 değişkenli fonksiyon oluşturun. Değişkenlere x-1 ve y-1 depolayın. Bunların maks ve min değerlerini değişkenlere kaydedin. Y sayısı için (y-1) 'den dikey olarak azalan bir sayı aralığı oluşturun. Dikey aralıktaki her öğe için, karmaşık yükleme göre geçerli öğe için bir satır yazın. Bu yüklem, x sayısı için 0'dan artan bir tamsayı aralığı oluşturur. Bu aralıktaki her öğe için karmaşık bir yükleme göre 1 dizeye birleştirin. Bu yüklem sol altta olup olmadığını kontrol eder, başka çaprazda olup olmadığını kontrol eder, aksi takdirde X veya Y sınırında olduğumuzu kontrol eder. Son olarak, bunların hepsi bir değişkende saklandı. Daha sonra hareket sayısını elde etmek için, temelde sadece # 'ları sayıyoruz. Sonra bunu depolanan değişkene birleştirin ve sonucu döndürün

Bu ağız doluydu haha. Ekran görüntüsünde yanlış bytecount var çünkü bunu gönderirken 4 bayt kaydetmenin bir yolunu buldum

DÜZENLEME: Diğer cevapların çıktılarına "Hareket sayısı:" koymadığını görüyorum, ama benimki. Bu bir gereklilik değilse, bir sürü bayt tıraş eder ...

resim açıklamasını buraya girin


0

Python 3, 161 bayt

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)

Bağımsız değişken üzerinden girdi alan ve ascii-art'ı, ardından hareket sayısını STDOUT'a yazdıran bir işlev.

Nasıl çalışır

Program önce bir liste listesi oluşturur, burada her liste kılavuzun bir satırını temsil eder ve bileşen listelerinin her bir elemanıdır .. Olması gereken her öğe #, çıktı ızgarasının kare olması durumunda, konumunu temsil eden koordinatların eşit olacağı özelliğine sahiptir; bu nedenle, bazı indeksler üzerinde döngü yapmak ive #konuma yerleştirmek (i, i)istenen çıktıyı verecektir. Bununla birlikte, ızgara her zaman kare değildir ve bu nedenle indeksler, minimum indeks ve genişlik / yükseklik (sıfır indeksleme nedeniyle azaltılmış) alınarak gerektiği şekilde ızgaraya kenetlenir. Dizin sıfırsa, geçerli konum sol alt giriş olmalıdır ve bu nedenleXyerine eklenir. Daha sonra, her satırdaki öğeler birleştirilir ve her satır STDOUT'a yazdırılır. Hareket sayısı azaltılan genişlik / yükseklik maksimumudur; bu da basılır.

Ideone üzerinde deneyin

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.