Treppenhausnummern


29

Eine Treppennummer ist eine positive Ganzzahl x , sodass ihre n- te Ziffer (eine, die mit der niedrigstwertigen Ziffer beginnt) gleich x% (n + 1) ist . Das ist ein bisschen mundvoll, also schauen wir uns ein Beispiel an. Nehmen wir 7211311 , wenn wir die modularen Reste von 7211311 im Bereich 2-8 nehmen, erhalten wir Folgendes:

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

Das sind die Ziffern von 7211311 ! Somit ist 7211311 eine Treppennummer .

Aufgabe

Wenn Sie einen Code schreiben, der eine positive Zahl als Eingabe annimmt, werden zwei unterschiedliche Werte ausgegeben, einer, wenn es sich um eine Treppennummer handelt, und der andere, wenn dies nicht der Fall ist.

Dies ist ein Wettbewerb, daher sollte Ihr Ziel darin bestehen, die Anzahl der Bytes in Ihrem Quellcode zu minimieren.

Testfälle

Hier sind die ersten 13 Treppennummern:

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

Ist nicht 0eine Treppe Nummern? Viele Antworten glauben es.
Okx

3
@Okx Die Aufgabe besteht nur darin, positive Treppennummern von positiven Nicht-Treppennummern zu unterscheiden, sodass das Verhalten für 0 und negative Zahlen undefiniert ist.
Paŭlo Ebermann

Antworten:


10

Haskell, 55 57 Bytes

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

Ein anderer Ansatz als die andere Haskell-Lösung.

Danke xnor für das Speichern von 2 Bytes.


4
Mit diesem Tipp können Sie den letAusdruck verkürzen .
xnor

Ein anderer, kürzerer Ansatz. Gut gemacht! +1
qfwfq


7

Javascript, 42 41 39 38 Bytes

-4 Bytes dank @Shaggy und @ETHProductions

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

Dabei wird die Nummer als Zeichenfolge verwendet und zurückgegeben, falsewenn es sich bei der Nummer um eine Treppennummer handelt, trueandernfalls.

Beispielcode-Snippet:

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
Sie sollten in der Lage sein, das zu löschen, !da die Abfrage nicht explizit angibt, dass Sie truefür true und falsefür false zurückgeben müssen, sondern lediglich zwei unterschiedliche Werte zurückgeben müssen.
Shaggy

2
Das ist sehr gut gelungen, gut gemacht. Ich denke, Sie sollten in der Lage sein, zwei weitere Bytes herauszudrücken, wenn Sie sich iselbst berechnen :s=>[...s].some(d=>s%i--^d,i=s.length+1)
ETHproductions

2
Tatsächlich kann man, wenn man die Tatsache ausnutzt, dass ~x == -(x+1)bei ganzen Zahlen und x%-y == x%y, glaube ich, eine weitere erhalten wird:s=>[...s].some(d=>s%i++^d,i=~s.length)
hinzukommt

6

05AB1E , 6 Bytes

Code:

ā>%JRQ

Verwendet die 05AB1E- Codierung. Probieren Sie es online!

Erläuterung:

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

Nimmt die Nummer als int

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]==#&

Probieren Sie es online!

@alephalpha spielte es auf 48

Mathematica, 48 Bytes

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

Das nächste ist 24120020



5

Japt , 9 7 Bytes

Übernimmt die Eingabe als Zeichenfolge.

¥£%´JÃw

Probier es aus

  • 2 Bytes gespart mit Hilfe von ETHproductions.

Erläuterung

Wir nehmen implizit den String als Eingabe.

£   Ã

Ordnen Sie jedes Zeichen in der Zeichenfolge zu.

´J

Jist die Japt-Konstante für -1und ´dekrementiert sie bei jedem Durchgang um 1 ( --in JavaScript). Das gibt uns also beim ersten Durchgang -2.

%

Wir verwenden diesen Wert, um eine Modulo-Operation für die Eingabezeichenfolge auszuführen, die dabei automatisch in eine Ganzzahl umgewandelt wird. In JavaScript x%-yergibt sich das gleiche Ergebnis wie x%y.

w

Kehre die resultierende Zeichenfolge um.

¥

Überprüfen Sie, ob die neue Zeichenfolge der ursprünglichen Eingabe entspricht, und geben Sie das Ergebnis implizit als Booleschen Wert aus.


Meine Güte (Y+2, ich glaube, das könnte mindestens 1 Byte kürzer sein ...
ETHproductions

1
... und es kann: ¥£%´JÃw:-) (funktioniert weil x%y == x%-yin JS)
ETHproductions

Aha, ja, versuchte ein paar verschiedene Dinge, um diese Berechnung auf 2 Bytes zu reduzieren.
Shaggy

4

Neim , 6 Bytes

𝐧ᛖ𝕄𝐫𝐣𝔼

Erläuterung:

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

Probieren Sie es online!


@Thehx Bezüglich Ihrer Bearbeitung verwendet Neim eine benutzerdefinierte Codierung: diese
Okx



