Aç Fare


85

On altı peynir yığını 4x4 kareye konuyor. Onlar dan etiketlenmiş konum kadar . En küçük yığın , en büyüğü .116116

Hungry Mouse öyle aç ki her zaman doğrudan en büyük yığına gider ( ) ve hemen onu yer.16

Bundan sonra, en büyük komşu yığına gider ve hızlı bir şekilde onu da yer. (Evet ... Gerçekten çok acıktı.) Ve artık komşu yığın olmayacak kadar.

Bir yığın 8 taneye kadar komşuya sahip olabilir (yatay, dikey ve çapraz olarak). Etrafta sarma yoktur.

Örnek

Aşağıdaki peynir yığınlarıyla başlayalım:

37105681213159114141162

Hungry Mouse ilk önce , ardından yaşındaki en büyük komşu yığınını yer .1611

37105681213159🐭41412

Bir sonraki hareketleri bu sırayla , , , , , , , , ve .131210815149673

🐭5412

Hungry Mouse'un yanında artık peynir yok, o yüzden orada duruyor.

Meydan okuma

İlk peynir konfigürasyonuna bakıldığında, kodunuz Hungry Mouse onları yemeyi bıraktıktan sonra kalan yığınların toplamını yazdırmalı veya iade etmelidir.

Yukarıdaki örnekte beklenen cevap .12

kurallar

  • Giriş matrisinin boyutu sabit olduğundan, onu 2B dizi veya tek boyutlu dizi olarak alabilirsiniz.
  • ile arasındaki her değerin bir kez tam olarak görünmesi garanti edilir.116
  • Bu .

Test durumları

[ [ 4,  3,  2,  1], [ 5,  6,  7,  8], [12, 11, 10,  9], [13, 14, 15, 16] ] --> 0
[ [ 8,  1,  9, 14], [11,  6,  5, 16], [13, 15,  2,  7], [10,  3, 12,  4] ] --> 0
[ [ 1,  2,  3,  4], [ 5,  6,  7,  8], [ 9, 10, 11, 12], [13, 14, 15, 16] ] --> 1
[ [10, 15, 14, 11], [ 9,  3,  1,  7], [13,  5, 12,  6], [ 2,  8,  4, 16] ] --> 3
[ [ 3,  7, 10,  5], [ 6,  8, 12, 13], [15,  9, 11,  4], [14,  1, 16,  2] ] --> 12
[ [ 8,  9,  3,  6], [13, 11,  7, 15], [12, 10, 16,  2], [ 4, 14,  1,  5] ] --> 34
[ [ 8, 11, 12,  9], [14,  5, 10, 16], [ 7,  3,  1,  6], [13,  4,  2, 15] ] --> 51
[ [13, 14,  1,  2], [16, 15,  3,  4], [ 5,  6,  7,  8], [ 9, 10, 11, 12] ] --> 78
[ [ 9, 10, 11, 12], [ 1,  2,  4, 13], [ 7,  8,  5, 14], [ 3, 16,  6, 15] ] --> 102
[ [ 9, 10, 11, 12], [ 1,  2,  7, 13], [ 6, 16,  4, 14], [ 3,  8,  5, 15] ] --> 103

32
Bu fare karakteri için +1
Luis Mendo

2
... şunu 103 yap:[[9, 10, 11, 12], [1, 2, 7, 13], [6, 16, 4, 14], [3, 8, 5, 15]]
Jonathan Allan

9
Ne güzel bir yazılı meydan okuma! En iyi aday seçim için aklımda tutacağım.
xnor

9
Yanlış okuduktan sonra, bunun aç bir geyik olmadığı için biraz üzüldüm.
akozi

1
Bu zorluk bana txo bilgisayarı için labirent programındaki fareyi hatırlatıyor. Bu oyun 1950'lerde geri yazılmıştı ve efsaneye göre txo dünyada ilk transistorize olmuş bilgisayardı. Evet, ister inan ister inanma, biri büyükbabanızın gününde video oyunları yazıyordu.
Walter Mitty

Yanıtlar:


11

Python 2 , 133 130 bayt

a=input();m=16
for i in range(m):a[i*5:i*5]=0,
while m:i=a.index(m);a[i]=0;m=max(a[i+x]for x in[-6,-5,-4,-1,1,4,5,6])
print sum(a)

Çevrimiçi deneyin!

16 öğenin düzleştirilmiş bir listesini alır.

Nasıl çalışır

a=input();m=16

# Add zero padding on each row, and enough zeroes at the end to avoid index error
for i in range(m):a[i*5:i*5]=0,

# m == maximum element found in last iteration
# i == index of last eaten element
# eaten elements of `a` are reset to 0
while m:i=a.index(m);a[i]=0;m=max(a[i+x]for x in[-6,-5,-4,-1,1,4,5,6])
print sum(a)

Bitişik hücre ifadesi a[i+x]for x in[-6,-5,-4,-1,1,4,5,6]kısaltılabilir a[i+j+j/3*2-6]for j in range(9)(sıfır giriş zararsızdır). Python 3 kesinlikle bir uzunluk-8 bytestring kodlama tarafından daha kısa yapabilir, ancak Python 2 hala daha iyi olabilir.
xnor

