Numery schodów

29

Liczba na klatce schodowej jest dodatnią liczbą całkowitą x, tak że jej n- ta cyfra (jedna indeksowana zaczynająca się od najmniej znaczącej cyfry) jest równa x% (n + 1) . To trochę kęs, więc spójrzmy na przykład. Weźmy 7211311 , jeśli weźmiemy pozostałości modułowe 7211311 w zakresie 2-8, otrzymamy:

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

To są cyfry 7211311 ! Zatem 7211311 jest numerem klatki schodowej.

Zadanie

Napisz kod, który przyjmuje, gdy podana zostanie liczba dodatnia, wyświetli dwie różne wartości, jedną, jeśli liczba jest liczbą na klatce schodowej, a drugą, jeśli nie jest.

To zawody w , więc twoim celem powinno być zminimalizowanie liczby bajtów w kodzie źródłowym.

Przypadki testowe

Oto pierwsze 13 numerów schodów:

1, 10, 20, 1101, 1121, 11311, 31101, 40210, 340210, 4620020, 5431101, 7211311, 12040210
Kreator pszenicy
źródło
Czy nie 0ma numerów schodów? Wiele odpowiedzi tak uważa.
Okx,
3
@Okx zadaniem jest tylko odróżnienie dodatnich liczb schodów od dodatnich liczb niebędących schodami, więc zachowanie jest niezdefiniowane dla 0 i liczb ujemnych.
Paŭlo Ebermann

Odpowiedzi:

10

Haskell, 55 57 bajtów

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

Inne podejście niż inne rozwiązanie Haskell.

Dzięki xnor za zapisanie 2 bajtów.

Silvio Mayolo
źródło
4
Możesz użyć tej wskazówki, aby skrócić letwyrażenie.
xnor
Inne, krótsze podejście. Dobra robota! +1
qfwfq
9

Brachylog , 25 21 16 14 bajtów

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

Wypróbuj online!

Pierwsze zgłoszenie Brachyloga: D prawdopodobnie bardzo nie golfisty ... wielkie dzięki Dziurawej Zakonnicy i Fatali za zachęty i pomoc w grze w golfa od 25 do 14 lat :)

Erik the Outgolfer
źródło
7

JavaScript, 42 41 39 38 bajtów

-4 bajty dzięki @Shaggy i @ETHProductions

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

Pobiera liczbę jako ciąg znaków i zwraca, falsejeśli liczba jest liczbą na klatce schodowej i w trueprzeciwnym razie.

Przykładowy fragment kodu:

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">

Herman L.
źródło
2
Powinieneś być w stanie porzucić, !ponieważ wyzwanie nie określa wprost, że musisz zwrócić wartość truetrue, a falsefalse - po prostu musisz zwrócić 2 różne wartości.
Shaggy
2
To bardzo dobrze gra w golfa, dobra robota. Myślę, że powinieneś być w stanie wycisnąć jeszcze dwa bajty, jeśli isię s=>[...s].some(d=>s%i--^d,i=s.length+1)
wyliczysz
2
Właściwie, wykorzystując fakt, że ~x == -(x+1)na liczbach całkowitych i x%-y == x%ymyślę, że można uzyskać jeszcze jeden:s=>[...s].some(d=>s%i++^d,i=~s.length)
ETHprodukcje
6

05AB1E , 6 bajtów

Kod:

ā>%JRQ

Wykorzystuje kodowanie 05AB1E . Wypróbuj online!

Wyjaśnienie:

ā        # 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
Adnan
źródło
6

Haskell, 60 bajtów

Pobiera liczbę jako liczbę całkowitą

x n|s<-show n=reverse s==(rem n.(+1)<$>[1..length s]>>=show)
qfwfq
źródło
5

Mathematica, 60 bajtów

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

Wypróbuj online!

@alephalpha grał w golfa do 48

Mathematica, 48 bajtów

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

następny to 24120020

J42161217
źródło
5

Japt , 9 7 bajtów

Pobiera dane wejściowe jako ciąg.

¥£%´JÃw

Sprawdź to

  • 2 bajty zapisane z pomocą ETHproductions.

Wyjaśnienie

Pośrednio bierzemy ciąg jako dane wejściowe.

£   Ã

Zamapuj każdy znak w ciągu.

´J

Jjest stałą Japt dla -1i ´zmniejsza ją o 1 przy każdym przejściu ( --w JavaScript). Tak więc przy pierwszym przejściu daje nam to -2.

%

Używamy tej wartości do wykonywania operacji modulo na ciągu wejściowym, który jest automatycznie rzutowany na liczbę całkowitą w tym procesie. W JavaScript x%-ydaje taki sam wynik jak x%y.

w

Odwróć powstały ciąg.

¥

Sprawdź, czy nowy ciąg znaków jest równy oryginalnemu wejściu i domyślnie wyślij wynik jako wartość logiczną.

Kudłaty
źródło
Cholera (Y+2, czuję, że może to być co najmniej 1 bajt krótszy ...
ETHproductions
1
... i może: ¥£%´JÃw:-) (działa, ponieważ x%y == x%-yw JS)
ETHprodukcje
Aha, tak, próbował kilku różnych rzeczy, aby sprowadzić te obliczenia do 2 bajtów.
Kudłaty
4

Neim , 6 bajtów

𝐧ᛖ𝕄𝐫𝐣𝔼

Wyjaśnienie:

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

Wypróbuj online!

Okx
źródło
@Thehx Jeśli chodzi o twoją edycję, Neim używa niestandardowego kodowania: ten
Okx,
2

Perl 6 , 32 bajty

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

