Blok Yeniden Düzenleme


14

Yani sizin göreviniz 3x3'lük bir blok almak ve burada -boş alanlar ve *ortalama doldurulmuş boşluklar almak, örneğin:

-**
-*-
*-*

ve bloğu *, aşağıdaki gibi bir X oluşturacak şekilde yeniden düzenleyin :

*-*
-*-
*-*

Giriş: Yukarıdaki gibi 3x3 kareler, 3 satır, bir dizi veya istediğiniz gibi olabilirler.

Çıktı: X'e yeniden düzenlemek için en kısa hareket miktarı. Her hareket, birbirine dokunan ve birbirinden yatay, birbirinden dikey veya birbirinden çapraz olan 2 karakteri çeviriyor. Mümkün değilse, imkansız çıktıları döndürün, örneğin 999veya -4242. 5en küçük sayıdır.

Test Durumları:

1) Çıktı: 1

-**
-*-
*-*

2) Çıktı: -1

-*-
-*-
*-*

3) Çıktı: 3

---
-**
***

4) Çıktı: 0

*-*
-*-
*-*

Boş ve boş olmayan karakterlerin yerine geçebilirsiniz ancak hangisinin yayınınıza hangisini eklediğinizden emin olun

Code Golf

Bu kod golf kısa kod kazanır unutmayın!


1
2 karakteri çevirerek, uzaydan *ve tersine çevirmek mi, yoksa bunları değiştirmek mi istediniz ?
user202729

Beşten fazla varsa ne olur *? Biraz daha test örneği ekleyebilir misiniz?
Stewie Griffin

@ user202729 Örneğin, son 2 karakteri çevirirseniz abc acb olur.
Noah Cristino

@StewieGriffin "mümkün değilse -1 döndürün" 5'ten fazla *veya 5'ten az olması imkansız hale getirir.
Noah Cristino

6
Başka bir şey kullanabilir miyiz -1? Örneğin 5(aksi halde imkansız) veya bir hata mı atıyorsunuz?
Jonathan Allan

Yanıtlar:


12

Python 3 , 104 78 bayt

lambda n:-(sum(n)!=5)or sum(n[1::2])+n[4]*(max(n,n[6:],n[::3],n[2::3])>=[1]*3)

Çevrimiçi deneyin!

Düzenleme: Bayt sayısını önemli ölçüde azaltmak için hem @Jonathan Allan'ın hem de @ xnor'ın önerilerini uyguladı.

Girdi, uzunlukları 9 olan ve uzunlukları s olan bir dizgi listesidir *.

