Merdiven numaraları


29

Bir merdiven sayısı, pozitif bir tamsayıdır x onun bu tür N inci haneli (en az önemli basamak başlayarak endeksli bir) eşittir için % x (n + 1) . Bu biraz ağız doludur bu yüzden bir örneğe bakalım. Al 7211311 biz modüler artıkları alırsak, 7211311 aşağıdaki olsun aralığında 2-8 tarih:

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

Bunlar 7211311'in rakamları ! Böylece 7211311 bir merdiven numarasıdır.

Görev

Girdi olarak pozitif bir sayı verildiğinde alan kod, bir sayı bir sayı ise diğeri değilse iki ayrı değer verir .

Bu bir yarışmasıdır, bu nedenle amacınız kaynak kodunuzdaki bayt sayısını en aza indirgemek olmalıdır.

Test Kılıfları

İşte ilk 13 merdiven numarası:

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

0Merdiven sayıları değil mi? Pek çok cevap öyle düşünüyor.
Okx,

3
@Okx görevi yalnızca pozitif merdiven sayılarını pozitif merdiven olmayan sayılardan ayırmaktır, bu nedenle davranış 0 ve negatif sayılar için tanımsızdır.
Paŭlo Ebermann

Yanıtlar:


10

Haskell, 55 57 bayt

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

Diğer Haskell çözümünden farklı bir yaklaşım.

2 bayt kaydettiğiniz için teşekkür ederiz.


4
İfadeyi kısaltmak için bu ipucunu kullanabilirsiniz let.
xnor

Farklı, daha kısa bir yaklaşım. Aferin! +1
qfwfq

9

Brachylog , 25 21 16 14 bayt

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

Çevrimiçi deneyin!

İlk Brachylog sunumu: D muhtemelen çok yıpranmış ... Leaky Nun ve Fatalize için teşekkürler, cesaretlendirmek ve 25'ten başlayarak sadece 14'e kadar golf oynamak için yardım ediyor. :) :)


7

Javascript, 42 41 39 38 bayt

@Shaggy ve @ETHProductions sayesinde -4 bayt

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

Bu, sayıyı bir dize olarak alır ve sayı falsebir merdiven numarasıysa geri döner true.

Örnek kod pasajı:

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
Sen düşmesi gerekir !açıkça dönmek gerektiğini belirtmez meydan okuma olarak truegerçek ve falsesize 2 ayrı değerleri geri dönmelidir sadece o, yalancı için.
Shaggy,

2
Bu çok iyi golf oynadı, aferin. iKendinizi hesaplarsanız, iki bayt daha s=>[...s].some(d=>s%i--^d,i=s.length+1)
sıkmanız

2
Aslına bakarsanız, ~x == -(x+1)tamsayılarla ilgili bir gerçeği kullanarak ve x%-y == x%ybir tane daha alabileceğinizi düşünüyorum:s=>[...s].some(d=>s%i++^d,i=~s.length)
ETHproductions

6

05AB1E , 6 bayt

Kod:

ā>%JRQ

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!

Açıklama:

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

Sayıyı int olarak alır.

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

5

Mathematica, 60 bytes

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

Try it online!

@alephalpha golfed it to 48

Mathematica, 48 bytes

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

next one is 24120020



5

Japt, 9 7 bytes

Takes input as a string.

¥£%´JÃw

Test it

  • 2 bytes saved with help from ETHproductions.

Explanation

We implicitly take the string as input.

£   Ã

Map over each character in the string.

´J

J is the Japt constant for -1, and ´ decrements it by 1 on each pass (-- in JavaScript). So, on the first pass, this gives us -2.

%

We use that value to perform a modulo operation on the input string which is automatically cast to an integer in the process. In JavaScript x%-y gives the same result as x%y.

w

Reverse the resulting string.

¥

Check if the new string is equal to the original input and implicily output the result as a boolean.


Gosh darn (Y+2, I feel like that could be at least 1 byte shorter...
ETHproductions

1
...and it can: ¥£%´JÃw :-) (works because x%y == x%-y in JS)
ETHproductions

