Số cầu thang


29

Số cầu thang là số nguyên dương x sao cho chữ số thứ n của nó (một chỉ số bắt đầu bằng chữ số có nghĩa nhỏ nhất) bằng x% (n + 1) . Đó là một chút của một miệng để xem xét một ví dụ. Lấy 7211311 , nếu chúng ta lấy dư lượng mô-đun của 7211311 trong phạm vi 2-8, chúng ta sẽ nhận được những điều sau:

7211311 % 2 = 1
7211311 % 3 = 1
7211311 % 4 = 3
7211311 % 5 = 1
7211311 % 6 = 1
7211311 % 7 = 2
7211311 % 8 = 7

Đây là những chữ số của 7211311 ! Do đó 7211311 là một số cầu thang.

Bài tập

Viết mã nhận khi được cung cấp một số dương làm đầu vào, sẽ xuất ra hai giá trị riêng biệt một nếu số đó số cầu thang và số còn lại nếu không.

Đây là một cuộc thi vì vậy mục tiêu của bạn là giảm thiểu số lượng byte trong mã nguồn của bạn.

Các trường hợp thử nghiệm

Dưới đây là 13 số cầu thang đầu tiên:

1, 10, 20, 1101, 1121, 11311, 31101, 40210, 340210, 4620020, 5431101, 7211311, 12040210

Không phải là 0một số cầu thang? Rất nhiều câu trả lời nghĩ như vậy.
Okx

3
@Okx nhiệm vụ chỉ là phân biệt số cầu thang dương với số không có cầu thang dương, do đó hành vi không được xác định cho số 0 và số âm.
Paŭlo Ebermann

Câu trả lời:


10

Haskell, 55 57 byte

f m|let n#x=n==0||n`mod`10==m`mod`x&&div n 10#(x+1)=m#2

Một cách tiếp cận khác với các giải pháp Haskell khác.

Cảm ơn xnor đã lưu 2 byte.


4
Bạn có thể sử dụng mẹo này để rút ngắn letbiểu thức.
xnor

Một cách tiếp cận khác, ngắn hơn. Làm tốt! +1
qfwfq


7

Javascript, 42 41 39 38 byte

-4 byte nhờ @Shaggy và @ETH Productstions

s=>[...s].some(d=>s%i++^d,i=~s.length)

Điều này lấy số là một chuỗi và trả về falsenếu số đó là số cầu thang vàtrue nếu không.

Đoạn mã ví dụ:

f=
s=>[...s].some(d=>s%i++^d,i=~s.length)

function update() {
  o.innerText = f(document.getElementById("i").value)
}
<input id="i" type="number">
<button onclick="update()">Test</button>
<p id="o">


2
Bạn sẽ có thể bỏ qua !vì thách thức không xác định rõ ràng rằng bạn phải trả về trueđúng và falsesai, đơn giản là bạn phải trả về 2 giá trị riêng biệt.
Shaggy

2
Điều này là rất tốt golf, thực hiện tốt. Tôi nghĩ bạn sẽ có thể vắt kiệt thêm hai byte nếu bạn itự tính toán :s=>[...s].some(d=>s%i--^d,i=s.length+1)
ETHproductions

2
Trên thực tế, bằng cách khai thác thực tế là ~x == -(x+1)trên các số nguyên và x%-y == x%y, tôi nghĩ bạn có thể nhận thêm một:s=>[...s].some(d=>s%i++^d,i=~s.length)
ETHproductions

6

05AB1E , 6 byte

Mã số:

ā>%JRQ

Sử dụng mã hóa 05AB1E . Hãy thử trực tuyến!

Giải trình:

ā        # Get the range [1 .. len(input)]
 >       # Increment by 1
  %      # Vectorized modulo
   J     # Join the array into a single number
    RQ   # Reverse that number and check if it's equal to the original input

6

Haskell, 60 byte

Lấy số là số nguyên

x n|s<-show n=reverse s==(rem n.(+1)<$>[1..length s]>>=show)

5

Toán học, 60 byte

