Czy to numer klatki schodowej?


15

Wyzwanie:

Sprawdź, czy podana liczba stanowi a, number staircaseczy nie


Wejście :

Liczba całkowita (większa niż 0 i nie dziesiętna). UWAGA: Dane wejściowe można traktować jako ciąg znaków, tablicę cyfr.


Wynik :

wartość prawda / fałsz w zależności od tego, czy liczba tworzy schody, czy nie


Liczba schodów:

Numer klatka schodowa jest liczbą całkowitą, gdy czytane od lewej do prawej:

  • Zaczyna się od 1
  • po którym może następować 2
  • po którym może nastąpić 3
  • i tak dalej n
  • następnie liczba spada od n - 1
  • następnie n - 2
  • następnie n - 3
  • i tak dalej, aż osiągnie 1

Uwaga :

Część może być używana do wskazania, że ​​jeśli długość> jest większa niż 1. Jeśli tak jest, należy postępować zgodnie z kolejnością. tj .: 12321


Przykład:

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

Uwaga :

Podane dane wejściowe zawsze będą liczbami całkowitymi większymi niż 0 i nie będą dziesiętne. Twój wynik musi być truthy or falsywartością zależną od danych wejściowych


Ograniczenia:

To jest więc wygrywa najkrótszy kod w bajtach (dla każdego języka programowania).



2
Czy możemy przyjmować dane wejściowe jako listę cyfr? Jak [1,2,3,4,5,6,7,8,9,1,0,1,1,1,0,9,8,7,6,5,4,3,2,1]dla 123456789101110987654321?
Pan Xcoder

@ Mr.Xcoder: Wolałbym, gdybyś tego nie zrobił, ale myślę, że możesz
Muhammad Salman

Czy istnieje górny limit na wejściu?
mypetlion

@mypetlion: Nie bardzo, jest tak wysoki, jak twój kod może obsługiwać (z wyjątkiem tych zakodowanych na stałe i celowo niskich). Zwykle najwyższy twój język może obsługiwać (ale nie w tym przypadku)
Muhammad Salman

Czy możemy wziąć ciąg znaków jako dane wejściowe do funkcji? (czy to tylko akceptowalne dane wejściowe dla pełnego programu?)
Jonathan Allan

Odpowiedzi:


5

R , 97 bajtów

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)

Wypróbuj online!

Przyjmuje njako a characterlub an integer; użycie characterda poprawne wyniki dla liczb całkowitych, których nie można dokładnie odczytać jako 64-bit double.

Generuje numery schodów, dopóki nie znajdzie jednego co najmniej tak długo, jak nto jest, a następnie sprawdza równość.

Równoważny:

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)


Nie zastępując function(n)ze n=scan();być krótszy? (oczywiście dla liczb całkowitych)
pajonk

@pajonk Chyba tak. Ale powiem, że biorę to jako ciąg, więc ta odpowiedź jest poprawna dla większych danych wejściowych.
Giuseppe


3

JavaScript (ES6), 62 57 bajtów

Zaoszczędzono 2 bajty dzięki @ l4m2

Zwraca wartość logiczną.

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

Wypróbuj online!

W jaki sposób?

Zaczynając od k = 1 , szukamy k na początku i na końcu łańcucha, i rekurencyjnie iterujemy proces na pozostałym środkowym podciągu z k + 1 . Rekursja kończy się, gdy tylko nie ma już żadnego dopasowania. Dane wejściowe to numer klatki schodowej, jeśli ostatni podciąg jest równy k .

Przykład dla 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    

55 bajtów . Załóżmy, że 0 to prawda, a zero jako fałsz (nie dokładnie to określił,

Hum Nie widziałem tego przypuszczenia, które jest nieprawidłowe. Przepraszamy

@ I'mnoone Nie martw się! Co ciekawe, usunięcie m[0]==s&zamiast tego sprawi, że przejdzie wszystkie przypadki testowe (ale nadal nie powiedzie się na innych, takich jak "123217").
Arnauld

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


2

Pyth, 13 12 bajtów

/mjk+Sd_Stdl

Zapisano bajt dzięki RK.
Wypróbuj tutaj

Wyjaśnienie

/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.

Jeśli naprawdę chcesz, aby dane wejściowe były liczbą całkowitą, możesz użyć }Qmsjk+Sd_Stdzamiast tego, ale jest to przerażająco powolne.


możesz użyć /zamiast, }Qaby automatycznie uzupełniało się Qna końcu
RK.


2

C # (interaktywny kompilator Visual C #) , 138 107 102 bajtów

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

Wypróbuj online!

Wyjaśnienie:

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?

W rzeczywistości Zip...Skipmetoda z poprzedniego komentarza zawodzi [1,1], co powinno wrócić, truejeśli rozumiem specyfikację. Usunąłem to.
benj2240

W każdym razie dzięki! Nigdy wcześniej nie korzystałem z Zip, ale teraz widzę, jak może być przydatny.
Kahzaar

1

05AB1E , 9 8 bajtów

L€L€ûJså

Ostrzeżenie: BARDZO WOLNY! Dodaj gdo początku, aby przyspieszyć.

Wypróbuj online!

Wyjaśnienie:

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?

Stare objaśnienie:

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

Wypróbuj online!