1
Senin sıfır doldurma döngü zeki olmasına rağmen bir 2D listeyi almak daha kısa gibi görünüyor: a=[0]*5 for r in input():a=r+[0]+a. Belki yineleme gerektirmeyen daha kısa bir dize dilimleme çözümü vardır.
xnor

8

Python 2,111 bayt

i=x=a=input()
while x:x,i=max((y,j)for j,y in enumerate(a)if i>[]or 2>i/4-j/4>-2<i%4-j%4<2);a[i]=0
print sum(a)

Çevrimiçi deneyin!

Bubbler'dan uyarlanan yöntem ve test durumları . STDIN'de düz bir liste alır.

Kod iki düz endeks olup olmadığını kontrol eder ive jdokunma hücrelerini hem satır farklı hem de i/4-j/4sütun farkının i%4-j%4kesinlikle -2 ile 2 arasında olduğunu kontrol ederek kontrol eder . Bunun yerine ilk geçiş otomatik olarak başarılı olur; böylece en büyük giriş bitişikliği dikkate almaz.


8

MATL , 50 49 47 bayt

16:HZ^!"2G@m1ZIm~]v16eXK68E16b"Ky0)Y)fyX-X>h]s-

Giriş, ;satır ayırıcı olarak kullanılan bir matristir .

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

16:HZ^!  % Cartesian power of [1 2 ... 16] with exponent 2, transpose. Gives a 
         % 2-row matrix with 1st column [1; 1], 2nd [1; 2], ..., last [16; 16] 
"        % For each column, say [k; j]
  2      %   Push 2
  G@m    %   Push input matrix, then current column [k; j], then check membership.
         %   This gives a 4×4 matrix that contains 1 for entries of the input that
         %   contain k or j 
  1ZI    %   Connected components (based on 8-neighbourhood) of nonzero entries.
         %   This gives a 4×4 matrix with each connected component labeled with
         %   values 1, 2, ... respectively
  m~     %   True if 2 is not present in this matrix. That means there is only
         %   one connected component; that is, k and j are neighbours in the
         %   input matrix, or k=j
]        % End
v16e     % The stack now has 256 values. Concatenate them into a vector and
         % reshape as a 16×16 matrix. This matrix describes neighbourhood: entry 
         % (k,j) is 1 if values k and j are neighbours in the input or if k=j
XK       % Copy into clipboard K
68E      % Push 68 times 2, that is, 136, which is 1+2+...+16
16       % Push 16. This is the initial value eaten by the mouse. New values will
         % be appended to create a vector of eaten values
b        % Bubble up the 16×16 matrix to the top of the stack
"        % For each column. This just executes the loop 16 times
  K      %   Push neighbourhood matrix from clipboard K
  y      %   Copy from below: pushes a copy of the vector of eaten values
  0)     %   Get last value. This is the most recent eaten value
  Y)     %   Get that row of the neighbourhood matrix
  f      %   Indices of nonzeros. This gives a vector of neighbours of the last
         %   eaten value
  y      %   Copy from below: pushes a copy of the vector of eaten values
  X-     %   Set difference (may give an empty result)
  X>     %   Maximum value. This is the new eaten value (maximum neighbour not
         %   already eaten). May be empty, if all neighbours are already eaten
  h      %   Concatenate to vector of eaten values
]        % End
s        % Sum of vector of all eaten values
-        % Subtract from 136. Implicitly display

Idk MatLab, fakat +136 yerine -136 tuşuna basarsanız, biraz kurtarabilir misiniz?
Titus

@Titus Hm Nasıl göremiyorum
Luis Mendo

ya da diğer tarafa: 1) itmek yerine 2 sandım 2) her yenilen değeri itin 3) yenen değerleri topla 4) 136 -> 1) bas. Ancak açıkça görüldüğü gibi her biri sadece bir bayt; Muhtemelen kazanç olmaz.
Titus

@Titus Ah, evet, aynı sayıda bayt kullandığını düşünüyorum. Ayrıca, set farkı için her yenen değere (negatif değil) ihtiyacım var; Olumsuzluk sonunda yapılması gerekecekti
Luis Mendo 21:18

6

PHP, 177 174 171 bayt

for($v=16;$v;$u+=$v=max($p%4-1?max($a[$p-5],$a[$p-1],$a[$p+3]):0,$a[$p-4],$a[$p+4],$p%4?max($a[$p-3],$a[$p+1],$a[$p+5]):0))$a[$p=array_search($v,$a=&$argv)]=0;echo 120-$u;

Koşun -nr, matris öğelerini argüman olarak verin veya çevrimiçi deneyin .


5

JavaScript, 122 bayt

Bu konuda birkaç yanlış dönüş yaptım ve şimdi daha fazla golf oynamak için zamanım kalmadı ama en azından çalışıyor. Bir dakika bulabilirsem, yarın tekrar ziyaret edecek (ya da beni tanıma, bu akşam trende eve gideceğim!).

a=>(g=n=>n?g([-6,-5,-4,-1,1,4,5,6].map(x=>n=a[x+=i]>n?a[x]:n,a[i=a.indexOf(n)]=n=0)|n)-n:120)(16,a=a.flatMap(x=>[...x,0]))

Çevrimiçi deneyin


3
+1 flatMap()
şunun

