Ist das eine Treppennummer?

15

Herausforderung :

Überprüfen Sie, ob die angegebene Nummer eine bildet number staircaseoder nicht


Eingabe:

Eine Ganzzahl (größer als 0 und nicht dezimal). ANMERKUNG: Sie können Eingaben als Zeichenfolge oder als Array von Ziffern vornehmen.


Ausgabe :

Ein wahrer / falscher Wert, der davon abhängt, ob die Zahl eine Treppe bildet oder nicht


Anzahl Treppe:

Eine Zahlentreppe ist eine Ganzzahl, die von links nach rechts gelesen wird:

  • Beginnt mit 1
  • Darauf kann 2 folgen
  • Darauf kann 3 folgen
  • und so weiter bis n
  • dann steigt die Zahl ab n - 1
  • dann n - 2
  • dann n - 3
  • und so weiter bis es 1 erreicht

Hinweis :

Das kann Teil wird verwendet , wenn die Länge , um anzuzeigen , dass> größer als 1. Wenn die Reihenfolge beachtet werden muß , wie es ist. dh: 12321


Beispiel

12321                          ---> true
12345654321                    ---> true
9                              ---> false
1                              ---> true
2                              ---> false
123421                         ---> false
112312318901323                ---> false
123456789101110987654321       ---> true

Hinweis :

Die angegebene Eingabe ist immer eine Ganzzahl größer als 0 und keine Dezimalzahl. Ihre Ausgabe muss ein truthy or falsyWert sein, der von der Eingabe abhängt


Beschränkungen :

Dies ist so dass der kürzeste Code in Bytes (für jede Programmiersprache) gewinnt.


Muhammad Salman
quelle
2
Können wir Eingaben als Ziffernliste nehmen? Wie [1,2,3,4,5,6,7,8,9,1,0,1,1,1,0,9,8,7,6,5,4,3,2,1]für 123456789101110987654321?
Mr. Xcoder
@ Mr.Xcoder: Ich würde es vorziehen, wenn Sie nicht, aber ich denke, Sie können
Muhammad Salman
Gibt es eine Obergrenze für den Eingang?
Mypetlion
@mypetlion: Nicht wirklich, es ist so hoch, wie Ihr Code unterstützen kann (mit Ausnahme von hardcodierten und absichtlich niedrigen). Normalerweise die höchste Sprache, die Ihre Sprache unterstützen kann (aber nicht in diesem Fall)
Muhammad Salman
Dürfen wir eine Zeichenfolge als Eingabe für eine Funktion verwenden? (oder ist dies nur eine akzeptable Eingabe für ein volles Programm?)
Jonathan Allan

Antworten:

5

R 97 Bytes

function(n)"if"(n>1,{while({T=T+1;x=paste(c(1:T,T:2-1),collapse="");nchar(x)<nchar(n)})0;x==n},T)

Probieren Sie es online!

Nimmt nals ein characteroder ein integer; using characterliefert korrekte Ergebnisse für Ganzzahlen, die nicht genau als 64-Bit-Zahl angegeben werden können double.

Erzeugt so lange Treppenhausnummern, bis mindestens eine gefunden nwird, und prüft dann auf Gleichheit.

Gleichwertig:

function(n)
    if(n > 1){
        T <- T + 1
        x <- paste(c(1:T,T:2-1),collapse="")
        while(nchar(x) < nchar(n)){
            T <- T + 1
            x <- paste(c(1:T,T:2-1),collapse="")
        }
        return(x == n)
    } else
        return(TRUE)

Giuseppe
quelle
Wäre das Ersetzen function(n)durch n=scan();nicht kürzer? (für ganze Zahlen natürlich)
pajonk
@pajonk Ich denke schon. Aber ich werde sagen, ich nehme es als Zeichenfolge, damit diese Antwort für größere Eingaben richtig ist.
Giuseppe
3

Gelee , 5 Bytes

ŒḄ€Vċ

Probieren Sie es online!

Achtung: Sehr langsam (schnell für 1und 121)! Bereite dich DLdarauf vor, es schneller zu machen.

Erik der Outgolfer
quelle
3

JavaScript (ES6), 62.57 Byte

2 Bytes gespart dank @ l4m2

Gibt einen Booleschen Wert zurück.

f=(s,k=1)=>(m=s.match(`^${k}(.*)${k}$`))?f(m[1],k+1):s==k

Probieren Sie es online!

Wie?

Beginnend mit k = 1 suchen wir am Anfang und am Ende des Strings nach k und wiederholen den Vorgang für den verbleibenden mittleren Teilstring rekursiv mit k + 1 . Die Rekursion stoppt, sobald keine Übereinstimmung mehr vorhanden ist. Die Eingabe ist eine Treppennummer, wenn der letzte Teilstring gleich k ist .

