Numpad'ın Şövalye Numaraları


33

Standart bir sayısal tuş takımındaki sıfır olmayan rakamlar için

789
456
123

Bir satranç şövalyesini herhangi bir basamağa yerleştirmeyi ve herhangi bir sayıdaki normal L şeklindeki sıçrama ile hareket ettirerek pozitif bir ondalık tamsayı çizmeyi düşünün . Hangi pozitif tamsayılar bu şekilde ifade edilebilir?

Bunlardan biri 38, şövalye başlayıp 3sola ve yukarı hareket edebildiğinden beri 8. 381ve 383ayrıca mümkündür.

3herhangi bir atlama yapılmazsa buna izin verilir (buna izin verilir). 5aynı zamanda, ancak, hiçbir basamağa ulaşılamaz 5, bu nedenle basamağın 5göründüğü tek sayıdır .

Pozitif ondalık bir tamsayı alan bir program veya işlev yazın (istenirse dizge olarak alabilirsiniz) ve sayı açıklanan şekilde bir sayısal tuş takımındaki bir şövalye tarafından ifade edilebiliyorsa truthy değeri yazdırır veya döndürür , ancak aksi takdirde çıktılar bir falsy değer.

Bayt cinsinden en kısa kod kazanır. Tiebreaker erken cevaptır

Örnekler

Truthy:

1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 18, 38, 61, 81, 294, 349, 381, 383, 729, 767, 38183, 38383, 18349276, 183492761, 618349276

Falsy:

10, 11, 50, 53, 55, 65, 95, 100, 180, 182, 184, 185, 186, 187, 188, 189, 209, 305, 2009, 5030, 3838384, 4838383, 183492760


1
İpucu: Numaraları sarma satırı olarak yazarsanız, şövalye her zaman saat yönünde dört boşluk ya da dört boşluk sayacı olarak atlar. Bunun faydalı olup olmadığını bilmiyorum.
Fon Monica'nın Davası,

3
@LuisMendo Sarma. İçinde olduğu gibi davranırsanız, sonsuz bir liste halinde 78963214, tekrar tekrar tekrarlayın. Mesafeleri say - her zaman dört, biri ya da diğeri. Daha net olmalıydım ve açıkça onu daire şeklinde yazmanız gerektiğini söylemeliydim.
Fon Monica'nın Davası,

@QPaysTaxes Oh, çember demek istediğini sanıyordum ama 123...9. Üzgünüm
Luis Mendo

@LuisMendo Endişelenmeyin. Dediğim gibi, ne demek istediğim konusunda daha net olmalıydım.
Fon Monica'nın Davası,

Yanıtlar:


16

Jöle, 19 15 14 bayt

Doȷ’d3ạ2\P€=2P

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

Nasıl çalışır

Doȷ’d3ạ2\P€=2P  Main link. Argument: n (integer)

D               Convert n to base 10 (digit array).
  ȷ             Yield 1000.
 o              Logical OR. This replaces each 0 with 1000.
   ’            Decrement each digit.
    d3          Divmod; replace each digit k with [k:3, k%3].
      ạ2\       Pairwise reduce by absolute difference.
                For each pair of adjacent digits [i, j], this computes
                [abs(i:3 - j:3), abs(i%3 - j%3)].
         P€     Compute the product of each result.
                n is a Numpad's Knight Number iff all products yield 2.
           =2   Compare each product with 2.
             P  Multiply the resulting Booleans.

18

Python 2, 52 bayt

f=lambda n:n<6or`n%100`in'18349276167294381'*f(n/10)

Ardışık iki basamağın dizede olduğunu kontrol eder '18349276167294381'. Yapmak yerine art arda basamak almak için zip(`n`,`n`[1:]), işlev son iki basamağı tekrar tekrar kontrol eder ve son basamağı kaldırır.


13

Retina , 58 40 bayt

Bu fikri önerdiği için Sp3000'e teşekkürler:

M&!`..
O%`.
A`16|18|27|29|34|38|49|67
^$

Çevrimiçi deneyin! (Test takımının tamamını bir kerede çalıştırmak için hafifçe değiştirilmiş.)

1Truthy ve 0sahte sonuçlar için yazdırır .

açıklama

M&!`..

Üst üste binen tüm eşleşmeleri .., yani tüm ardışık basamak çiftlerini bulun ve satır beslemeleri ile birleştirin.

O%`.

Her satırdaki basamakları sıralayın, böylece yalnızca yarısı kadar çift kontrol etmemiz gerekir.

A`16|18|27|29|34|38|49|67

Geçerli bir harekete karşılık gelen tüm satırları kaldırın.

^$