: DI, golf için ilk kullandığım zamanın bu olduğunu düşünüyorum! İlgi duymadığım (ve buna geri döndüğümde bana bir hedef vermek için), denediğinizde puanınız neydi?
Shaggy

Bugün buna geri dönmek için bir dakika alamadım. Umarım bu, yarın tamamen taze gözlerle başlayabileceğim anlamına gelir.
Shaggy,

Çözümümü yayınladım.
Arnauld,

5

R , 128 124 123 112 110 bayt

function(r){r=rbind(0,cbind(0,r,0),0)
m=r>15
while(r[m]){r[m]=0
m=r==max(r[which(m)+c(7:5,1)%o%-1:1])}
sum(r)}

Çevrimiçi deneyin!

4x4 matris yaratır (bu da bir şeyleri görselleştirmeme yardım eder), 0'larla doldurur, sonra 16'dan başlar ve bir sonraki en büyükler için etrafındaki "yığınları" arar.

Sonuç üzerine, bir uyarı çıkarır, ancak sonucu yoktur ve sonucu değiştirmez.

EDIT: -4 bayt matrisin ilklendirmesini 1 satıra sıkıştırarak.

EDIT: -1 Robert Hacken sayesinde

EDIT: -13 bayt Giuseppe ve Robin Ryder'ın önerilerini birleştiriyor.


Sen bir byte değiştirerek kaydedebilirsiniz r==16için r>15.
Robert Hacken

1
117 bayt - bir matris alarak bir işleve değiştirin ve ile bazı takma işlemler yapın which.
Giuseppe

2
@Giuseppe'nin önerilerini geliştiren 112 bayt : mbir tamsayı yerine mantıksal olarak saklayabilirsiniz ve bu nedenle sadece whichiki kez yerine bir kez aramanız gerekir .
Robin Ryder

@RobinRyder golfünü kullanan 110 bayt ve mahalle komşu matrisini sıkıştırmakla uğraşıyor.
Giuseppe

1
@ Sumner18 X%o%Ybir takma addır outer(X,Y,'*'). outerOctave / MATLAB / MATL'ın aribtrary (vectorized) operatörleri ile "yayın" özelliği olarak işlev görebildiği için en kapsamlı fonksiyonlardan biridir. Buraya bakınız ; nadir durumlarda da kullanışlıdır, kroneckero sayfada bağlantılıdır.
Giuseppe

4

Kömür , 47 bayt

EA⭆ι§αλ≔QθW›θA«≔⌕KAθθJ﹪θ⁴÷θ⁴≔⌈KMθA»≔ΣEKA⌕αιθ⎚Iθ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

EA⭆ι§αλ

Giriş numaralarını alfabetik karakterlere (A = 0 .. Q = 16) dönüştürün ve bunları 4x4 ızgarası olarak yazdırın.

≔Qθ

Q yiyerek başlayın, yani 16.

W›θA«

Yiyecek bir şeyler varken tekrarlayın.

≔⌕KAθθ

Kazık nerede olduğunu bulun. Bu, satır ana düzenindeki doğrusal bir görünümdür.

J﹪θ⁴÷θ⁴

Koordinatlara dönüştür ve o konuma atla.

≔⌈KMθ

En büyük bitişik yığını bulun.

Mevcut yığını ye.

≔ΣEKA⌕αιθ

Kazıkları tamsayılara geri dönüştürün ve toplamı alın.

⎚Iθ

Tuvali temizleyin ve sonucu çıkartın.


3

Powershell, 143 141 136 130 122 121 bayt

$a=,0*5+($args|%{$_+0})
for($n=16;$i=$a.IndexOf($n)){$a[$i]=0
$n=(-1,1+-6..-4+4..6|%{$a[$i+$_]}|sort)[-1]}$a|%{$s+=$_}
$s

Daha az golf oynadığı test senaryosu:

$f = {

$a=,0*5+($args|%{$_+0})
for($n=16;$i=$a.IndexOf($n)){
    $a[$i]=0
    $n=(-1,1+-6..-4+4..6|%{$a[$i+$_]}|sort)[-1]
}
$a|%{$s+=$_}
$s

}

@(
    ,( 0  , ( 4,  3,  2,  1), ( 5,  6,  7,  8), (12, 11, 10,  9), (13, 14, 15, 16) )
    ,( 0  , ( 8,  1,  9, 14), (11,  6,  5, 16), (13, 15,  2,  7), (10,  3, 12,  4) )
    ,( 1  , ( 1,  2,  3,  4), ( 5,  6,  7,  8), ( 9, 10, 11, 12), (13, 14, 15, 16) )
    ,( 3  , (10, 15, 14, 11), ( 9,  3,  1,  7), (13,  5, 12,  6), ( 2,  8,  4, 16) )
    ,( 12 , ( 3,  7, 10,  5), ( 6,  8, 12, 13), (15,  9, 11,  4), (14,  1, 16,  2) )
    ,( 34 , ( 8,  9,  3,  6), (13, 11,  7, 15), (12, 10, 16,  2), ( 4, 14,  1,  5) )
    ,( 51 , ( 8, 11, 12,  9), (14,  5, 10, 16), ( 7,  3,  1,  6), (13,  4,  2, 15) )
    ,( 78 , (13, 14,  1,  2), (16, 15,  3,  4), ( 5,  6,  7,  8), ( 9, 10, 11, 12) )
    ,( 102, ( 9, 10, 11, 12), ( 1,  2,  4, 13), ( 7,  8,  5, 14), ( 3, 16,  6, 15) )
    ,( 103, ( 9, 10, 11, 12), ( 1,  2,  7, 13), ( 6, 16,  4, 14), ( 3,  8,  5, 15) )
) | % {
    $expected, $a = $_
    $result = &$f @a
    "$($result-eq$expected): $result"
}