Wypróbuj online!

  • .combto liczba znaków w reprezentacji ciągu argumentu wejściowego $_(to znaczy liczba cyfr).
  • 1 + .comb ... 2 to ciąg liczb od jednej większej niż liczba cyfr do 2.
  • «%«jest hyperoperator sprężystości, która daje resztę po $_argument wejściowy po jego lewej stronie, jest podzielona przez każdy z elementów sekwencji na jej prawej: $_ % 2, $_ % 3, ....
  • [~]łączy te cyfry w nową liczbę, która jest porównywana z argumentem wejściowym za pomocą operatora równości łańcucha eq.
Sean
źródło
2

Pyth , 13 bajtów

-1 bajtów dzięki Okx .

qsjk_m%QhdSl`

Wypróbuj online!

Wyjaśnienie

             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

Alternatywne rozwiązanie , wciąż 13 bajtów (dzięki Karlkastor )

qi_.e%Q+2k`QT

Wypróbuj online! Zasadniczo jest to to samo co pierwsze rozwiązanie, z tym wyjątkiem, że używa ido konwersji z tablicy liczb na liczbę i że zakres jest generowany inaczej.

Jim
źródło
1
Można wymienić ss`M_ze jk_aby zaoszczędzić 2 bajtów.
Okx,
@Okx Potrzebuję go, ponieważ jwyprowadza ciąg, podczas gdy potrzebuję liczby do porównania z danymi wejściowymi (czyli liczbą).
Jim
1
Kolejnym 13-bajtowym rozwiązaniem byłoby: qi_.e%Q+2k`QTużycie wyliczonej mapy ( .e) zamiast mapy. I przekształcanie reszty w podstawową liczbę całkowitą 10 z listy zamiast łączenia.
KarlKastor
2

C ++, 104 bajty

1) oryginalna wersja:

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) w czytelnej formie:

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

Wypróbuj online!

koita_pisw_sou
źródło
1

Python 2 , 66 60 58 57 bajtów

  • Dzięki @Leaky nun za 6 bajtów: usuń niepotrzebne x and(nie powinien sprawdzać 0)
  • Dzięki @Einkorn Enchanter za 1 bajt: użycie enumerate
lambda x:all(a==`x%(i+2)`for i,a in enumerate(`x`[::-1]))

Wypróbuj online!

Officialaimm
źródło
Dziękuję Ci. I hej, właśnie zdałem sobie sprawę, że jesteś czarodziejem pszenicy ..: D
officialaimm
1

Python 3: 63 bajtów

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

Gdybym mógł policzyć, ile razy chciałbym, żeby „wyliczyć” były krótsze ...

Wypróbuj online!

zginać
źródło
Tak, i właśnie zdałem sobie sprawę, że jest dokładnie taki sam jak odpowiedź udzielona przez @officialaimm ... Czy powinienem usunąć?
bendl
Ich jest w Pythonie 2 i wymyśliłeś go niezależnie, więc bym go zostawił.
Wheat Wizard
Można zapisać dwa bajty, rozpoczynając wyliczanie od 2 i lambda m:all(m%n==int(x)for n,x in enumerate(str(m)[::-1],2))
zmieniając
1

Java 8, 156 149 bajtów

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

Nie golfowany:

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

Wypróbuj online!

UPDATE:
-7 bajtów : usunięto bezużyteczny {}i zastąpione Integer.parseInt(...)przez new Integer(...)
-9 bajtów : dzięki Kevin Cruijssen, usuwa się masę bezużyteczne (), używane Longzamiast Integeri printzamiast println. Dzięki, Kévin!

Alex Ferretti
źródło
1
Dobra odpowiedź, +1 ode mnie. Btw, kilka małych rzeczy do golfa: new Integermoże być new Long(-3 bajty); printlnmoże być print(-2 bajty); i możesz usunąć otaczający nawias new Long(s[0])%i+f;(-4 bajty).
Kevin Cruijssen
Bardzo miłe ! Dzięki, zaktualizuję to!
Alex Ferretti
0

Python 2, 61 bajtów

lambda x:[`x%(n+2)`for n in range(len(`x`))][::-1]==list(`x`)
Daniel
źródło
Nie, twój nowy golf jest o bajt krótszy. :)
Wheat Wizard
0

q / kdb +, 34 bajty

Rozwiązanie:

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

Przykład:

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

Wyjaśnienie:

Rzuć liczbę wejściową na łańcuch, policz od 0.. długości łańcucha, dodaj 2 do wszystkich, odwróć i podaj każdą liczbę modwraz z oryginalnym wejściem. Rzuć wynik modu na ciąg znaków i zmniejsz listę, sprawdź, czy jest równa ciągowi liczby wejściowej:

{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

Uwagi:

Większość rozwiązań służy do generowania 2,3,4..listy, mam inne rozwiązanie, które robi mniej rzeczy, ale kończy się na 37 bajtach po grze w golfa:

{s~x mod'reverse 2 + til count s:("J"$) each string x} / ungolfed
{s~x mod'(|)2+til(#)s:("J"$)each($)x}                  / golfed
Streetster
źródło
0

Clojure, 75 bajtów

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

Dane wejściowe są ciągiem znaków, mapw którym końcowy %jest krótszy niż for[i(range(count %))]podejście.

NikoNyrh
źródło
0

Haskell, 62 bajty

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

Zamiast odwracać (nieskończoną) listę modułów, przycina listę, kompresując ją za pomocą odwróconej reprezentacji ciągu całki x, która następnie zapewnia, że ​​jest równa elementowi.

archaephyrryx
źródło
0

Perl 5 , 41 bajtów

39 bajtów kodu + 2 flagi -pa

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

Wypróbuj online!

Nie wyświetla nic (undef) dla numerów schodów, 1 dla czegokolwiek innego

Xcali
źródło