Beispiel für s = "1234321":

 k | s         | match     | s == k 
---+-----------+-----------+--------
 1 | "1234321" | 1(23432)1 | no     
 2 | "2343"    | 2(343)2   | no     
 3 | "343"     | 3(4)3     | no     
 4 | "4"       | null      | yes    
Arnauld
quelle
55 Bytes . Angenommen, 0 als wahr und null als falsch (er nicht genau angegeben hat er)
Hm, ich habe diese Vermutung nicht gesehen, die ungültig ist. Sorry
@ I'mnoone Keine Sorge! Interessanterweise m[0]==s&würde das Entfernen stattdessen dazu führen, dass alle Testfälle bestanden werden (bei anderen Fällen wie "123217").
Arnauld
f=(s,k=1)=>(m=s.match(`^${k}(.*)${k}$`))?f(m[1],k+1):s==k?
14 m 2
2

Pyth, 13 12 Bytes

/mjk+Sd_Stdl

Dank RK ein Byte gespeichert.
Probieren Sie es hier aus

Erläuterung

/mjk+Sd_Stdl
 m         lQ   For each d up to the length of the (implicit) input...
    +Sd_Std     ... get the list [1, 2, ..., d, d-1, ..., 1]...
  jk            ... concatenated.
/               Count how many times the input appears.

Wenn Sie die Eingabe wirklich als Ganzzahl wünschen, können Sie sie }Qmsjk+Sd_Stdstattdessen verwenden, dies ist jedoch erschreckend langsam.


quelle
Sie können /stattdessen verwenden, }Qdamit es Qam Ende automatisch vervollständigt wird
RK.
2

C # (Visual C # Interactive Compiler) , 138 107 102 Byte

bool t(List<int>s)=>s.Select((j,i)=>s[0]==1&&s.Last()==1&&(i==0||j+1==s[i-1]||j-1==s[i-1])).All(x=>x);

Probieren Sie es online!

Erläuterung:

bool t(List<int>s)=>
    s.Select((j,i) =>         //iterate over each item and store the return value
        s[0]==1&&s.Last()==1  //does the sequence start and end with 1?
        &&                    //AND
        (i==0                 //is it the first item?
        ||                    //OR
        j+1==s[i-1]           //is the item 1 greater than the previous?
        ||                    //OR
        j-1==s[i-1])          //is the item 1 smaller than the previous?
    ).All(x=>x);              //did all pass the criteria?
Kahzaar
quelle
Eigentlich Zip...Skipschlägt die Methode in meinem vorherigen Kommentar fehl [1,1], die zurückkehren sollte, truewenn ich die Spezifikation verstehe. Ich habe es gelöscht.
benj2240
Danke trotzdem! Ich habe Zip noch nie benutzt, aber ich sehe jetzt, wie nützlich es sein kann.
Kahzaar
1

05AB1E , 9 8 Bytes

L€L€ûJså

Warnung: EXTREM LANGSAM! gZum Anfang addieren , um es zu beschleunigen.

Probieren Sie es online!

Erläuterung:

L           1..input
 €L         for each element, map to 1..element 
   €û       palindromize each element
     J      join each element from a list to a string
      så    is the input in that list?

Alte Erklärung:

F           For [0 .. input] map over
 NL          Push 1..i
   û         Palindromize
    J        Join
     ¹       First input
      Q      Equal?
       }   end loop
        O  Sum.

Probieren Sie es online!

Okx
quelle
Palindromize? Was macht das? Denn wie Sie vielleicht wissen, sind die Treppen mit 10+ keine Palindrome
Yassin Hajaj
@ YassinHajaj Es palindromisiert das Array, nicht die Zeichenfolge
Okx
Okay, danke für die Info
Yassin Hajaj
@YassinHajaj gLη€ûJsåist eine andere, bei der Sie die Vektorisierung der Palindromisierung mit €ûpalindromize anzeigen können .
Magic Octopus Urn
@okx gLη€ûJsåfür ein 8-Byte, das TIO nicht in die Luft jagt.
Magic Octopus Urn
1

Python 2 , 77 Bytes

lambda s,r=range:s in[''.join(map(str,r(1,k+2)+r(k,0,-1)))for k in r(len(s))]

Probieren Sie es online!

Lynn
quelle
Speichern Sie vier, indem Sie eine Ganzzahl akzeptieren, wenn wir einen Fehler machen, sobald wir longs treffen: TIO . Bis dahin würden wir sowieso einige Zeit und Gedächtnis brauchen!
Jonathan Allan
1

Attache , 57 55 46 Bytes

