Nomor tangga


29

Sejumlah tangga adalah bilangan bulat positif x seperti itu yang n digit th (satu diindeks dimulai dengan digit paling signifikan) adalah sama dengan x% (n + 1) . Itu sedikit suap jadi mari kita lihat sebuah contoh. Ambil 7211311 , jika kita mengambil residu modular 7211311 pada rentang 2-8 kita mendapatkan yang berikut:

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

Ini adalah angka dari 7211311 ! Jadi 7211311 adalah nomor tangga.

Tugas

Tulis kode yang mengambil ketika diberi angka positif sebagai input, akan menampilkan dua nilai yang berbeda satu jika nomor tersebut adalah nomor tangga dan yang lainnya jika tidak.

Ini adalah kompetisi sehingga tujuan Anda harus meminimalkan jumlah byte dalam kode sumber Anda.

Uji Kasus

Inilah 13 nomor tangga pertama:

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

Bukankah 0nomor tangga? Banyak jawaban yang berpikir demikian.
Okx

3
@Okx tugasnya hanya untuk membedakan angka tangga positif dari angka bukan tangga positif, sehingga perilaku tidak terdefinisi untuk 0 dan angka negatif.
Paŭlo Ebermann

Jawaban:


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

Pendekatan yang berbeda dari solusi Haskell lainnya.

Terima kasih xnor untuk menyimpan 2 byte.


4
Anda dapat menggunakan tip ini untuk mempersingkat letekspresi.
xnor

Pendekatan yang berbeda dan lebih pendek. Sudah selesai dilakukan dengan baik! +1
qfwfq

9

Brachylog , 25 21 16 14 byte

{it+₂;?↔%}ᶠ↔c?

Cobalah online!

Pengajuan Brachylog pertama: D mungkin sangat tidak ungolfed ... banyak terima kasih kepada Leaky Nun dan Fatalize untuk dorongan dan bantuan untuk bermain golf ini dari 25 hingga hanya 14. :) :)


7

Javascript, 42 41 39 38 byte

-4 byte berkat @Shaggy dan @ETHProductions

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

Ini mengambil nomor sebagai string dan mengembalikan falsejika nomor tersebut adalah nomor tangga dan truesebaliknya.

Cuplikan kode contoh:

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
Anda harus dapat menghapusnya !karena tantangan tidak secara eksplisit menentukan bahwa Anda harus mengembalikan yang truebenar dan yang falsesalah, hanya bahwa Anda harus mengembalikan 2 nilai yang berbeda.
Shaggy

2
Ini golf yang sangat baik, dilakukan dengan baik. Saya pikir Anda harus dapat memeras dua byte lagi jika Anda menghitung isendiri:s=>[...s].some(d=>s%i--^d,i=s.length+1)
ETHproduksi

2
Sebenarnya, dengan mengeksploitasi fakta bahwa ~x == -(x+1)pada bilangan bulat dan x%-y == x%y, saya pikir Anda bisa mendapatkan satu lagi:s=>[...s].some(d=>s%i++^d,i=~s.length)
ETHproduksi

6

05AB1E , 6 byte

Kode:

ā>%JRQ

Menggunakan penyandian 05AB1E . Cobalah online!

Penjelasan:

ā        # 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

Mengambil nomor sebagai int

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

5

Mathematica, 60 byte

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

Cobalah online!

@alephalpha memutarnya menjadi 48

Mathematica, 48 byte

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

selanjutnya adalah 24120020



5

Japt , 9 7 byte

Mengambil input sebagai string.

¥£%´JÃw

Menguji

  • 2 byte disimpan dengan bantuan dari ETHproductions.

Penjelasan

Kami secara implisit mengambil string sebagai input.

£   Ã

Petakan setiap karakter dalam string.

´J

Jadalah konstanta Japt untuk -1, dan ´menurunkannya dengan 1 pada setiap pass ( --dalam JavaScript). Jadi, pada pass pertama, ini memberi kita -2.

%

Kami menggunakan nilai itu untuk melakukan operasi modulo pada string input yang secara otomatis dilemparkan ke integer dalam proses. Dalam JavaScript x%-ymemberikan hasil yang sama dengan x%y.

w

Balikkan string yang dihasilkan.

¥

Periksa apakah string baru sama dengan input asli dan secara implisit menampilkan hasilnya sebagai boolean.


Astaga (Y+2, aku merasa seperti itu bisa lebih pendek setidaknya 1 byte ...
ETHproduksi

1
... dan dapat: ¥£%´JÃw:-) (berfungsi karena x%y == x%-ydalam JS)
ETHproduksi

Aha, ya, sedang mencoba beberapa hal berbeda untuk mendapatkan perhitungan itu hingga 2 byte.
Shaggy

4

Neim , 6 byte

𝐧ᛖ𝕄𝐫𝐣𝔼

Penjelasan:

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

Cobalah online!


@Thehx Mengenai hasil edit Anda, Neim menggunakan penyandian khusus: yang ini
Okx