Bu regex'in kibritlerini say. Diğer bir deyişle, tüm satırlar kaldırılmışsa, bu sonuç boş dizgeyle bir kez eşleşir, aksi takdirde eşleşemez ve bunun yerine sıfır verir.



7

Ruby, 57 bayt

Anonim işlev Argüman bir dizedir.

->n{(0..n.size).count{|i|!"16729438183492761"[n[i,2]]}<1}

Test paketi ile programlayın:

f=->n{(0..n.size).count{|i|!"16729438183492761"[n[i,2]]}<1}

a=%w{1 2 3 4 5 6 7 8 9 16 18 38 61 81 294 349 381 383 729 767 38183 38383 18349276 183492761 618349276
10 11 50 53 55 65 95 100 180 182 184 185 186 187 188 189 209 305 2009 5030 3838384 4838383 183492760}

a.each {|e|p [e, f[e]]}

Tüm muhtemel şövalye hareketlerini bir dizgeye kodladım ve girdi içindeki her 2 basamağın o dizgede mevcut olup olmadığını kontrol ettim.


Oh, bu arama dizgisi de beni 17 byte kurtaracaktı. Bunu Retina cevabım için kullanırsam sorun olur mu?
Martin Ender

Göreyim seni! Sadece kredi ver sanırım.
Değerli Mürekkep

Teşekkürler, ama Sp3000'in önerisine dayanarak daha da kısa bir çözüm buldum :)
Martin Ender

6

grep 58 bayt

grep "^((?=18|16|29|27|34|38|49|43|61|67|72|76|81|83|94|92).)*.$"

Çünkü gerçekten, grep'i yenemezsen ...


2
Ne 5de 185yayarlar 1komut satırı ile, ise 5truthy olduğunu ve 185falsy listede.
Guntram Blohm, 20

1
@GuntramBlohm sabit - düzenli olumsuzlamada kayboldu
Yakk

6

Haskell 46 bayt

q=zip<*>tail
all(`elem`q"16729438183492761").q

Kullanım örneği: all(`elem`q"16729438183492761").q $ "183492761"->True

Nasıl çalışır: @Kevin Lau'nun cevabında bulunan arama dizgisini kullanır . qbir dizgeden bitişik karakter çiftlerinin bir listesini yapar, örneğin q "1672" -> [('1','6'),('6','7'),('7','2')]; Girilen tüm çiftler arama dizesindeki çiftler halinde göründüğünde, işlev true değerini döndürür. qtek basamaklı girişleri boş listeye dönüştürür, bu nedenle elemdaima başarılıdır.


Neden zip<*>tailçevirilmiş bir versiyonu gibi çalışıyor zip=<<tail? Sanırım hangi uygulamaların genelleştiğini anlamıyorum.
xnor

@xnor: Sadece kullanıyorum. <*> olarak tanımlanır (<*>) f g x = f x (g x) .
nimi

6

JavaScript (ES6), 65 62 bayt

s=>[...s].every((c,i)=>!i|"16729438183492761".match(s[i-1]+c))

Doğru ya da yanlış döndürür. Daha önce 63 bayt alan özyinelemeli bir çözüm denedim mapve hatta reducebeni 73 bayt aldı.

Düzenleme: @ user81655 sayesinde 3 bayt kaydedildi.


Daha iyisi olamazdı, en iyi denemem 88 byte oldu. Bravo!
Naouak

@ user81655 Bunun matchyerine çalışır ~search(ama her iki şekilde de, gerçekten yetersiz kaldı) ve |yerine ||(ne de olsa özyinelemeli sürümde, ne yazık ki.) demek istiyorsun .
Neil

@ user81655 Eşleşme !i|...matchsonucu başarılı olursa, |işlecin geçerli bir tam sayıya zorla girdiği iki basamaktan oluşan tek bir diziden oluşan bir diziden oluşan bir çalışma biçiminden bahsediyordum .
Neil,

@Neil Ah, doğru.
user81655 19:16

6

C, 85 81 bayt

golfed:

i;f(char*b){i=*b++-49;return*b?(*b=="8749x7214"[i]||*b=="6983x1632"[i])&&f(b):1;}

Eski özyinelemeyen sürüm (85 bayt):

i;f(char*b){for(;(i=*b++-49),*b&&*b=="8749x7214"[i]||*b=="6983x1632"[i];);return!*b;}

Boşluk ve ana program içeren eski kod:

i;
f(char*b){
    for (; (i=*b++-49), *b     // i = index of digit + 1 in following arrays
        &&*b=="8749x7214"[i]   // 1st possible jump for 1..9
        ||*b=="6983x1632"[i];  // 2nd possible jump for 1..9
    );
    return !*b;
}

main(){
    char b[16];
    while(scanf("%s", b) == 1) printf("%d",f(b));
    return 0;
}

