Номери сходів


29

Число сходів - це додатне ціле число x таке, що його n -та цифра (одна індексована, починаючи з найменш значущої цифри) дорівнює x% (n + 1) . Це трохи рот, тому давайте подивимось на приклад. Візьмемо 7211311 , якщо взяти модульні залишки 7211311 в діапазоні 2-8, отримаємо наступне:

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

Це цифри 7211311 ! Таким чином, 7211311 - це сходовий номер.

Завдання

Код запису, який приймається, коли введений позитивний номер як вхідний, виведе два різних значення, одне, якщо число - це сходовий номер, а друге, якщо це не так.

Це змагання з тому ваша мета повинна бути мінімізувати кількість байтів у вихідному коді.

Випробування

Ось перші 13 номерів сходів:

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

Чи не 0номери сходів? Дуже багато відповідей так вважають.
Okx

3
Задача @Okx полягає лише в тому, щоб відрізнити додатні сходові номери від позитивних позасхідних чисел, тому поведінка не визначено для 0 і від’ємних чисел.
Paŭlo Ebermann

Відповіді:


10

Haskell, 55 57 байт

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

Інший підхід, ніж інше рішення Haskell.

Дякуємо xnor за збереження 2 байт.


4
Ви можете скористатися цією порадою, щоб скоротити letвираз.
xnor

Інший, коротший підхід. Молодці! +1
qfwfq


7

Javascript, 42 41 39 38 байт

-4 байти завдяки @Shaggy та @ETHProductions

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

Це приймає число як рядок і повертається, falseякщо число - це номер сходової клітки та trueінше.

Приклад фрагмента коду:

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
Ви повинні мати можливість відмовитись, !оскільки виклик не вказує прямо, що ви повинні повернутись trueдля істинних і falseнеправдивих, просто ви повинні повернути два різних значення.
Shaggy

2
Це дуже добре гольф, молодець. Я думаю, ви повинні мати можливість вичавити ще два байти, якщо ви is=>[...s].some(d=>s%i--^d,i=s.length+1)
порахуєте

2
Насправді, використовуючи той факт, що ~x == -(x+1)на цілі числа і x%-y == x%y, я думаю, ви можете отримати ще одне:s=>[...s].some(d=>s%i++^d,i=~s.length)
ETHproductions

6

05AB1E , 6 байт

Код:

ā>%JRQ

Використовує кодування 05AB1E . Спробуйте в Інтернеті!

Пояснення:

ā        # 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 байт

Приймає число як int

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



5

Japt , 9 7 байт

Вводиться як рядок.

¥£%´JÃw

Перевірте це

  • 2 байти, збережені за допомогою ETHproductions.

Пояснення

Ми неявно приймаємо рядок як вхідний.

£   Ã

Мапа над кожним символом у рядку.

´J

J- константа Japt для -1, і ´зменшує її на 1 на кожен прохід ( --у JavaScript). Отже, з першого проходу це нам дає -2.

%

Ми використовуємо це значення для виконання модульної операції на вхідному рядку, який автоматично передається цілому числу в процесі. У JavaScript x%-yдає такий самий результат, як і x%y.

w

Зворотний рядок поверніть назад.

¥

Перевірте, чи новий рядок дорівнює початковому вводу та неявно виводить результат як булевий.


Гоша штопання (Y+2, я відчуваю, що може бути по крайней мере 1 байт коротше ...
ETHproductions

1
... і це може: ¥£%´JÃw:-) (працює тому, що x%y == x%-yв JS)
ETHproductions

Ага, так, намагався кілька різних речей, щоб звести цей обчислення до 2 байт.
Shaggy

4

Нейм , 6 байт

𝐧ᛖ𝕄𝐫𝐣𝔼

Пояснення:

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

Спробуйте в Інтернеті!


@Thehx Щодо редагування, Neim використовує користувацьке кодування: це
Okx



2

Perl 6 , 32 байти

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