2

Perl 6 , 32 byte

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

Cobalah online!

  • .combadalah jumlah karakter dalam representasi string dari argumen input $_(yaitu, jumlah digit).
  • 1 + .comb ... 2 adalah urutan angka dari satu lebih besar dari jumlah digit ke 2.
  • «%«adalah hyperoperator modulus yang memberikan sisa ketika $_, argumen masukan di sebelah kiri-nya, dibagi oleh masing-masing elemen dari urutan di sebelah kanan nya: $_ % 2, $_ % 3, ....
  • [~]menggabungkan angka-angka itu ke dalam angka baru, yang dibandingkan dengan argumen input menggunakan operator persamaan string eq.


2

Pyth , 13 byte

-1 byte, terima kasih kepada Okx .

qsjk_m%QhdSl`

Cobalah online!

Penjelasan

             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

Solusi alternatif , masih 13 byte (terima kasih kepada karlkastor )

qi_.e%Q+2k`QT

Cobalah online! Itu pada dasarnya sama dengan solusi pertama, kecuali yang digunakan iuntuk mengkonversi dari array angka ke angka, dan rentang yang dihasilkan berbeda.


1
Anda dapat mengganti ss`M_dengan jk_untuk menyimpan 2 byte.
Okx

@ OKK saya membutuhkannya karena jmenghasilkan string sedangkan saya perlu nomor untuk dibandingkan dengan input (yang merupakan angka).
Jim

1
Solusi 13 byte lainnya adalah: qi_.e%Q+2k`QTmenggunakan enumerated map ( .e) sebagai ganti map. Dan mengubah sisanya menjadi basis 10 int dari daftar alih-alih menggunakan join.
KarlKastor

2

C ++, 104 byte

1) versi asli:

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) dalam bentuk yang dapat dibaca:

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

Cobalah secara Online!




1

Python 3: 63 Bytes

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

Jika aku bisa menghitung berapa kali aku berharap 'menghitung' lebih pendek ...

Cobalah online!


Yap, dan saya baru sadar persis sama dengan jawaban yang diberikan oleh @officialaimm ... Haruskah saya hapus?
bendl

Mereka berada di python 2 dan Anda datang dengan itu secara mandiri sehingga saya akan meninggalkannya.
Wheat Wizard

Dapat menyimpan dua byte dengan memulai enumerasi Anda pada 2 dan mengatur ulang logis: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]));}}

Tidak Disatukan:

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

Cobalah secara Online!

UPDATE:
-7 byte : dihapus tidak berguna {}dan diganti Integer.parseInt(...)oleh new Integer(...)
-9 byte : terima kasih kepada Kevin Cruijssen, menghapus banyak yang tidak berguna (), digunakan Longsebagai ganti Integerdan printbukan println. Terima kasih Kévin!


1
Jawaban yang bagus, +1 dari saya. Btw, beberapa hal kecil untuk golf: new Integerbisa new Long(-3 byte); printlnbisa berupa print(-2 byte); dan Anda dapat menghapus kurung di sekitarnya new Long(s[0])%i+f;(-4 byte).
Kevin Cruijssen

Benar-benar bagus ! Terima kasih, saya akan memperbarui ini!
Alex Ferretti

1

Arang , 20 15 byte

⌊Eθ⁼ιI﹪Iθ⁻⁺¹Lθκ

Cobalah online! Output -untuk nomor tangga, tidak ada yang lain. Tautan adalah untuk mengucapkan versi kode.


0

Python 2, 61 byte

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

Tidak, golf baru Anda satu byte lebih pendek. :)
Wheat Wizard

0

q / kdb +, 34 byte

Larutan:

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

Contoh:

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

Penjelasan:

Masukkan nomor input ke string, hitung mulai dari 0..panjang string, tambahkan 2 untuk semua, balikkan dan modmasukkan setiap nomor ke dalam input asli. Keluarkan hasil mod ke string dan kurangi daftar, periksa apakah itu sama dengan string nomor input:

{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

Catatan:

Sebagian besar solusinya adalah untuk menghasilkan 2,3,4..daftar, saya punya solusi lain yang melakukan lebih sedikit barang, tetapi akhirnya menjadi 37 byte setelah bermain 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)%)))

Input adalah string, menggunakan mapdan trailing %berakhir lebih pendek dari for[i(range(count %))]pendekatan.


0

Haskell, 62 byte

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

Alih-alih membalikkan daftar (tak terbatas) dari moduli, ia memotong daftar dengan zipnya dengan string-respresentation terbalik dari integral x, yang kemudian memastikan elemen-bijaksana yang sama.


0

Perl 5 , 41 byte

39 byte kode + 2 bendera -pa

map{$\||=$_!=$F[0]%++$n}0,reverse/./g}{

Cobalah online!

Tidak menghasilkan apa-apa (undef) untuk nomor tangga, 1 untuk apa pun

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.