Số hiệp sĩ của Numpad


33

Đối với các chữ số khác không trên một numpad tiêu chuẩn

789
456
123

xem xét việc đặt một hiệp sĩ cờ vua ở bất kỳ chữ số nào và di chuyển nó xung quanh với bất kỳ số lần nhảy hình chữ L bình thường nào, tìm ra một số nguyên thập phân dương. Những số nguyên dương nào có thể được thể hiện theo cách như vậy?

Một trong số đó là 38, vì hiệp sĩ có thể bắt đầu 3và di chuyển sang trái và lên tới 8. 381383cũng có thể

3chính nó là có thể nếu không có bước nhảy nào được thực hiện (được phép). 5là tốt, nhưng không có chữ số nào khác có thể đạt được từ 5đó, vì vậy nó là số duy nhất mà chữ số 5xuất hiện.

Viết một chương trình hoặc chức năng mà mất trong một số nguyên thập phân dương tính (bạn có thể mang nó như là một chuỗi nếu muốn) và in hoặc lợi nhuận một truthy giá trị nếu số có thể được thể hiện bằng một hiệp sĩ trên numpad theo cách mô tả, nhưng nếu không kết quả đầu ra một falsy giá trị.

Mã ngắn nhất tính bằng byte thắng. Tiebreaker là câu trả lời trước đó

Ví dụ

Sự thật:

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

Giả mạo:

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

2
Những gì với hiệp sĩ cờ vua ngày nay ? :-D
Luis Mendo

1
Gợi ý: Nếu bạn viết các số ra dưới dạng gói, thì hiệp sĩ luôn nhảy bốn không gian theo chiều kim đồng hồ hoặc bốn không gian. Tôi không biết nếu điều này là hữu ích.
Vụ kiện của Quỹ Monica

3
@LuisMendo Gói. Như trong, nếu bạn coi là một danh sách vô tận 78963214, lặp đi lặp lại. Đếm khoảng cách - luôn luôn là bốn, cách này hay cách khác. Tôi nên nói rõ ràng hơn và nói rõ ràng rằng bạn phải viết nó theo thứ tự vòng tròn.
Vụ kiện của Quỹ Monica

@QPaysTaxes Ồ, tôi nghĩ bạn có nghĩa là vòng tròn nhưng 123...9. Xin lỗi
Luis Mendo

@LuisMendo Không phải lo lắng. Như tôi đã nói, tôi nên nói rõ hơn về ý của tôi.
Vụ kiện của Quỹ Monica

Câu trả lời:


16

Thạch, 19 15 14 byte

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

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

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 byte

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

Kiểm tra xem có bất kỳ hai chữ số liên tiếp trong chuỗi '18349276167294381'. Để có được các chữ số liên tiếp, thay vì thực hiện zip(`n`,`n`[1:]), hàm liên tục kiểm tra hai chữ số cuối và loại bỏ chữ số cuối cùng.


13

Võng mạc , 58 40 byte

Cảm ơn Sp3000 đã gợi ý ý tưởng này:

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

Hãy thử trực tuyến! (Sửa đổi một chút để chạy toàn bộ bộ kiểm tra cùng một lúc.)

Bản in 1 cho sự thật và 0cho kết quả giả.

Giải trình

M&!`..

Tìm tất cả các kết quả trùng lặp của .. , tức là tất cả các cặp chữ số liên tiếp và nối chúng với nguồn cấp dữ liệu.

O%`.

Sắp xếp các chữ số trong mỗi dòng, do đó chúng ta chỉ cần kiểm tra một nửa số lượng cặp.

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

Xóa tất cả các dòng tương ứng với một di chuyển hợp lệ.

^$

Đếm các trận đấu của regex này. Đó là, nếu tất cả các dòng đã bị xóa, điều này khớp với chuỗi trống kết quả một lần, nếu không nó không khớp và thay vào đó là 0.



7

Ruby, 57 byte

Chức năng ẩn danh. Đối số là một chuỗi.

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

Chương trình với bộ kiểm tra:

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ôi chỉ mã hóa tất cả các hiệp sĩ có thể di chuyển thành một chuỗi và kiểm tra xem cứ 2 chữ số trong đầu vào có tồn tại trong chuỗi đó không.


Ồ, chuỗi tra cứu đó cũng sẽ giúp tôi tiết kiệm 17 byte. Bạn có phiền nếu tôi sử dụng nó cho câu trả lời Retina của tôi không?
Martin Ender

Đi cho nó! Chỉ cần cung cấp tín dụng, tôi đoán.
Mực giá trị

Cảm ơn, nhưng tôi đã kết thúc với một giải pháp thậm chí còn ngắn hơn dựa trên đề xuất của Sp3000 :)
Martin Ender