Çıktı:

True: 0
True: 0
True: 1
True: 3
True: 12
True: 34
True: 51
True: 78
True: 102
True: 103

Açıklama:

İlk önce 0'ın üst ve alt kenarlıklarını ekleyin ve tek boyutlu bir dizi yapın:

0 0 0 0 0
# # # # 0
# # # # 0
# # # # 0
# # # # 0

     ↓

0 0 0 0 0 # # # # 0 # # # # 0 # # # # 0 # # # # 0

$nullDizinin sonunun arkasındaki değeri almaya çalışırsanız, Powershell döner .

İkincisi , döngü biggest neighbor pile16'dan sıfır olmayan maksimum'a başladı. Ve onu geçersiz kılın (Hungry Mouse onu yiyor).

for($n=16;$i=$a.IndexOf($n)){
    $a[$i]=0
    $n=(-1,1+-6..-4+4..6|%{$a[$i+$_]}|sort)[-1]
}

Üçüncüsü , kalan yığınların toplamı.


3

SAS, 236 219 bayt

Delme kartlarına giriş, her ızgara için bir satır (boşlukla ayrılmış), çıkış günlüğe yazdırılmış.

Bu zorluk, SAS’taki bazı dizilerdeki sınırlamalar nedeniyle biraz karmaşıktır:

  • Eşleşen bir öğenin satır ve sütun dizinlerini çok boyutlu veri adım dizisinden döndürmenin bir yolu yoktur - diziyi 1-d olarak değerlendirmeniz ve sonra kendiniz için çalışmanız gerekir.
  • Sınırların dışına çıkarsanız, SAS bir hata verir ve boş / sıfır döndürmek yerine işlemi durdurur.

Güncellemeler:

  • Kaldırılan infile cards;ifade (-13)
  • a:Dizi tanımında a1-a16(-4) yerine joker karakter kullanılır

golfed:

data;input a1-a16;array a[4,4]a:;p=16;t=136;do while(p);m=whichn(p,of a:);t=t-p;j=mod(m-1,4)+1;i=ceil(m/4);a[i,j]=0;p=0;do k=max(1,i-1)to min(i+1,4);do l=max(1,j-1)to min(j+1,4);p=max(p,a[k,l]);end;end;end;put t;cards;
    <insert punch cards here>
    ; 

Ungolfed:

data;                /*Produce a dataset using automatic naming*/
input a1-a16;        /*Read 16 variables*/
array a[4,4] a:;     /*Assign to a 4x4 array*/
p=16;                /*Initial pile to look for*/
t=136;               /*Total cheese to decrement*/
do while(p);         /*Stop if there are no piles available with size > 0*/
  m=whichn(p,of a:); /*Find array element containing current pile size*/
  t=t-p;             /*Decrement total cheese*/
  j=mod(m-1,4)+1;    /*Get column number*/
  i=ceil(m/4);       /*Get row number*/
  a[i,j]=0;          /*Eat the current pile*/
                     /*Find the size of the largest adjacent pile*/
  p=0;
  do k=max(1,i-1)to min(i+1,4);
    do l=max(1,j-1)to min(j+1,4);
      p=max(p,a[k,l]);
    end;
  end;
end;
put t;              /*Print total remaining cheese to log*/
                    /*Start of punch card input*/
cards; 
  4  3  2  1  5  6  7  8 12 11 10  9 13 14 15 16 
  8  1  9 14 11  6  5 16 13 15  2  7 10  3 12  4 
  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 
 10 15 14 11  9  3  1  7 13  5 12  6  2  8  4 16 
  3  7 10  5  6  8 12 13 15  9 11  4 14  1 16  2 
  8  9  3  6 13 11  7 15 12 10 16  2  4 14  1  5 
  8 11 12  9 14  5 10 16  7  3  1  6 13  4  2 15 
 13 14  1  2 16 15  3  4  5  6  7  8  9 10 11 12 
  9 10 11 12  1  2  4 13  7  8  5 14  3 16  6 15 
  9 10 11 12  1  2  7 13  6 16  4 14  3  8  5 15 
;                    /*End of punch card input*/
                     /*Implicit run;*/

1
PPCG'de delikli kart kullanımı için +1 :)
GNiklasch

3

Haskell , 163 bayt