Aha, yes, was trying a few different things to get that calculation down to 2 bytes.
Shaggy

4

Neim, 6 bytes

𝐧ᛖ𝕄𝐫𝐣𝔼

Explanation:

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

Try it online!


@Thehx Regarding your edit, Neim uses a custom encoding: this one
Okx



2

Perl 6, 32 bytes

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

Try it online!

  • .comb is the number of characters in the string representation of the input argument $_ (that is, the number of digits).
  • 1 + .comb ... 2 is the sequence of numbers from one greater than the number of digits down to 2.
  • «%« is the modulus hyperoperator that gives the remainder when $_, the input argument on its left, is divided by each of the elements of the sequence on its right: $_ % 2, $_ % 3, ....
  • [~] concatenates those digits into a new number, which is compared with the input argument using the string equality operator eq.


2

Pyth, 13 bytes

-1 bytes thanks to Okx.

qsjk_m%QhdSl`

Try it online!

Explanation

             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

Alternate solution, still 13 bytes (thanks to karlkastor)

qi_.e%Q+2k`QT

Try it online! That's essentially the same as the first solution, excepted that it uses i to convert from array of numbers to a number, and that the range is generated differently.


1
You can replace ss`M_ with jk_ to save 2 bytes.
Okx

@Okx I need it because j outputs a string whereas I need a number to compare with the input (which is a number).
Jim

1
Another 13 byte solution would be: qi_.e%Q+2k`QT using enumerated map (.e) instead of map. And converting the remainders to a base 10 int from the list instead of using join.
KarlKastor

2

C++,104 bytes

1) original version:

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) in a readable form:

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

Try it Online!




1

Python 3: 63 Bytes

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

If I could count the number of times I wished 'enumerate' were shorter...

Try it online!


Yep, and I just realized its exactly the same as the answer @officialaimm gave... Should I remove?
bendl

Theirs is in python 2 and you came up with it independently so I would leave it.
Wheat Wizard

Can save two bytes by starting your enumeration at 2 and rearranging the logical: lambda m:all(m%n==int(x)for n,x in enumerate(str(m)[::-1],2))
nocturama


1

Java 8, 156 149 bytes

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

Ungolfed :

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

Try it Online !

UPDATE :
-7 bytes : removed useless {} and replaced Integer.parseInt(...) by new Integer(...)
-9 bytes : thanks to Kevin Cruijssen, removed a bunch of useless (), used Long instead of Integer and print instead of println. Thanks Kévin !


1
Nice answer, +1 from me. Btw, some small things to golf: new Integer can be new Long (-3 bytes); println can be print (-2 bytes); and you can remove the parenthesis surrounding new Long(s[0])%i+f; (-4 bytes).
Kevin Cruijssen

Really nice ! Thanks, i'll update this !
Alex Ferretti

1

Charcoal, 20 15 bytes

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

Try it online! Outputs - for a staircase number, nothing otherwise. Link is to verbose version of code.


0

Python 2, 61 bytes

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

Nope, your new golf is a byte shorter. :)
Wheat Wizard

0

q/kdb+, 34 bytes

Solution:

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

Example:

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

Explanation:

Cast the input number to a string, count from 0..length of string, add 2 to all, reverse it and feed each number into mod along with the original input. Cast the result of the mod to a string and reduce the list, check if it is equal to the string of the input number:

{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

Notes:

Most of the solution is for generating the 2,3,4.. list, I have another solution that does less stuff, but winds up being 37 bytes after golfing:

{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 bytes

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

Input is a string, using map and the trailing % ended up being shorter than for[i(range(count %))] approach.


0

Haskell, 62 bytes

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

Instead of reversing the (infinite) list of moduli, it truncates the list by zipping it with the reversed string-respresentation of the integral x, which it then ensures is equal element-wise.


0

Perl 5, 41 bytes

39 bytes of code + 2 flags -pa

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

Try it online!

Outputs nothing (undef) for staircase numbers, 1 for anything else

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.