6

grep 58 byte

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

Bởi vì thực sự, nếu bạn không thể đánh bại grep ...


2
Không 5phải cũng không 185phát ra 1với dòng lệnh của bạn, trong khi đó 5là sự thật và 185trong danh sách giả mạo .
Guntram Blohm hỗ trợ Monica

1
@GuntramBlohm đã được sửa - bị mất trong phủ định thường xuyên
Yakk

6

Haskell 46 byte

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

Ví dụ sử dụng: all(`elem`q"16729438183492761").q $ "183492761"->True

Cách thức hoạt động: Nó sử dụng chuỗi tra cứu được tìm thấy trong câu trả lời của @Kevin Lau . qtạo một danh sách các cặp ký tự liền kề từ một chuỗi, vd q "1672" -> [('1','6'),('6','7'),('7','2')]. Hàm trả về true nếu tất cả các cặp từ đầu vào xuất hiện trong các cặp từ chuỗi tra cứu. qbiến đầu vào một chữ số vào danh sách trống, vì vậy elemluôn thành công.


Tại sao zip<*>tailhoạt động như một phiên bản lật của zip=<<tail? Tôi nghĩ rằng tôi không hiểu những gì ứng dụng khái quát.
xnor

@xnor: Tôi chỉ sử dụng nó. <*> được định nghĩa là (<*>) f g x = f x (g x) .
nimi

6

JavaScript (ES6), 65 62 byte

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

Trả về đúng hay sai. Trước đây tôi đã thử một giải pháp đệ quy, mất 63 byte mapvà thậm chí reducenhưng chúng đã lấy cho tôi 73 byte.

Chỉnh sửa: Đã lưu 3 byte nhờ @ user81655.


Không thể làm tốt hơn, cố gắng tốt nhất của tôi là 88 byte. Bravo!
Naouak

@ user81655 Ý bạn là matchcông việc thay vì ~search(nhưng dù bằng cách nào, điều đó thực sự bị lép vế ) và |có thể thay thế ||(nhưng không phải trong phiên bản đệ quy, thật đáng buồn.)
Neil

@ user81655 Tôi đã đề cập đến cách !i|...matchhoạt động vì kết quả khớp, nếu thành công, là một mảng gồm một chuỗi gồm hai chữ số, mà |toán tử kết thúc việc ép buộc thành một số nguyên hợp lệ.
Neil

@Neil À, đúng rồi.
dùng81655

6

C, 85 81 byte

Chơi gôn

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

Phiên bản không đệ quy cũ (85 byte):

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

Mã cũ với khoảng trắng và chương trình chính:

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;
}

Điều này chấp nhận các số được phân tách bằng dấu cách thông qua đầu vào tiêu chuẩn và đầu ra 0 nếu không phải là numpad-hiệp sĩ hoặc 1 nếu không.

Phiên bản đệ quy 81 byte mới sẽ cạo 4 byte.


5

TOÁN , 38 37 29 byte

Điều này sử dụng ý tưởng @QPaysTaxes .

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

Đầu ra là một mảng 2D, phức tạp, không trống. Đó là sự thật nếu tất cả các giá trị của nó có phần thực khác, và giả là khác.

Hãy thử trực tuyến!


1
Điều này thậm chí có được phép không ??
Máy

Câu hỏi đặt ra yêu cầu cho một truthy hoặc một giá trị falsy, không phải là một mảng toàn.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

2
@CatsAreFluffy Đây là định nghĩa của chúng tôi về sự thật / giả dối. Như trong MATLAB / Octave, các mảng là trung thực trong MATL nếu tất cả các yếu tố của nó là trung thực. ( ví dụ )
Dennis

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


4

MATL, 25 24 33 26 byte

Đã tắt 1 byte nhờ @LuisMendo!
@Dennis tìm thấy một lỗi, và sau đó sửa nó! Cảm ơn!

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

Lấy số nguyên làm đầu vào. Đầu ra 1/0.

Hãy thử trực tuyến!


@LuisMendo Đúng cả hai tính, cảm ơn!
cốc

@Dennis Cập nhật, và hy vọng chính xác. Cảm ơn bạn đã giúp đỡ.
cốc

Tôi không nghĩ rằng bạn cần Acuối cùng. Các vectơ của MATL là sự thật nếu chúng không chứa 0.
Dennis

4

C, 140 92 byte

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

Giả sử ASCII

Chi tiết Dùng thử tại đây

// 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
}

những bảng tra cứu là rất lớn. Bạn có thể cải thiện điểm số của mình rất nhiều nếu bạn thoát khỏi tất cả các dấu phân cách {,}[]và mã hóa nó thành một char*chuỗi thay thế. Ngoài ra, lưu ý rằng việc của bạn #definekhông hiệu quả về chi phí khi bạn chỉ sử dụng hai lần: loại bỏ nó sẽ giúp bạn tiết kiệm 4 byte.
tucuxi