o f=foldl1 f.concat
r=[0..3]
q n=take(min(n+2)3).drop(n-1)
0#m=m
v#m=[o max$q y$q x<$>n|y<-r,x<-r,m!!y!!x==v]!!0#n where n=map(z<$>)m;z w|w==v=0|0<1=w
f=o(+).(16#)

Çevrimiçi deneyin!

fFonksiyon 4 tamsayılar 4 listelerin listesi olarak girdi alır.

Biraz ungolfed

-- helper to fold over the matrix
o f = foldl1 f . concat

-- range of indices
r = [0 .. 3]

-- slice a list (take the neighborhood of a given coordinate)
-- first we drop everything before the neighborhood and then take the neighborhood itself
q n = take (min (n + 2) 3) . drop (n - 1)

-- a step function
0 # m = m -- if the max value of the previous step is zero, return the map
v # m = 
    -- abuse list comprehension to find the current value in the map
    -- convert the found value to its neighborhood,
    -- then calculate the max cell value in it
    -- and finally take the head of the resulting list
    [ o max (q y (q x<$>n)) | y <- r, x <- r, m!!y!!x == v] !! 0 
       # n -- recurse with our new current value and new map
    where 
        -- a new map with the zero put in place of the value the mouse currently sits on 
        n = map (zero <$>) m
        -- this function returns zero if its argument is equal to v
        -- and original argument value otherwise
        zero w 
            | w == v = 0
            | otherwise = w

-- THE function. first apply the step function to incoming map,
-- then compute sum of its cells
f = o (+) . (16 #)

3

JavaScript (ES7), 97 bayt

Düzleştirilmiş bir dizi olarak girdi alır.

f=(a,s=p=136,m,d)=>a.map((v,n)=>v<m|(n%4-p%4)**2+(n-p)**2/9>d||(q=n,m=v))|m?f(a,s-m,a[p=q]=0,4):s

Çevrimiçi deneyin!

Yorumlananlar

f = (                    // f= recursive function taking:
  a,                     // - a[] = flattened input array
  s =                    // - s = sum of cheese piles, initialized to 1 + 2 + .. + 16 = 136
      p = 136,           // - p = position of the mouse, initially outside the board
  m,                     // - m = maximum pile, initially undefined
  d                      // - d = distance threshold, initially undefined
) =>                     // 
  a.map((v, n) =>        // for each pile v at position n in a[]:
    v < m |              //   unless this pile is not better than the current maximum
    (n % 4 - p % 4) ** 2 //   or (n % 4 - p % 4)²
    + (n - p) ** 2 / 9   //      + (n - p)² / 9
    > d ||               //   is greater than the distance threshold:
    (q = n, m = v)       //     update m to v and q to n
  )                      // end of map()
  | m ?                  // if we've found a new pile to eat:
    f(                   //   do a recursive call:
      a,                 //     pass a[] unchanged
      s - m,             //     update s by subtracting the pile we've just eaten
      a[p = q] = 0,      //     clear a[q], update p to q and set m = 0
      4                  //     use d = 4 for all next iterations
    )                    //   end of recursive call
  :                      // else:
    s                    //   stop recursion and return s

Evet, buna asla yakın bir yere asla sahip olamazdım!
Shaggy


3

Java 10, 272 248 bayt

m->{int r=0,c=0,R=4,C,M=1,x,y,X=0,Y=0;for(;R-->0;)for(C=4;C-->0;)if(m[R][C]>15)m[r=R][c=C]=0;for(;M!=0;m[r=X][c=Y]=0)for(M=-1,C=9;C-->0;)try{if((R=m[x=r+C/3-1][y=c+C%3-1])>M){M=R;X=x;Y=y;}}catch(Exception e){}for(var Z:m)for(int z:Z)M+=z;return M;}

Hücreler , tüm Sekizler yarışmasına verdiğim yanıttakiyle aynı olarak kontrol edildi . @ OlivierGrégoire
sayesinde -24 bayt .

Çevrimiçi deneyin.

Açıklama:

m->{                       // Method with integer-matrix parameter and integer return-type
  int r=0,                 //  Row-coordinate for the largest number, starting at 0
      c=0,                 //  Column-coordinate for the largest number, starting at 0
      R=4,C,               //  Row and column indices (later reused as temp integers)
      M=1,                 //  Largest number the mouse just ate, starting at 1
      x,y,X=0,Y=0;         //  Temp integers
  for(;R-->0;)             //  Loop `R` in the range (4, 0]:
    for(C=4;C-->0;)        //   Inner loop `C` in the range (4, 0]:
      if(m[R][C]>15)       //    If the current cell is 16:
        m[r=R][c=C]        //     Set `r,c` to this coordinate
          =0;              //     And empty this cell
  for(;M!=0;               //  Loop as long as the largest number isn't 0:
      ;                    //    After every iteration:
       m[r=X][c=Y]         //     Change the `r,c` coordinates,
         =0)               //     And empty this cell
    for(M=-1,              //   Reset `M` to -1
        C=9;C-->0;)        //   Inner loop `C` in the range (9, 0]:
          try{if((R=       //    Set `R` to:
            m[x=r+C/3-1]   //     If `C` is 0, 1, or 2: Look at the previous row
                           //     Else-if `C` is 6, 7, or 8: Look at the next row
                           //     Else (`C` is 3, 4, or 5): Look at the current row
             [y=c+C%3-1])  //     If `C` is 0, 3, or 6: Look at the previous column
                           //     Else-if `C` is 2, 5, or 8: Look at the next column
                           //     Else (`C` is 1, 4, or 7): Look at the current column
               >M){        //    And if the number in this cell is larger than `M`
                 M=R;      //     Change `M` to this number
                 X=x;Y=y;} //     And change the `X,Y` coordinate to this cell
          }catch(Exception e){}
                           //    Catch and ignore ArrayIndexOutOfBoundsExceptions
                           //    (try-catch saves bytes in comparison to if-checks)
  for(var Z:m)             //  Then loop over all rows of the matrix:
    for(int z:Z)           //   Inner loop over all columns of the matrix:
      M+=z;                //    And sum them all together in `M` (which was 0)
  return M;}               //  Then return this sum as result

int r = c = X = Y = 0, R = 4, M = 1, x, y; ?
Serverfrog

@Serverfrog Korkarım Java değişkenlerini bildirirken bu mümkün değil. Öneriniz bana kullanarak int r,c,R=4,M=1,x,y,X,Y;for(r=c=X=Y=0;, ancak, bir bayt kurtarmak için bir fikir verdi . :)
Kevin Cruijssen

1

J, 82 bayt

g=.](]*{:@[~:])]_1}~[:>./]{~((,-)1 5 6 7)+]i.{:
[:+/[:(g^:_)16,~[:,0,~0,0,0,.~0,.]

Çevrimiçi deneyin!

Bunu daha yarın golf planı ve belki buna benzer daha J-imsi çözüm yazma biri , ama ben bunu daha önce yapmamıştı beri düzleştirilmiş yaklaşım deneyin düşündüm.


Gerçekten en soldaki ihtiyaç mı ]içinde g?
Galen Ivanov

1
Sağol Galen, haklısın. Bu kodla ilgili sorunların en küçüğüdür :) Zamanım olduğunda uygulayacağım çok daha iyi bir çözümüm var.
Jonah

1

Kırmızı , 277 bayt

func[a][k: 16 until[t:(index? find load form a k)- 1
p: do rejoin[t / 4 + 1"x"t % 4 + 1]a/(p/1)/(p/2): 0
m: 0 foreach d[-1 0x-1 1x-1 -1x0 1x0 -1x1 0x1 1][j: p + d
if all[j/1 > 0 j/1 < 5 j/2 > 0 j/2 < 5 m < t: a/(j/1)/(j/2)][m: t]]0 = k: m]s: 0
foreach n load form a[s: s + n]s]

Çevrimiçi deneyin!

Çok uzun bir çözüm ve bundan memnun değilim, ancak TIO'da çalışmasını sağlamak için çok fazla zaman harcadım (görünüşe göre Red'in Win ve Linux sürümleri arasında çok fazla fark var), bu yüzden yine de gönderdim ...