Bu, standart girdiyle boşlukla sınırlandırılmış sayıları kabul eder ve sayısal tuş takımı değilse, 0 değerini, aksi takdirde 1 değerini verir.

Yeni 81 bayt özyinelemeli sürümü 4 bayt tıraş eder.


5

MATL , 38 37 29 bayt

Bu @ QPaysTaxes fikrini kullanır .

I:8JK5:7Pvj!Uttnqh?)d|2:EQm}h

Çıktı 2B, karmaşık, boş olmayan bir dizidir. Tüm değerlerinin sıfır olmayan gerçek bir kısmı varsa, başka türlü sahte olup olmadığı gerçeği doğrudur.

Çevrimiçi deneyin!


1
Buna bile izin var mı?
Hesap MakinesiFeline

Sorusu sorar bir truthy veya bir falsy değeri değil, bütün bir dizi.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

2
@CatsAreFluffy Bu bizim truthy / falsy tanımımızdır. MATLAB / Octave'de olduğu gibi diziler de MATL’de truthy, ancak tüm elementleri truthy’dir. ( örnek )
Dennis,

CC @ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
Dennis


4

MATL, 25 24 33 26 bayt

@LuisMendo! Sayesinde 1 byte kapalı tıraş edildi!
@Dennis bir hata buldu ve sonra düzeltti! Teşekkürler!

'bSVYXbTUZW'j47-)d2^48\1=A

Tamsayı giriş olarak alır. Çıkışlar 1/0.

Çevrimiçi deneyin!


@LuisMendo Her iki konuda da doğru, teşekkürler!
beher

@Dennis Güncellenmiştir ve umarım doğrudur. Yardımın için teşekkürler.
beher

ASonunda ihtiyacın olduğunu sanmıyorum . MATL'ın vektörleri, eğer 0 içermezlerse gerçeklerdir.
Dennis

4

C, 140 92 bayt

c;L(char*i){while(*i&&(!c||*i=="6743x1212"[c-49]||*i=="8989x7634"[c-49]))c=*i++;return !*i;}

ASCII varsayarak

Ayrıntılı Burada deneyin

// valid transition from x to n[x-'1'][0 or 1]

int n[9][2] =
{
    {'6','8'},{'7','9'},{'4','8'},
    {'3','9'},{'x','x'},{'1','7'},
    {'2','6'},{'1','3'},{'2','4'}
};

// i is a pointer to where to start on a string

bool L(char * i)
{
    char c = 0;

    // move if not \0 and (not-first-char or is a valid move)

    while((*i) && (!c || (*i)==n[c-'1'][0] || (*i)==n[c-'1'][1]))
    {
        c = (*i++);
    }

    return !(*i); // success if it's \0
}

Bu arama tabloları çok büyük. Tüm sınırlayıcılardan kurtulursanız {,}[]ve char*bunun yerine bir dize olarak kodlarsanız, puanınızı çok artırabilirsiniz . Ayrıca, #defineyalnızca iki kez kullandığınızda maliyet etkin olmadığına dikkat edin : çıkarmanız 4 bayttan tasarruf etmenizi sağlar.
tucuxi

İpuçları için teşekkürler @tucuxi, ben \0dizi içinde tanımsız davranışa neden olan, 92 yerine getirmeyi başardı bu yüzden yerinex
Khaled.K

Güzel - ayrıca, <s>oldscore</s> newscorepuan iyileştirmelerini yansıtmak için düzenleme yaparken ve <!-- language-all: lang-c -->kodunuz sözdizimi vurgulamasını düzeltmeye başlamadan önce kullanmayı unutmayın . Ayrıca döngüyü tamamen bırakarak bayt sayımı da azaltmayı başardım
tucuxi

'Ayrıntılı', golf kodunun basit bir şekilde genişlemesinden çok farklı görünüyor ( nkısa versiyonda nerede ?). Ayrıca, muhtemelen ASCII kodlamasını varsaydığınızı da belirtmelisiniz - EBCDIC makinelerinde farklı numaralar elde edersiniz.
Toby Speight

@TobySpeight'ın ayrıntılı versiyonunun temelde nasıl yapıldığını göstermesi beklenir, evet, C'nin ortak hali olan
ASCII'yi kabul ediyorum

3

Julia, 51 49 bayt

n->diff(["@1634@8725"...][digits(n)+1]).^2%48⊆1

Doğrulama

julia> f=n->diff(["@1634@8725"...][digits(n)+1]).^2%48⊆1
(anonymous function)

julia> all(map(f,(1,2,3,4,5,6,7,8,9,16,18,38,61,81,294,349,381,383,729,767,38183,38383,18349276,183492761,618349276)))
true

julia> any(map(f,(10,11,50,53,55,65,95,100,180,182,184,185,186,187,188,189,209,305,2009,5030,3838384,4838383,183492760)))
false