@tucuxi cảm ơn vì những lời khuyên, tôi đã cố gắng đưa nó xuống 92, vì \0trong phạm vi gây ra hành vi không xác định nên tôi đã thay thế bằngx
Khaled.K

Đẹp - đồng thời, đừng quên sử dụng <s>oldscore</s> newscorekhi chỉnh sửa để phản ánh sự cải thiện điểm số và<!-- language-all: lang-c --> trước khi mã của bạn bắt đầu sửa lỗi tô sáng cú pháp. Tôi cũng đã cố gắng giảm số lượng byte của mình bằng cách bỏ hoàn toàn vòng lặp
tucuxi

'Chi tiết' của bạn trông rất khác so với bản mở rộng đơn giản của mã được đánh gôn (ở đâu ntrong phiên bản ngắn?). Ngoài ra, có lẽ bạn nên đề cập rằng bạn đang giả sử mã hóa ASCII - bạn sẽ nhận được các số khác nhau trên các máy EBCDIC.
Toby Speight

@TobySightight phiên bản chi tiết được cho là hiển thị về cơ bản nó được xây dựng như thế nào, vâng tôi giả sử ASCII là trường hợp phổ biến trong C.
Khaled.K

3

Julia, 51 49 byte

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

xác minh

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

Trên thực tế, 30 byte

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

Đưa đầu vào dưới dạng một chuỗi. Xuất ra một số nguyên dương cho true và 0 cho false.

Hãy thử trực tuyến!

Giải trình:

;#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 byte

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

Lặp lại thông qua đầu vào (phải được gói gọn "") bằng cách xác minh rằng chỉ mục của bất kỳ cặp ký tự liên tiếp nào nằm trong chuỗi tra cứu hợp lệ. Tôi thấy Kevin Lau có một cái gì đó tương tự , nhưng tôi đã nghĩ ra điều này một cách độc lập. Mỗi chỉ số được thêm vào +1, như.IndexOf() hàm sẽ trả về -1nếu không tìm thấy chuỗi. Điều này sẽ biến "không tìm thấy" thành0 .

Chúng tôi sau đó -jointất cả các giá trị nguyên kết quả với *và đường ống mà iex(tương tự eval). Điều này có nghĩa là nếu bất kỳ một trong các chỉ số không được tìm thấy, toàn bộ biểu thức sẽ dẫn đến 0. Điều đó được gói gọn trong parens và-or 'd với $a-eq5trường hợp đặc biệt của đầu vào"5" để đạt được đầu ra kết quả của chúng tôi.

Chạy thử

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 byte

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

Vì mọi người khác đã lấy đầu vào là một chuỗi, tôi đã thử thực hiện nó trong các số nguyên. Nó hoạt động đệ quy từ chữ số có nghĩa nhỏ nhất ( a%10); nếu đó là chữ số duy nhất, thì trả về true. Mặt khác, chỉ trả về true nếu chữ số hàng chục (b%10 không thể đạt được ) từ chữ số đơn vị và (đệ quy), phần còn lại của đầu vào thỏa mãn cùng một bài kiểm tra.

Kiểm tra khả năng tiếp cận hoạt động bằng cách mã hóa tuyến tính của hiệp sĩ một cách tuyến tính và chuyển đổi từng chữ số sang vị trí của nó (từ 0 đến bảy) trong chuyến tham quan. Đối với chữ số 05 , chúng tôi gán vị trí chín, bị ngắt kết nối với các vị trí khác. Sau đó, các số có thể tiếp cận lẫn nhau khác nhau bởi một (mod tám); tức a[x%10]-a[b%10]là hoặc 1 hoặc ± 7. Vì vậy, chúng tôi kiểm tra sự khác biệt tuyệt đối (mod 6) so với 1.

Giải pháp này hoạt động cho bất kỳ mã hóa ký tự nào hợp lệ cho C (tức là các chữ số có mã liền kề từ 0 đến 9).


1

Java 8, 179 167 byte

Đặt số nguyên int int (trừ 5 và 0) trong một vòng tròn. lgiữ chỉ số vòng tròn của các số nguyên này. Nếu sự khác biệt của hai chỉ số là +/- 3 mod 8, thì có một hiệp sĩ di chuyển giữa các int tương ứng với các chỉ số đó. Lưu ý rằng đó xlà một 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;}

Cập nhật

  • -11 [16-12-10] Đã chuyển sang lambda
  • -1 [16-12-10] Sử dụng <2thay vì==1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.