Palindromize? Co to robi? Ponieważ, jak
zapewne

@YassinHajaj To palindromizuje tablicę, a nie ciąg
Okx

W porządku dzięki za informację
Yassin Hajaj

@YassinHajaj gLη€ûJsåto kolejny, w którym można zobaczyć wektoryzację palindromizacji za pomocą €ûpalindromize każdego.
Magic Octopus Urn

@okx gLη€ûJsådla 8 bajtów, które nie wysadzają TIO.
Magic Octopus Urn

1

Python 2 , 77 bajtów

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

Wypróbuj online!


Zapisz cztery, akceptując liczbę całkowitą, jeśli możemy popełnić błąd po trafieniu w tęsknotę: TIO . Do tego czasu potrzebowalibyśmy sporo czasu i pamięci!
Jonathan Allan


1

Attache , 57 55 46 bajtów

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

Wypróbuj online! Ach, to o wiele bardziej eleganckie.

Z Generate(49 bajtów):

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

Wyjaśnienie

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

Funkcja generacji po prostu tworzy Nnumer klatki schodowej. Następnie wyszukiwanie kończy się, gdy `>=:`#&_jest spełnione. Po rozwinięciu jest to:

 `>=:`#&_
 (`>= : `#) & _      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] }

Kończy się to, gdy długość danych wyjściowych funkcji generowania jest co najmniej długością wejść. W ten sposób generowany jest najmniejszy numer klatki schodowej co najmniej tak długi jak numer wejściowy. Tak więc, jeśli dane wejściowe to numer klatki schodowej, wynikiem będzie ten sam numer klatki schodowej, a w przeciwnym razie następny najdłuższy numer klatki schodowej. Jako taki wystarczy proste sprawdzenie z równością z oryginalnym wejściem, aby ustalić, czy był to numer klatki schodowej.

Attache, 55 bajtów

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

Wypróbuj online! Z planem rekurencji.




1

K , 36 bajtów

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

Pobiera ciąg taki jak „12321” jako parametr.

Ta funkcja jest napisana jako długi łańcuch aplikacji funkcyjnych, jak w f g h x, więc czytaj komentarze od dołu, idąc w górę. {x+1}to lambda x: x+1x jest domyślną nazwą parametru. Sprawdź https://pastebin.com/cRwXJn7Z lub pomoc tłumacza dla znaczeń operatora.

Generujemy numer klatki schodowej nw środku przez {,/$(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

Cała funkcja {|/($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]

0

Haskell , 64 60 58 bajtów

-6 dzięki @BMO!

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

Wypróbuj online!


Teoretycznie działa 12345678910987654321, jeśli jesteś w stanie zbudować listę z tylu elementów.
Esolanging Fruit

@ BMO Wiedziałem, że musi być na to sposób. Dzięki
Esolanging Fruit

@BMO Twój golf jest naprawdę oczywisty z perspektywy czasu
Esolanging Fruit

Jest również bardzo blisko, zasugerowałbym to jako ulepszenie, gdybym go jeszcze nie opublikował (nie widziałem twojego, dopóki nie opublikowałem mojego).
ბიმო


0

Java 10, 142 bajty

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

Wypróbuj online.

Wyjaśnienie:

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

0

Japt, 11 bajtów

Pobiera dane wejściowe jako ciąg.

Êõõ mê m¬øU

Spróbuj


Wyjaśnienie

                :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?

Alternatywnie, 10 9 bajtów

To rozwiązanie, które może przyjmować dane wejściowe jako ciąg lub liczbę całkowitą, zwróci tablicę liczb dla prawdy lub, w końcu, wygeneruje błąd dla falsey, jeśli wcześniej nie okaleczy twojej przeglądarki. Używaj ostrożnie.

@¥Xê q}aõ

Spróbuj


0

Siatkówka , 45 43 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Edycja: Zapisano 2 bajty dzięki @Leo. Wyjaśnienie:

$
;1

Zainicjuj ndo 1.

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

Podczas gdy szaczyna się i kończy na n:

$2;$.(_$1*

Usuń nz końców si przyrostu n.

^(.+);\1$

Sprawdź, czy nzostało.


Myślę, że twoje \dmogą stać się .i uratować ci dwa bajty
Leo


-1

Dzięki następującym użytkownikom:

@Nooneishere
@LyricLy
@JoKing

Python 2 , 147 bajtów

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

Wypróbuj online!


Wyjście nie musi być struny truei falseale truthy i falsey wartości. 1i 0działałby na przykład
dylnan

@dylnan: Właśnie to przeczytałem, dzięki. Wciąż gra w golfa (dużo do zrobienia)

Nie możesz po prostu użyć s[0]zamiast startswith? Błędy są dozwolone i można powiedzieć „wyjścia 1 dla schodów, cokolwiek innego (łącznie z niczym) [ponieważ stderrr jest ignorowany] dla nie-schodów”.
NoOneIsHere

@NoOneIsHere: dobry pomysł. najwyraźniej kodowanie podczas snu nie jest tak dobrym pomysłem dzięki

1
Twoje 138-bajtowe rozwiązanie zawsze zwraca wartość Fałsz, ponieważ gnigdy nie jest 1. Powinieneś przetestować te rozwiązania przed opublikowaniem ich ...
Jo King
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.