2

Perl 6 , 32 Bytes

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

Probieren Sie es online!

  • .combist die Anzahl der Zeichen in der Zeichenfolgendarstellung des Eingabearguments $_(dh die Anzahl der Stellen).
  • 1 + .comb ... 2 ist die Zahlenfolge von eins größer als die Anzahl der Ziffern bis 2.
  • «%«ist der Modul-Hyperoperator, der den Rest ergibt, wenn $_das Eingabeargument auf der linken Seite durch jedes der Elemente der Sequenz auf der rechten Seite geteilt wird:$_ % 2, $_ % 3, ... .
  • [~]Verkettet diese Ziffern zu einer neuen Zahl, die mit dem Eingabeargument unter Verwendung des String-Gleichheitsoperators verglichen wird eq.


2

Pyth , 13 Bytes

-1 Bytes dank Okx .

qsjk_m%QhdSl`

Probieren Sie es online!

Erläuterung

             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

Alternative Lösung , noch 13 Bytes (danke an karlkastor )

qi_.e%Q+2k`QT

Probieren Sie es online! Dies ist im Wesentlichen dieselbe wie bei der ersten Lösung, mit der Ausnahme, dass das iArray von Zahlen in eine Zahl konvertiert wird und der Bereich unterschiedlich generiert wird.


1
Sie können ersetzen ss`M_mit jk_zu speichern 2 Byte.
Okx

@Okx Ich brauche es, weil es jeine Zeichenkette ausgibt, während ich eine Zahl brauche, um sie mit der Eingabe zu vergleichen (die eine Zahl ist).
Jim

1
Eine weitere 13-Byte-Lösung wäre: qi_.e%Q+2k`QTVerwenden von Enumerated Map ( .e) anstelle von Map. Und konvertieren Sie die Reste in eine Basis 10 int aus der Liste, anstatt Join zu verwenden.
Karl Kastor

2

C ++, 104 Bytes

1) ursprüngliche 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 lesbarer 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;
}

Probieren Sie es online!




1

Python 3: 63 Bytes

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

Wenn ich zählen könnte, wie oft ich wünschte, die Aufzählung wäre kürzer ...

Probieren Sie es online!


Ja, und ich habe gerade festgestellt, dass es genau dasselbe ist wie die Antwort, die @officialaimm gab ... Soll ich sie entfernen?
Bendl

Ihre Version ist in Python 2 und Sie haben sie unabhängig erstellt, damit ich sie verlassen kann.
Weizen-Assistent

Sie können zwei Bytes einsparen, indem Sie die Aufzählung bei 2 beginnen und die logische lambda m:all(m%n==int(x)for n,x in enumerate(str(m)[::-1],2))
Reihenfolge ändern


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

Probieren Sie es online!

UPDATE:
-7 Bytes : entfernt nutzlos {}und ersetzt Integer.parseInt(...)durch new Integer(...)
-9 Bytes : Dank Kevin Cruijssen, entfernt , um eine Reihe von nutzlos (), verwendet Longstatt Integerund printstatt println. Danke Kévin!


1
Schöne Antwort, +1 von mir. Übrigens, ein paar Kleinigkeiten zum Golfen: new IntegerKann new Long(-3 Bytes) sein; printlnkann sein print(-2 Bytes); und Sie können die umgebende Klammer entfernen new Long(s[0])%i+f;(-4 Bytes).
Kevin Cruijssen

Wirklich nett ! Danke, ich werde dies aktualisieren!
Alex Ferretti


0

Python 2, 61 Bytes

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

Nein, Ihr neuer Golf ist ein Byte kürzer. :)
Weizen-Assistent

0

q / kdb + 34 Bytes

Lösung:

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

Beispiel:

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

Erläuterung:

Wandeln Sie die eingegebene Nummer in eine Zeichenfolge um, zählen Sie ab der Länge der Zeichenfolge, addieren Sie 2 zu allen, kehren Sie sie um und geben Sie jede Zahl modzusammen mit der ursprünglichen Eingabe ein. Wandle das Ergebnis des Mods in eine Zeichenkette und reduziere die Liste. Überprüfe, ob es der Zeichenkette der eingegebenen Nummer entspricht:

{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

Anmerkungen:

Der Großteil der Lösung ist für das Generieren der 2,3,4..Liste, ich habe eine andere Lösung, die weniger Zeug macht, aber nach dem Golfen 37 Bytes ergibt:

{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)%)))

Die Eingabe ist eine Zeichenfolge, die verwendet, mapund das %Ende ist kürzer als der for[i(range(count %))]Ansatz.


0

Haskell, 62 Bytes

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

Anstatt die (unendliche) Liste von Modulen umzukehren, wird die Liste gekürzt, indem sie mit der umgekehrten Zeichenfolgenrepräsentation des Integrals x gezippt wird, wodurch sichergestellt wird, dass sie in Bezug auf die Elemente gleich ist.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.