Daha okunabilir:

f: func [ a ] [
    k: 16
    until [
        t: (index? find load form a n) - 1
        p: do rejoin [ t / 4 + 1 "x" t % 4 + 1 ]
        a/(p/1)/(p/2): 0
        m: 0
        foreach d [ -1 0x-1 1x-1 -1x0 1x0 -1x1 0x1 1 ] [
            j: p + d
            if all[ j/1 > 0
                    j/1 < 5
                    j/2 > 0
                    j/2 < 5 
                    m < t: a/(j/1)/(j/2)
            ] [ m: t ]
        ]
        0 = k: m
    ]
    s: 0
    foreach n load form a [ s: s + n ]
    s
]

1

Jöle ,  31 30  29 bayt

³œiⱮZIỊȦ
⁴ṖŒPŒ!€Ẏ⁴;ⱮṢÇƇṪ
FḟÇS

Bu yöntem, 60'lı yılların içinde çalışmaya başlayamayacak kadar yavaş olduğu için fareyi başlattıktan sonra 16onu başlatır 9ve sadece 9veya daha azını yiyebilecek şekilde yeteneğini sınırlar. Çevrimiçi deneyin! (böylece burada 9, 2, 7, 4, 8, 6, 3ayrılmayı yiyor 97).

Nasıl?