Спробуйте в Інтернеті!

  • .comb- кількість символів у рядковому поданні вхідного аргументу $_(тобто кількість цифр).
  • 1 + .comb ... 2 - послідовність чисел від одного більше, ніж число цифр до 2.
  • «%«являє собою модуль hyperoperator , що дає залишок , коли $_, вхідний аргумент на його зліва, ділиться на кожен з елементів послідовності на своєму праві: $_ % 2, $_ % 3, ....
  • [~]об'єднує ці цифри в нове число, яке порівнюється з вхідним аргументом за допомогою оператора рівності рядків eq.


2

Pyth , 13 байт

-1 байт завдяки Okx .

qsjk_m%QhdSl`

Спробуйте в Інтернеті!

Пояснення

             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

Альтернативне рішення , ще 13 байт (завдяки karlkastor )

qi_.e%Q+2k`QT

Спробуйте в Інтернеті! Це по суті те саме, що і перше рішення, за винятком того, що воно використовує iдля перетворення з масиву чисел у число, і що діапазон генерується по-різному.


1
Ви можете замінити ss`M_з , jk_щоб зберегти 2 байти.
Okx

@Okx мені це потрібно, оскільки jвиводить рядок, тоді як мені потрібно число для порівняння з вхідним (що є числом).
Джим

1
Ще 13-байтним рішенням буде: qi_.e%Q+2k`QTвикористання переліченої карти ( .e) замість карти. І перетворення залишків у базові 10 int зі списку замість використання приєднання.
КарлКастор

2

C ++, 104 байти

1) оригінальна версія:

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) у читаній формі:

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

Спробуйте в Інтернеті!



1

Python 2 , 66 60 58 57 байт

  • Завдяки монахині @Leaky за 6 байт: видаліть непотрібне x and(не слід перевіряти 0)
  • Завдяки @Einkorn Enchanter за 1 байт: використання enumerate
lambda x:all(a==`x%(i+2)`for i,a in enumerate(`x`[::-1]))

Спробуйте в Інтернеті!



Дякую. І гей, я тільки що зрозумів , ти був майстер пшениця ..: D
officialaimm

1

Пітон 3: 63 байт

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

Якби я міг порахувати, скільки разів я хотів, щоб «перерахувати» були коротшими ...

Спробуйте в Інтернеті!


Так, і я щойно зрозумів, що це точно так само, як відповідь @officialaimm дав ... Чи повинен я видалити?
bendl

Їхній склад знаходиться в python 2, і ви придумали його самостійно, тому я залишив би його.
Пшеничний майстер

Можна зберегти два байти, розпочавши перерахування на 2 та переставивши логічне:lambda m:all(m%n==int(x)for n,x in enumerate(str(m)[::-1],2))
nocturama


1

Java 8, 156 149 байт

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

Безумовно:

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

Спробуйте в Інтернеті!

ОНОВЛЕННЯ:
-7 байт : видалено марно {}і замінено Integer.parseInt(...)на new Integer(...)
-9 байт : завдяки Кевіну Крейсейну видалено купу непотрібних (), які використовуються Longзамість Integerі printзамість println. Дякую Кевін!


1
Приємна відповідь, +1 від мене. До речі, деякі невеликі речі для гольфу: new Integerможуть бути new Long(-3 байти); printlnможе бути print(-2 байти); і ви можете видалити довколишні дужки new Long(s[0])%i+f;(-4 байти).
Kevin Cruijssen

Дійсно приємно! Дякую, я оновлю це!
Алекс Ферретті



0

q / kdb +, 34 байт

Рішення:

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

Приклад:

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

Пояснення:

Закиньте номер введення в рядок, рахуйте від 0.. довжини рядка, додайте 2 до всіх, переверніть його і modвведіть кожне число разом з оригінальним вводом. Закиньте результат мода в рядок і зменшіть список, перевірте, чи він дорівнює рядку вхідного номера:

{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

Примітки:

Більшість рішень - це генерування 2,3,4..списку, у мене є ще одне рішення, яке робить менше матеріалів, але закінчується 37 байт після гри в гольф:

{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 байт

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

Введення - це рядок, використовуючи, mapа кінцевий результат %закінчується коротшим, ніж for[i(range(count %))]підхід.


0

Хаскелл, 62 байти

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

Замість того, щоб обертати (нескінченний) список модулів, він скорочує список, перетягуючи його за допомогою перевернутої рядкової репрезентації інтеграла x, яка потім забезпечує рівне значення елементів.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.