FromDigits@Reverse@Mod[#,Range@Length@IntegerDigits@#+1]==#&

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

@alephalpha đánh gôn tới 48

Toán học, 48 byte

FromDigits@Reverse@Mod[#,Range[2,Log10@#+2]]==#&

tiếp theo là 24120020



5

Japt , 9 7 byte

Đưa đầu vào dưới dạng một chuỗi.

¥£%´JÃw

Kiểm tra nó

  • 2 byte được lưu với sự trợ giúp từ ETHproductions.

Giải trình

Chúng tôi mặc nhiên lấy chuỗi làm đầu vào.

£   Ã

Bản đồ trên mỗi ký tự trong chuỗi.

´J

Jlà hằng số Japt cho -1´giảm nó 1 trên mỗi lần vượt qua ( --bằng JavaScript). Vì vậy, trên đường chuyền đầu tiên, điều này mang lại cho chúng ta -2.

%

Chúng tôi sử dụng giá trị đó để thực hiện thao tác modulo trên chuỗi đầu vào được tự động chuyển thành số nguyên trong quy trình. Trong JavaScript x%-ycho kết quả tương tự như x%y.

w

Đảo ngược chuỗi kết quả.

¥

Kiểm tra xem chuỗi mới có bằng với đầu vào ban đầu hay không và kết quả đầu ra là boolean.


Gosh darn (Y+2, tôi cảm thấy như thế có thể có ít nhất 1 byte ngắn ...
ETHproductions

1
... và nó có thể: ¥£%´JÃw:-) (hoạt động vì x%y == x%-ytrong JS)
ETHproductions

Aha, vâng, đã thử một vài thứ khác nhau để tính toán đó xuống còn 2 byte.
Xù xì

4

Neim , 6 byte

𝐧ᛖ𝕄𝐫𝐣𝔼

Giải trình:

𝐧         Get the length of the input, then create an exclusive range
 ᛖ        Add 2 to each element
  𝕄       Modulus
    𝐫      Reverse
     𝐣     Join
      𝔼   Check for equality

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


@Thehx Về chỉnh sửa của bạn, Neim sử dụng mã hóa tùy chỉnh: cái này
Okx



2

Perl 6 , 32 byte

{$_ eq[~] $_ «%«(1+.comb...2)}

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

  • .comb là số lượng ký tự trong biểu diễn chuỗi của đối số đầu vào $_ (nghĩa là số chữ số).
  • 1 + .comb ... 2 là dãy số từ một lớn hơn số chữ số xuống còn 2.
  • «%«là siêu bộ điều biến mô đun cung cấp phần còn lại khi $_, đối số đầu vào bên trái của nó, được chia cho mỗi phần tử của chuỗi bên phải : $_ % 2, $_ % 3, ....
  • [~]nối các chữ số đó thành một số mới, được so sánh với đối số đầu vào bằng toán tử đẳng thức chuỗi eq.


2

Bình , 13 byte

-1 byte nhờ Okx .

qsjk_m%QhdSl`

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

Giải trình

             QQ    # Implicit input
          Sl`Q     # Generate [1, len(str(Q))]
     m%Qhd         # For digit d in above range, perform Q % (d + 1)
 sjk_              # Reverse, then convert to number
q             Q    # Test equality with input

Giải pháp thay thế , vẫn là 13 byte (nhờ karlkastor )

qi_.e%Q+2k`QT

Hãy thử trực tuyến! Về cơ bản, đó giống như giải pháp đầu tiên, ngoại trừ việc nó sử dụng iđể chuyển đổi từ mảng số sang số và phạm vi được tạo khác nhau.


1
Bạn có thể thay thế ss`M_bằng jk_để lưu 2 byte.
Okx

@Okx Tôi cần nó vì jđầu ra một chuỗi trong khi tôi cần một số để so sánh với đầu vào (đó là một số).
Jim

1
Một giải pháp 13 byte khác sẽ là: qi_.e%Q+2k`QTsử dụng liệt kê map ( .e) thay cho map. Và chuyển đổi phần còn lại thành cơ sở 10 int từ danh sách thay vì sử dụng phép nối.
KarlKastor

2

C ++, 104 byte

1) phiên bản gốc:

int main(){int N,T,R=1;cin>>N;T=N;for(int i=1;i<=log10(N)+1;i++){if(N%(i+1)!=T%10){R=0;}T/=10;}cout<<R;}

2) ở dạng dễ đọc:

int main()
{
    int N, T, R = 1;

    cin >> N;
    T = N;

    for (int i = 1; i <= log10(N) + 1; i++)
    {
        if (N % (i + 1) != T % 10)
        {
            R = 0;
        }

        T /= 10;
    }

    cout << R;
}

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




1

Python 3: 63 byte

lambda m:all(int(x)==m%(n+2)for n,x in enumerate(str(m)[::-1]))

Nếu tôi có thể đếm số lần tôi muốn 'liệt kê' thì ngắn hơn ...

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


Đúng, và tôi mới nhận ra nó giống hệt như câu trả lời @officialaimm đã đưa ra ... Tôi có nên xóa không?
uốn cong

Của họ là trong python 2 và bạn đã đưa ra nó một cách độc lập vì vậy tôi sẽ rời khỏi nó.
Phù thủy lúa mì

Có thể lưu hai byte bằng cách bắt đầu liệt kê ở mức 2 và sắp xếp lại logic:lambda m:all(m%n==int(x)for n,x in enumerate(str(m)[::-1],2))
nocturama


1

Java 8, 156 149 byte

interface B{static void main(String[]s){String f="";for(int i=1;i<=s[0].length();)f=new Long(s[0])%++i+f;System.out.print(f.equals(s[0]));}}

Ung dung:

interface B {
    static void main(String[] s) {
        String f = "";
        for (int i = 1; i <= s[0].length();)
            f = new Long(s[0]) % ++i + f;
        System.out.print(f.equals(s[0]));
    }
}

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

CẬP NHẬT:
-7 byte : loại bỏ vô dụng {}và được thay thế Integer.parseInt(...)bằng new Integer(...)
-9 byte : nhờ Kevin Cruijssen, đã loại bỏ một loạt các vô dụng (), được sử dụng Longthay vì Integerprintthay vì println. Cảm ơn Kévin!


1
Câu trả lời hay, +1 từ tôi. Btw, một số điều nhỏ đối với golf: new Integercó thể là new Long(-3 byte); printlncó thể là print(-2 byte); và bạn có thể loại bỏ dấu ngoặc đơn xung quanh new Long(s[0])%i+f;(-4 byte).
Kevin Cruijssen

Thực sự tốt đẹp! Cảm ơn, tôi sẽ cập nhật cái này!
Alex Ferretti


0

Python 2, 61 byte

lambda x:[`x%(n+2)`for n in range(len(`x`))][::-1]==list(`x`)

Không, golf mới của bạn ngắn hơn một byte. :)
Thuật sĩ lúa mì

0

q / kdb +, 34 byte

Dung dịch:

{s~raze($)x mod'2+(|)(!)(#)s:($)x}

Thí dụ:

q){s~raze($)x mod'2+(|)(!)(#)s:($)x}7211311 / this is a staircase number (true)
1b
q){s~raze($)x mod'2+(|)(!)(#)s:($)x}7211312 / this is not (false)
0b
q)t(&){s~raze($)x mod'2+(|)(!)(#)s:($)x}each t:1 + til 1000000 / up to a million
1 10 20 1101 1121 11311 31101 40210 340210

Giải trình:

Truyền số đầu vào thành một chuỗi, đếm từ 0..thần của chuỗi, thêm 2 cho tất cả, đảo ngược số đó và đưa từng số vào modcùng với đầu vào ban đầu. Truyền kết quả của mod thành một chuỗi và giảm danh sách, kiểm tra xem nó có bằng chuỗi của số đầu vào không:

{s~raze string x mod'2 + reverse til count s:string x} / ungolfed solution
{                                                    } / lambda function
                                           s:string x  / convert input to string, save as s
                                     count             / return length of this string
                                 til                   / like python's range() function
                         reverse                       / reverses the list
                     2 +                               / adds two to each element in the list
               x mod'                                  / ' is each both, so feeds x, and each element of the list to modulo function
        string                                         / converts output list to string list ("7";"2";"1"..etc)
   raze                                                / reduce list ("721...")
 s~                                                    / is s equal to this reduced list, returns boolean

Ghi chú:

Hầu hết các giải pháp là để tạo 2,3,4..danh sách, tôi có một giải pháp khác ít công cụ hơn, nhưng kết thúc là 37 byte sau khi chơi golf:

{s~x mod'reverse 2 + til count s:("J"$) each string x} / ungolfed
{s~x mod'(|)2+til(#)s:("J"$)each($)x}                  / golfed

0

Clojure, 75 byte

#(=(sort %)(sort(map(fn[i c](char(+(mod(Integer. %)(+ i 2))48)))(range)%)))

Đầu vào là một chuỗi, sử dụng mapvà dấu cuối %kết thúc ngắn hơn for[i(range(count %))]cách tiếp cận.


0

Haskell, 62 byte

f x=and$zipWith(==)(reverse$show x)$map(head.show.mod x)[2..]

Thay vì đảo ngược danh sách các mô-đun (vô hạn), nó cắt xén danh sách bằng cách nén nó với chuỗi phản hồi chuỗi ngược của tích phân x, sau đó nó đảm bảo là phần tử thông minh.


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.