³œiⱮZIỊȦ - Link 1, isSatisfactory?: list of integers, possiblePileChoice
³        - (using a left argument of) program's 3rd command line argument (M)
   Ɱ     - map across (possiblePileChoice) with:
 œi      -   first multi-dimensional index of (the item) in (M)
    Z    - transpose the resulting list of [row, column] values
     I   - get the incremental differences
      Ị  - insignificant? (vectorises an abs(v) <= 1 test)
       Ȧ - any and all? (0 if any 0s are present in the flattened result [or if it's empty])

⁴ṖŒPŒ!€Ẏ⁴;ⱮṢÇƇṪ - Link 2, getChosenPileList: list of lists of integers, M
⁴               - literal 16
 Ṗ              - pop -> [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
  ŒP            - power-set -> [[],[1],[2],...,[1,2],[1,3],...,[2,3,7],...,[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]]
      €         - for each:
    Œ!          -   all permutations
       Ẏ        - tighten (to a single list of all these individual permutations)
        ⁴       - (using a left argument of) literal 16
          Ɱ     - map across it with:
         ;      -   concatenate (put a 16 at the beginning of each one)
           Ṣ    - sort the resulting list of lists
             Ƈ  - filter keep those for which this is truthy:
            Ç   -   call last Link as a monad (i.e. isSatisfactory(possiblePileChoice)
              Ṫ - tail (get the right-most, i.e. the maximal satisfactory one)

FḟÇS - Main Link: list of lists of integers, M
F    - flatten M
  Ç  - call last Link (2) as a monad (i.e. get getChosenPileList(M))
 ḟ   - filter discard (the resulting values) from (the flattened M)
   S - sum

Ah evet, güç seti yeterli değil!
Jonathan Allan,

2
@Arnauld - nihayet golf oynamak için biraz zaman aldı: D Bu işe yaramalı, ancak daha önce kullandığınız test durumuyla birlikte TIO'da çalışmak için çok yavaş olacak.
Jonathan Allan,

Aşağı oy veren, lütfen biraz geri bildirim verebilir mi? Bu çalışıyor, tam ve net bir açıklaması var ve aynı zamanda şu anda en kısa giriş.
Jonathan Allan

Ben oyumu yükselttim, ancak bu cevabın O ((n ^ 2)!) 'Sini verdim, meydan okumanın polinom zamanını almasını isterdim.
lirtosiast

1

En iyi işim değil. Yapılması gereken bazı kesin iyileştirmeler var, bazıları muhtemelen kullanılan algoritmanın temelini oluşturuyor - yalnızca bir kullanarak daha da geliştirilebileceğinden eminim int[], ancak bu şekilde komşuları nasıl verimli şekilde sıralayacağımı bulamadım. Sadece tek boyutlu bir dizi kullanan bir PowerShell çözümü görmek isterdim!

PowerShell Çekirdek , 348 bayt

Function F($o){$t=120;$a=@{-1=,0*4;4=,0*4};0..3|%{$a[$_]=[int[]](-join$o[(3+18*$_)..(3+18*$_+13)]-split',')+,0};$m=16;while($m-gt0){0..3|%{$i=$_;0..3|%{if($a[$i][$_]-eq$m){$r=$i;$c=$_}}};$m=($a[$r-1][$c-1],$a[$r-1][$c],$a[$r-1][$c+1],$a[$r][$c+1],$a[$r][$c-1],$a[$r+1][$c-1],$a[$r+1][$c],$a[$r+1][$c+1]|Measure -Max).Maximum;$t-=$m;$a[$r][$c]=0}$t}

Çevrimiçi deneyin!


Daha okunabilir sürüm:

Function F($o){
    $t=120;
    $a=@{-1=,0*4;4=,0*4};
    0..3|%{$a[$_]=[int[]](-join$o[(3+18*$_)..(3+18*$_+13)]-split',')+,0};
    $m=16;
    while($m-gt0){
        0..3|%{$i=$_;0..3|%{if($a[$i][$_]-eq$m){$r=$i;$c=$_}}};
        $m=($a[$r-1][$c-1],$a[$r-1][$c],$a[$r-1][$c+1],$a[$r][$c+1],$a[$r][$c-1],$a[$r+1][$c-1],$a[$r+1][$c],$a[$r+1][$c+1]|Measure -Max).Maximum;
        $t-=$m;
        $a[$r][$c]=0
    }
    $t
}


Evet, fark ettim ki garip olan şey PSv5'te çalışmak (array|sort)[-1]yerine bunun yerine Measure -maxdenemenin yanlış sonuç almasıydı. Neden hiçbir fikrim yok.
Veskah

Evet, bu garip. Üzerinde test ettim (0..10|sort)[-1]ancak PSv5'te 10 ancak PS Core'da 9 döndürdü. Bunun nedeni, sayısal yerine, sözlükbilimsel sırayla davranmasıdır. Utanç.
Jeff Freeman,

Klasik Microsoft önemli şeyleri değiştiriyor.
Veskah

Bu davaya katılıyorum. Neden PS Core Sort'un bir int32 dizisini bir dizi dizisine attığından emin değilim. Ama, bu bir ranta sapıyor, bu yüzden dalmaya başlayacağım. Yeniden yapılanma için teşekkürler!
Jeff Freeman,

1

C (gcc), 250 bayt

x;y;i;b;R;C;
g(int a[][4],int X,int Y){b=a[Y][X]=0;for(x=-1;x<2;++x)for(y=-1;y<2;++y)if(!(x+X&~3||y+Y&~3||a[y+Y][x+X]<b))b=a[C=Y+y][R=X+x];for(i=x=0;i<16;++i)x+=a[0][i];return b?g(a,R,C):x;}
s(int*a){for(i=0;i<16;++i)if(a[i]==16)return g(a,i%4,i/4);}

Çevrimiçi deneyin!

Not: Bu gönderim giriş dizisini değiştirir.

s()Bir değişkenin argümanı ile çağrılacak işlev int[16](bu, ile aynı bellekte int[4][4]olan, g()onu yorumlayan şey).

s()16dizideki yerini bulur , sonra gbir konum alan özyinelemeli bir işlev olan bu bilgiyi iletir ve o konumdaki sayıyı 0 olarak ayarlar ve sonra:

  • Yanında pozitif bir sayı varsa, en büyük bitişik sayının konumu ile tekrarlayın

  • Aksi halde dizideki sayıların toplamını döndür.


s(int*a){for(i=0;a[i]<16;++i);return g(a,i%4,i/4);}
RiaD

g yenen miktarını verirse, içindeki toplamı hesaplamanıza gerek kalmaz. Sadece s sonunda 16 * 17/2-g ()
döndürün

bitsel kullanabilir ya da mantıklıysanız veya?
RiaD



1

++ , 281 bayt ekle

D,f,@@,VBFB]G€=dbLRz€¦*bMd1_4/i1+$4%B]4 4b[$z€¦o
D,g,@@,c2112011022200200BD1€Ω_2$TAVb]8*z€kþbNG€lbM
D,k,@~,z€¦+d4€>¦+$d1€<¦+$@+!*
D,l,@@#,bUV1_$:G1_$:
D,h,@@,{l}A$bUV1_$:$VbU","jG$t0€obU0j","$t€iA$bUpVdbLRG€=€!z€¦*$b]4*$z€¦o
y:?
m:16
t:120
Wm,`x,$f>y>m,`m,$g>x>y,`y,$h>x>y,`t,-m
Ot

Çevrimiçi deneyin!

Oof, bu karmaşık bir şey.

Tüm test durumlarını doğrulayın

Nasıl çalışır

Bu açıklama için girişi kullanacağız.

M=[37105681213159114141162]

x1x16M4x4

  • f(x,M)4x4xMx=16Mf(x,M)=(4,3)

  • g(M,y)f(x,M)g(M,f(x,M))=11

    Bu iki yardımcı işlevi uygular:

    k(x)

    l(M,y)

  • h(y,M)0

016120(1+2++14+15)

0

0

  • f(y,m)16Mx:=(4,3)
  • g(x,y)0
  • h(x,y)160
  • tm

Son olarak, çıktı t , yani kalan, toplanmamış değerler.


1

C # (.NET Core) , 258 bayt

LINQ olmadan. System.Collections.Generic kullanarak biçimlendirme içindir - fonksiyon gerektirmez.

e=>{int a=0,b=0,x=0,y=0,j=0,k;foreach(int p in e){if(p>15){a=x=j/4;b=y=j%4;}j++;}e[x,y]=0;while(1>0){for(j=-1;j<2;j++)for(k=-1;k<2;k++){try{if(e[a+k,b+j]>e[x,y]){x=a+k;y=b+j;}}catch{}}if(e[x,y]<1)break;e[x,y]=0;a=x;b=y;}a=0;foreach(int p in e)a+=p;return a;}

Çevrimiçi deneyin!


1

Perl 6 , 151 136 126 125 119 bayt

{my@k=$_;my $a=.grep(16,:k)[0];while @k[$a] {@k[$a]=0;$a=^@k .grep({2>$a+>2-$_+>2&$a%4-$_%4>-2}).max({@k[$_]})};[+] @k}

Süper eski püskü bir çözüm. Düzleştirilmiş dizi olarak girdi alır.

Çevrimiçi deneyin!


1

Perl 5 -MList::Util=sum -p , 137 bayt

splice@F,$_,0,0for 12,8,4;map{$k{++$,}=$_;$n=$,if$_&16}@F;map{map{$n=$_+$"if$k{$"+$_}>$k{$n}&&!/2|3/}-6..6;$k{$"=$n}=0}@F;$_=sum values%k

Çevrimiçi deneyin!


1

K (ngn / k) , 49 bayt

{{h[,x]:0;*>(+x+0,'1-!3 3)#h}\*>h::(+!4 4)!x;+/h}

Çevrimiçi deneyin!

input ( x) 1d dizisidir

(+!4 4)!x kodlayıcı çiftlerini değerleriyle eşleştiren bir sözlük x

h:: global bir değişkene atamak h

*> maksimum değere karşılık gelen anahtar

{ }\ yakınsama kadar tekrarlayın, bir listedeki ara değerleri toplayın

h[,x]:0 geçerli konumu sıfırla

+x+0,'1-!3 3 komşu pozisyonlar

( )#honları hküçük bir sözlük olarak filtrele

*>Hangi komşunun maksimum değeri var? yeni yinelemenin şu anki konumu haline gelir

+/hson olarak, hkalan değerlerin toplamını döndür


1

Wolfram Dili (Mathematica) , 124 115 bayt

(p=#&@@Position[m=Join@@ArrayPad[#,1],16];Do[m[[p]]=0;p=MaximalBy[#&@@p+{0,-1,1,-5,5,-6,6,-7,7},m[[#]]&],16];Tr@m)&

Çevrimiçi deneyin!

Bu, 2B dizi alır, her iki tarafa da doldurur, sonra hemen düzleştirir, böylece bayt indekslemesi yapmak zorunda kalmazız. Bunun tek maliyeti Join@@düzleşmektir. Daha sonra aşağıdaki gibi ilerler.

2B dizi için 124 bayt sürümü : Çevrimiçi deneyin!

Çoğunlukla kendi işim, biraz J42161217'nin 149 baytlık cevabından türetilmiş .

Ungolfed:

(p = #& @@ Position[m = #~ArrayPad~1,16];     m = input padded with a layer of 0s
                                              p = location of 16
Do[
    m = MapAt[0&,m,p];                        Put a 0 at location p
    p = #& @@ MaximalBy[                      Set p to the member of
        p+#& /@ Tuples[{0,-1,1},2],             {all possible next locations}
        m~Extract~#&],                        that maximizes that element of m,
                                              ties broken by staying at p+{0,0}=p.
16];                                        Do this 16 times.
Tr[Tr/@m]                                   Finally, output the sum of m.
)&
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.