İşte bazı gözlemler:

  • Yıldızları zaten doğru hücreler üzerinde hareket ettirmemiz gerekmez. Yanlış yerleştirilmiş herhangi bir yıldızın aynı anda engellenemeyen 5 çevre hücresi vardır (aksi halde cevap zaten -1'dir).
  • Yanlış yerleştirilen her yıldızın maliyeti 1 veya 2'dir ve yalnızca doğru yerleştirilmiş üç yıldızla çevriliyse 2'dir.
  • Yanlış yerleştirilen her yıldızın maliyeti birbirinden bağımsızdır.

Bu nedenle, önce dizenin beş tane olup olmadığını test ettikten sonra şu şeyleri sayıyoruz:

  • Yanlış yerleştirilmiş yıldız sayısı (= tek endekslerde olanlar)
  • Yanlış maliyet 2 yıldızlı numarası (= hücrelere 0124, 0346, 2458, 4678bütün olanlar olmak üzere)
    • Faktör bir n[4]olmak ve sonra her aralık ekstraksiyon varlık test edin '111'.
    • Böyle bir yıldız en fazla bir yıldız olduğundan, maxyerine güvenle kullanabiliriz sum.

Bir dize yerine bir listesini kabul (değiştirerek 17 bayt kaydet countile s sums ve '111'birlikte [1]*3) TIO (Ben zeki olmaya çalışıyorum n[i::j]>=[1]*3döngü ama daha kısa bulamadım).
Jonathan Allan

Sadece bir maliyet-2 yıldız olabileceğinden, yapabileceğiniz gibi görünüyor max(n,n[6:],n[::3],n[2::3])>='1'*3.
xnor

Maliyet-2 yıldıza sahip başka düzenlemeler de var. Bence [0,1,1,1,1,0,1,0,0] 2 yerine 3 döndürmelidir.
RootTwo

Ayrıca, 2 yerine [1,1,1,1,0,0,1,0,0] 3 olmalıdır.
RootTwo

Ayrıca, 2 yerine [1,1,1,1,0,0,1,0,0] 3 olmalıdır.
RootTwo

4

Jöle , 26 bayt

5ḶḤd3ạŒ!Ṁ€€ḅ1Ṃ
T’d3Ç-L=5Ɗ?

Çevrimiçi deneyin!


Girdi olarak düz bir liste alın.

Jelly'in "çok boyutlu doğruluk indeksleri" olmaması çok kötü ... T€ṭ€"JẎaynı zamanda işe yarıyor ama 1 bayt daha alıyor.


Algoritma: 5 geçerli blok konumu ve 5 hedef (hedef) vardır, algoritma 5'in her birini dener! eşleştirme ve [kaynak, hedef] Chebyshev mesafesinin minimum toplamını çıktı.


Düz bir liste ("istediğiniz gibi") alabilirsiniz ... belki 0 tabanlı indeksler alabilir ve 24 olabilir?
Jonathan Allan

4

Haskell , 176 132 126 104 bayt

w=0:1:w
m a|sum a/=5=5|1>0=sum$[a!!4|3<-sum.map(a!!)<$>[[0,1,2],[0,3,6],[2,5,8],[6,7,8]]]++zipWith(*)a w

Çevrimiçi deneyin!


Boş olmayan karakter olarak 1 ile tamsayıların listesini alır. Sıfır olmayan çift dizinli karelerin sayısını toplar, ardından çift hareket desenlerinden herhangi biri bulunursa 1 ekler (orta kare ve kenar sütun / satır tamamen dolu). Son bölüm biraz savurgan, bence bu kaba kuvvet yöntemine göre çok daha iyi olabilirdi. İmkansız bir girdide 5 (imkansız çıktı) döndürür.


2
Bazı ipuçları: lengthtest kısaltılabilir sum[1|1<-a]. Fonksiyonu s: (1-e,n+sum[1|b>e])başka bir bayt kaydetmek için satır içi yapabilirsiniz. Sen kullanabilirsiniz otherwisebekçi içinde mçifti kurtarmak için (). Son olarak, &&en üst düzeyde bir nöbetçi ile değiştirilebilir ,. ...
nimi

2
sumBir Boole değerini int'e atmak için listedeki bir anlama öğesini kullanarak başka bir bayt kaydedebilirsiniz . Çevrimiçi deneyin!
Rock Garf Hunter Post

2
Aslında birkaç bayt tasarruf edebilirsiniz, çünkü desen korumaları gittikten sonra her şeyi yukarı taşıyabilirsiniz m. Çevrimiçi deneyin!
Rock Garf Hunter Post

2
Ayrıca her sigara 1 eleman beri aolmalıdır 0kullandığınız edemez sum ayerine sum[1|1<-a]? Çevrimiçi deneyin!
Rock Garf Hunter Post

1
Tüm 1'den fazla yan olamaz çünkü farkına vardım 1merkezidir sürece s 0, yapabileceğiniz 3<-yerine elem 3$. Ayrıca sum.map(a!!)yerine kullanabilirsiniz sum<$>map(a!!).
Post Rock Garf Hunter

3

Python 2 , 194192 bayt

from itertools import*
f=lambda l,k=0:-(sum(l)!=5)or[1,0]*4!=l[:-1]and k<4and-~min(f(l[:a]+[l[b]]+l[a+1:b]+[l[a]]+l[b+1:],k+1)for a,b in combinations(range(9),2)if max(b/3-a/3,abs(a%3-b%3))<2)

Çevrimiçi deneyin!


1
İle çalışmıyor [0,1,0,1,0,1,1,1,0](beklenen: 4, gerçek: 13).
Bubbler

@Bubbler düzelttim
ovs

3

JavaScript (ES6), 123 bayt

Girişi 9 bitlik bir tamsayı olarak alır. En kısa yaklaşım olmadığı kanıtlanmış kuralları naif olarak uygulayarak bulmacayı çözer.

f=(n,k=b=-1)=>n^341?k>2?b:[3,6,9,10,17,18,20,34,36].map(m=>[1,8,8].map(M=>(x=n&(m*=M))&-x^x||f(n^m,k+1)))|b:!~b|k<b?b=k+1:b

Çevrimiçi deneyin!

Yorumlananlar

f = (                           // f = recursive function taking:
  n,                            //   n = input
  k =                           //   k = number of moves, initialized to -1
  b = -1                        //   b = best result so far, initialized to -1
) =>                            //
  n ^ 341 ?                     // if n does not match the target pattern:
    k > 2 ?                     //   if we've already done more than 3 moves:
      b                         //     we're not going to find a solution -> abort
    :                           //   else:
      [3,6,9,10,17,18,20,34,36] //     for each swap bitmask m
      .map(m =>                 //     and
      [1,8,8]                   //     for each multiplier M:
      .map(M =>                 //       apply the multiplier to m and
        (x = n & (m *= M))      //       apply the final bitmask to n -> this gives x
        & -x                    //       isolate the least significant bit of x
        ^ x ||                  //       if it's the only bit set,
        f(n ^ m, k + 1)         //       then swap the bits and make a recursive call
      )) | b                    //     end of both map() loops; return b
  :                             // else:
    !~b | k < b ? b = k + 1 : b //   this is a solution in k+1 moves: update b

Not : Bu kodlar, m 64 ile çarpıldığında kartın üst kısmının ötesinde bazı yasadışı hamleler gerçekleştirir .

Aşağıda 9 temel takas bit maskesi ve hedef desen bulunmaktadır. Sol üst köşe en önemli bittir.

000  000  001  001  010  010  010  100  100     101
011  110  001  010  001  010  100  010  100     010 (341)
(3)  (6)  (9)  (10) (17) (18) (20) (34) (36)    101

Test için bir hexdump bağlayabilir misiniz? Ayrıca, JS'de 9 bit tam sayıların mümkün olduğunu bilmiyordum
Stan Strum

@StanStrum Daha basit bir kodlamaya sahip daha kısa bir sürüme güncellendi. (Ve evet: JS 32 bite kadar bitsel işlemleri destekliyor.)
Arnauld

2

Jöle , 26 bayt

“ċȤ‘ḤB;U$=a¥;Ḋm2ƊẠ€SɓSn5Nȯ

Çevrimiçi deneyin!

Monadik bir bağlantı.

Nasıl?

Bubbler'ın Python cevabından ilham aldı ; Jelly uygun golf ...

“ċȤ‘ḤB;U$=a¥;Ḋm2ƊẠ€SɓSn5Nȯ - Link: length 9 list of ones & zeros, X
“ċȤ‘                       - list of code-page indices     = [232,154]
    Ḥ                      - double                        = [464,308]
     B                     - to binary     = [[1,1,1,0,1,0,0,0,0],[1,0,0,1,1,0,1,0,0]]
        $                  - last two links as a monad:
       U                   -   upend       = [[0,0,0,0,1,0,1,1,1],[0,0,1,0,1,1,0,0,1]]
      ;                    -   concatenate = [[1,1,1,0,1,0,0,0,0],[1,0,0,1,1,0,1,0,0],[0,0,0,0,1,0,1,1,1],[0,0,1,0,1,1,0,0,1]]
           ¥               - last two links as a dyad:
          a                -   logical AND (vectorises)
         =                 -   equal? (vectorises)
                Ɗ          - last three links as a monad:
             Ḋ             -   dequeue X (remove leftmost element)
               2           -   literal two
              m            -   modulo slice (keeps the "edge-elements") 
            ;              - concatenate
                 Ạ€        - all? for €ach (edge-elements: no-op
                           -                else: 1 for any cost-2 element 0 otherwise)
                   S       - sum
                    ɓ      - new dyadic chain ^that on the right; X on the left
                     S     - sum X
                       5   - literal five
                      n    - not equal?
                        N  - negate (-1 if not exactly 5 1s, 0 otherwise)
                         ȯ - logical OR with right

2

JavaScript, 85 bayt

s=>/^0*(10*){5}$/.test(s)*s.match(/(?=1.(..)*$|^1(..)?11.1|1.11(..)?1$)|$/g).length-1

Bu Bubbler'in cevabının normal bir limanı .

0/1 dizesi olarak girin.


2

Stax , 23 22 bayt

Ç╙╤Ü┤└åVτ┐├Y-²▼░█∩¡3ëâ

Çalıştır ve hata ayıkla

Bu program [0, 1]giriş olarak bir dizi alır ve bir tamsayı hareket sayısı veya çözüm mümkün değilse boş bir dize döndürür.

Izgara için bu endeksleri düşünün

0 1 2
3 4 5
6 7 8
  • 1Girişte tam olarak 5 s yoksa, çözüm yoktur, bu nedenle çıktı üretmeyiz.
  • Her iki tarafın merkezleri yanlış konumlardır. Bunlar indeks 1, 3, 5 ve 7'dir 1. Bu pozisyonlardaki her biri için mesafenin toplanması nihai sonucu verecektir.
  • 1Yanlış konumdaki her biri için mesafesi 1 veya 2'dir 1. Diğer s ile çevrili ise 2 olacaktır . Örneğin, 1[0, 1, 2, 4] indekslerinde s varsa , yanlış için mesafe 12 olur.
  • Bunu göz önünde bulundurarak, sonuca dizin 1 ile katkıda bulunan mesafeyi almak için bu sahte kodu düşünün.

    1. Endekslerden 4 bit [1, 0, 2, 4] okuyun. Bu yanlış konumu en önemli konuma getirir.
    2. Bu bitleri b0 ile 15 arasında bir sayıya dönüştürün .
    3. Zaman 0 <= b <= 7zaman mesafesi 0'dır 8 <= b <= 14zaman mesafesi 1'dir b == 15mesafeden tamsayı bölme kullanılarak hesaplanabilir 2'dir b * 2 / 15.

Böylece toplam mesafe, bu işlemin 4 kez tekrarlanması ve ızgaralar arasında döndürülmesiyle hesaplanabilir.

1#5=4*  if the number of 1s is 5, then 4, else 0
D       repeat the rest of the program that many times
  x     push the value in the x register, which is initially the input
  3/    split into 3 rows
  rM    rotate 90 degrees
  $X    flatten back into single array, and save the "rotated" array in the X register
  A|2E  get the digits of 2^10 i.e. [1,0,2,4]
  @     read the bits from the current rotation at indices [1,0,2,4]
  :b    convert bits to integer
  H15/  double, then divide by 2
  +     add to running total

Bunu çalıştır


Düzenlemeyi kontrol edin, herhangi bir imkansız değer kabul edilir, sadece size yardımcı olursa -1 değil
Noah Cristino

Evet. Bu 2 bayt tasarruf etti.
özyinelemeli

1

Excel, 86 81 Bayt

=SUM(B1,A2,B3,C2)+B2*(AND(A1:A3)+AND(A1:C1)+AND(C1:C3)+AND(A3:C3))/(SUM(A1:C3)=5)

Eski: 'İmkansız' çıktı olduğu zaman-1

=IF(SUM(A1:C3)=5,SUM(B1,A2,B3,C2)+B2*(AND(A1:A3)+AND(A1:C1)+AND(C1:C3)+AND(A3:C3)),-1)

Aralıktaki 1doldurulmuş ve 0boş girişleri kullanır A1:C3. Eğer -1"imkansız" dışında değerleri dönebilir eğer daha golf mümkün. #DIV/0!İmkansız ızgaralarda hata döndürür

Bubbler'ın Python cevabı ile aynı mantıkla çalışır .


Düzenlemeyi kontrol edin, imkansız herhangi bir değer kabul edilir, sadece -1 değil
Noah Cristino
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.