3

Aslında, 30 bayt

;#pXZdX`Σ"67294381";'1+R+íu`Mπ

Bir dize olarak girdi alır. Doğru için pozitif, yanlış için 0 pozitif bir tamsayı üretir.

Çevrimiçi deneyin!

Açıklama:

;#pXZdX`Σ"67294381";'1+R+íu`Mπ
                                 (implicit) push input
;#pXZdx                         push zip(n[:-1], n[1;]) (pairs of digits)
       `Σ"67294381";'1+R+íu`M   map:
        Σ                         join digits
         "67294381";'1+R+         push "16729438183492761" (the magic string used in many other solutions)
                         íu       0-based index (-1 if not found), increment so 0 is not found and >=1 is the 1-based index
                             π  product

3

PowerShell v2 +, 105 96 bayt

param($a)((1..$a.length|%{'27618349294381672'.IndexOf($a[$_-1]+$a[$_])+1})-join'*'|iex)-or$a-eq5

""Herhangi bir sıralı karakter çiftinin indeksinin geçerli arama dizgisinde olduğunu doğrulayarak girdi (enkapsüle alınması gereken ) boyunca yinelenir . Kevin Lau’nın da benzer bir şeyi olduğunu gördüm, ama bunu bağımsız olarak gördüm. Bu endekslerin Her ile eklenen +1olarak, .IndexOf()fonksiyon dönecektir -1dize bulunmazsa. Bu, "bulunamadı" kelimesine dönüşecektir 0.

Daha sonra -join, tüm Elde edilen tam sayı değerleri ile *ve boru bu iex(benzer eval). Bu, endekslerden herhangi birinin bulunamaması durumunda ifadenin tamamının ortaya çıkacağı anlamına gelecektir 0. Bu parens ve enkapsüle edilir-or elde edilen çıktımızı elde etmek $a-eq5için özel girdi vakası ile birlikte bulunur "5".

Test Çalıştırması

PS C:\Tools\Scripts\golfing> 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 18, 38, 61, 81, 294, 349, 381, 383, 729, 767, 38183, 38383, 18349276, 183492761, 618349276 | %{.\numpad-knight-numbers.ps1 "$_"}
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True

PS C:\Tools\Scripts\golfing> 10, 11, 50, 53, 55, 65, 95, 100, 180, 182, 184, 185, 186, 187, 188, 189, 209, 305, 2009, 5030, 3838384, 4838383, 183492760 | %{.\numpad-knight-numbers.ps1 "$_"}
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False

2

C, 78 bayt

char*a="9614397052";f(x){int b=x/10;return!b||abs(a[x%10]-a[b%10])%6==1&f(b);}

Diğer herkes girdiyi bir dize olarak aldığından, tamsayılarla yapmayı denedim. En az anlamlı olan basamaktan tekrarlı olarak çalışır (a%10 ) ; tek basamak ise, o zaman doğru dön. Aksi takdirde, sadece onlarca rakam (b%10 ) birim basamağından ulaşılamıyorsa ve (tekrarlı olarak) girişin geri kalanı aynı testi yerine getiriyorsa .

Ulaşılabilirlik testi, şövalye turunu lineer olarak kodlayarak ve her bir rakamı turdaki pozisyonuna (sıfır ila yedi) dönüştürerek çalışır. Rakamlar için0 ve5 diğer konumlarla bağlantısı kesilen dokuzuncu konumu atayız. Ardından, karşılıklı olarak erişilebilen sayılar bir farklılık gösterir (mod sekiz); yania[x%10]-a[b%10] ± 1 veya ± 7'dir. Bu yüzden mutlak farkı (mod 6) 1'e karşı test ediyoruz.

Bu çözüm, C için geçerli olan herhangi bir karakter kodlaması için çalışır (örn. Rakamlar, 0 - 9 arasında bitişik kodlara sahiptir).


1

Java 8, 179 167 Bayt

Sayı tuşlarını girişlerini (eksi 5 ve 0) bir daireye yerleştirir. lbu girdilerin daire endeksini tutar. İki endeks farkı +/- 3 mod 8 ise, bu endekslere karşılık gelen ints arasında hareket eden bir şövalye vardır. Bu xbir nottur int[].

x->{if(x.length<2)return 1;int[] l={0,0,1,2,7,0,3,6,5,4};int o=l[x[1]];for(int i:x){int n=l[i];if(i%5==0||(Math.abs(n-o)!=3&&Math.abs(n-o)!=5))return 0;o=n;}return 1;}

Güncelleştirme

  • -11 [16-12-10] Bir lambdaya geçti
  • -1 [16-12-10] <2Bunun yerine kullanın==1
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.