{GenerateFirst[N@Join@Bounce@1&`:,`>=:`#&_]=_}

Probieren Sie es online! Ah, das ist viel eleganter.

Mit Generate(49 Bytes):

{g@Generate[{g@_>=#_2}&_]=_}g:=N@Join@Bounce@1&`:

Erläuterung

{GenerateFirst[N@Join@Bounce@1&`:,`>=:`#&_]=_}
{                                            }   anonymous lambda, argument: _
 GenerateFirst[                  ,        ]      find the first element satisfying...
               N@Join@Bounce@1&`:                    this generation function
                                  `>=:`#&_           and this condition
                                           =_    is it equal to the input?

Die Generierungsfunktion erstellt einfach die Nth Treppenhausnummer. Dann wird diese Suche beendet, sobald sie `>=:`#&_erfüllt ist. Erweitert ist dies:

 `>=:`#&_
 (`>= : `#) & _      NB. remember _ is the input
                     NB. also, f:g is f[...Map[g, args]]
 { #_1 >= #_2 } & _
 { Size[_1] >= Size[_2] } & _
 { Size[_1] >= Size[the original input] }
 [n] -> { Size[n] >= Size[input] }

Dies endet also, sobald die Länge der Ausgabe der Erzeugungsfunktion mindestens der der Eingaben entspricht. Dadurch wird die kleinste Treppennummer generiert, die mindestens so lang ist wie die eingegebene Nummer. Wenn es sich bei der Eingabe um eine Treppennummer handelt, ist das Ergebnis dieselbe Treppennummer und ansonsten die nächstlängste Treppennummer. Daher ist eine einfache Überprüfung mit Gleichheit zur ursprünglichen Eingabe ausreichend, um festzustellen, ob es sich um eine Treppennummer handelt oder nicht.

Attache, 55 Bytes

0&{If[#_2>#g[_],$[_+1,_2],_2=g!_]}g:=N@Join@Bounce@1&`:

Probieren Sie es online! Mit dem Plan der Rekursion.

Conor O'Brien
quelle
1

J , 40 Bytes

1#.[:(<-:"_1<@([:;>:<@":@-|@i:)@<:@#\)":

Probieren Sie es online!

Ich bin nicht ganz glücklich mit dieser Lösung - viel @und Boxen <.

Galen Ivanov
quelle
1

SNOBOL4 (CSNOBOL4) , 109 Bytes

	N =INPUT
	X =L ='1'
C	R =LT(SIZE(L R),SIZE(N)) X R	:F(O)
	X =X + 1
	L =L X	:(C)
O	OUTPUT =IDENT(L R,N) 1
END

Probieren Sie es online!

Seltsamerweise führt das Ersetzen '1'in der zweiten Zeile mit zum 1Fehlschlagen des Programms bei der Eingabe von 1.

Giuseppe
quelle
1

K , 36 Bytes

{|/($x)~/:{,/$(1+!x),1+1_|!x}'1+!#x}

Nimmt einen String wie "12321" als Parameter.

Diese Funktion ist wie in einer langen Kette von Funktionsanwendungen geschrieben. f g h xLesen Sie daher die kommentierten Versionen von unten nach oben. {x+1}ist lambda x: x+1, x ist ein Standard-Parametername. Lesen Sie https://pastebin.com/cRwXJn7Z oder die Hilfe des Interpreters, um die Bedeutung des Operators zu erfahren.

Wir generieren die Treppennummer mit nin der Mitte durch {,/$(1+!x),1+1_|!x}:

{,/                      / join all the chars
   $                     / tostring each number
     (1+!x)              / take the range [0..x-1]; add 1 to each
            ,            / concat
             (1+1_|!x)}  / take the range [0..x-1]; reverse it; drop 1; add 1 to each

Die ganze Funktion {|/($x)~/:{,/$(1+!x),1+1_|!x}'1+!#x}:

{|/                                   / any_is_true
   ($x)~/:                            / match the string with each of the generated staircases
          {,/$(1+!x),1+1_|!x}'        / make staircase number of each of the numbers
                                      / (note: the x in the inner lambda shadows the outer x)
                              1+!#x}  / take the range [1..length of the string, inclusive]
uryga
quelle
0

Haskell , 64 60 58 Bytes

-6 danke an @BMO!

elem.show<*>(`take`[[1..n]++[n-1,n-2..1]>>=show|n<-[1..]])

Probieren Sie es online!

Esolanging Fruit
quelle
Theoretisch funktioniert das 12345678910987654321, wenn Sie eine Liste mit so vielen Elementen erstellen können.
Esolanging Fruit
@BMO Ich wusste, dass es einen Weg geben musste, das zu tun. Thanks
Esolanging Fruit
@BMO Ihr Golf ist im Nachhinein wirklich offensichtlich ...
Esolanging Fruit
Es ist auch sehr nah, ich hätte es als Verbesserung vorgeschlagen, wenn ich es nicht schon gepostet hätte (ich habe deins nicht gesehen, bis ich meins gepostet habe).
1.
0

Perl 5 -lp , 49 Bytes

$i++while s/^$i//;$i-=2;$i--while s/^$i//;$_||=$i

Probieren Sie es online!

0 = wahr, alles andere = falsch

Xcali
quelle
0

Java 10, 142 Bytes

s->{int n=1,l,f=1;try{for(;;s=s.substring(l=(n+++"").length(),s.length()-l))if(!s.matches(n+".*"+n)&!s.equals(n+""))f=0;}finally{return f>0;}}

Probieren Sie es online aus.

Erläuterung:

s->{                 // Method with String parameter and boolean return-type
  int n=1,           //  Stair integer, starting at 1
      l,             //  Length integer to reduce bytes
      f=1;           //  Result-flag, starting at 1
  try{for(;;         //  Loop until an error occurs
          s=s.substring(l=(n+++"").length(),s.length()-l))
                     //    After every iteration: remove `n` from the sides of the String
        if(!s.matches(n+".*"+n)
                     //   If the current String with the current `n` isn't a stair
           &!s.equals(n+""))
                     //   And they are also not equal (for the middle)
          f=0;       //    Set the flag to 0
   }finally{         //  After the error (StringOutOfBoundsException) occurred:
      return f>0;}}  //   Return whether the flag is still 1
Kevin Cruijssen
quelle
0

Japt, 11 Bytes

Übernimmt die Eingabe als Zeichenfolge.

Êõõ mê m¬øU

Versuch es


Erläuterung

                :Implicit input of string U
Ê               :Length of U
 õ              :Range [1,Ê]
  õ             :Range [1,el] for each element
    mê          :Map & palidromise
       m¬       :Map & join
         øU     :Contains U?

Alternativ 10 9 Bytes

Diese Lösung, die Eingaben als Zeichenfolge oder Ganzzahl annehmen kann, gibt ein Array von Zahlen für die Richtigkeit zurück oder gibt schließlich einen Fehler für die Falschmeldung aus, wenn Ihr Browser zuvor nicht lahmgelegt wird. Mit Vorsicht verwenden.

@¥Xê q}aõ

Versuch es

Zottelig
quelle
0

Retina , 45 43 Bytes

$
;1
+`^(.+)(.*)\1;\1$
$2;$.(_$1*
^(.+);\1$

Probieren Sie es online! Link enthält Testfälle. Bearbeiten: 2 Bytes dank @Leo gespeichert. Erläuterung:

$
;1

Initialisiere nauf 1.

+`^(.+)(.*)\1;\1$

Während sbeginnt und endet mit n:

$2;$.(_$1*

Löschen Sie nvon den Enden sund erhöhen Sie n.

^(.+);\1$

Testen Sie, ob nnoch etwas übrig ist.

Neil
quelle
Ich denke dein \ds kann werden .und dir zwei Bytes sparen
Leo
0

Regex (PCRE) , 92 Bytes

^(1|\d(?=1|9)|[2-79](?=8)|[2-68](?=7)|[2-57](?=6)|[2346](?=5)|[235](?=4)|[24](?=3)|3(?=2))+$

Probieren Sie es online!

Ich bin offen für Vorschläge, um dies zu verbessern.

Neil
quelle
-1

Vielen Dank an folgende Benutzer:

@Nooneishere
@LyricLy
@JoKing

Python 2 , 147 Bytes

g=s=input()
f=1
o='1'==s[0]
while`f`==s[0]:s=s[len(`f`):];f+=1
f-=2
o&=`f`==s[0]
while s and`f`==s[0]:s=s[len(`f`):];f-=1
o&=f==0
o|=g=='1'
print o

Probieren Sie es online!


quelle
Der Ausgang muss nicht die Saiten sein trueund falsedoch truthy und Falsey Werte. 1und 0würde zum Beispiel
funktionieren
@dylnan: Ich habe das gerade gelesen, danke. Noch Golfen (viel zu
Könnten Sie nicht einfach s[0]statt verwenden startswith? Fehler sind zulässig, und Sie können sagen, dass "1 für Treppenhaus ausgegeben wird, alles andere (einschließlich nichts) [da stderrr ignoriert wird] für Nicht-Treppenhaus".
NoOneIsHere
@NoOneIsHere: gute Idee. anscheinend Codierung im Schlaf ist keine so gute Idee, danke
1
Ihre 138-Byte-Lösung gibt immer False zurück, da sie gniemals 1 ist. Sie sollten diese Lösungen wahrscheinlich testen , bevor Sie sie veröffentlichen ...
Jo King