Это номер лестницы?


15

Вызов :

Проверьте, образует ли данное число number staircase или нет


Вход:

Целое число (больше 0 и не десятичное). ПРИМЕЧАНИЕ: Вы можете принять ввод как строку, массив цифр.


Выход :

истинное / ложное значение в зависимости от того, образует ли число лестницу или нет


Номер лестницы:

Цифровая лестница - это целое число, которое при чтении слева направо:

  • Начинается с 1
  • за которым может следовать 2
  • за которым может следовать 3
  • и так до n
  • затем число уменьшается, начиная с n - 1
  • тогда n - 2
  • тогда n - 3
  • и так до тех пор, пока не достигнет 1

Замечания :

Часть может быть использована для указания того, что если длина> больше 1. Если это так, то порядок должен соблюдаться как есть. то есть: 12321


Пример :

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

Замечания :

Заданный ввод всегда будет целым числом больше 0 и не будет десятичным. Ваш вывод должен быть truthy or falsyзначением в зависимости от ввода


Ограничения:

Это поэтому выигрывает самый короткий код в байтах (для каждого языка программирования).



2
Можем ли мы принять ввод как список цифр? Как [1,2,3,4,5,6,7,8,9,1,0,1,1,1,0,9,8,7,6,5,4,3,2,1]для 123456789101110987654321?
г-н Xcoder

@ Mr.Xcoder: Я бы предпочел, если бы вы этого не сделали, но я думаю, что вы можете
Мухаммед Салман

Есть ли верхний предел на входе?
mypetlion

@mypetlion: Не совсем, он настолько высок, насколько может поддерживать ваш код (исключая жестко закодированные и заведомо низкие.) Обычно самый высокий, который может поддерживать ваш язык (но не в этом случае)
Мухаммад Салман

Можем ли мы взять строку символов в качестве входных данных для функции? (или это только приемлемый ввод для полной программы?)
Джонатан Аллан

Ответы:


5

R , 97 байт

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)

Попробуйте онлайн!

Принимает nкак characterили integer; использование characterдаст правильные результаты для целых чисел, которые не могут быть точно определены как 64-битныеdouble .

Генерирует лестничные числа, пока не найдет их хотя бы столько, сколько nесть, затем проверяет на равенство.

Эквивалентно:

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)


Не будет ли замена function(n)с n=scan();быть короче? (для целых чисел, конечно)
pajonk

@pajonk Я так полагаю. Но я скажу, что я воспринимаю это как строку, поэтому этот ответ верен для больших входных данных.
Джузеппе


3

JavaScript (ES6), 62 57 байт

Сохранено 2 байта благодаря @ l4m2

Возвращает логическое значение.

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

Попробуйте онлайн!

Как?

Начиная с k = 1 , мы ищем k в начале и в конце строки и рекурсивно повторяем процесс на оставшейся средней подстроке с помощью k + 1 . Рекурсия прекращается, как только больше нет совпадений. Вводом является номер лестницы, если последняя подстрока равна k .

Пример для 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 байтов . Предположим, что 0 является правдивым, а ноль - ложным (он точно не указал, не так ли)

Хм, я не видел это предположение, что это неверно. Извините

@ Я не беспокоюсь! Интересно, что удаление m[0]==s&вместо этого заставило бы пройти все тестовые случаи (но все равно не сработало на других, таких как "123217").
Арно

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


2

Pyth, 13 12 байт

/mjk+Sd_Stdl

Сохранил байт благодаря РК.
Попробуй здесь

объяснение

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

Если вы действительно хотите ввести как целое число, вы можете использовать }Qmsjk+Sd_Stdвместо этого, но это ужасно медленно.


/вместо }Qнего можно использовать автозаполнение Qв конце
РК.


2

C # (интерактивный компилятор Visual C #) , 138 107 102 байт

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

Попробуйте онлайн!

Объяснение:

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?

На самом деле, Zip...Skipметод в моем предыдущем комментарии терпит неудачу [1,1], который должен вернуться, trueесли я понимаю спецификацию. Я удалил это.
benj2240

Спасибо, в любом случае! Я никогда не использовал Zip раньше, но теперь я понимаю, как это может быть полезно.
Кахзаар

1

05AB1E , 9 8 байт

L€L€ûJså

Предупреждение: ЧРЕЗВЫЧАЙНО МЕДЛЕННО! Добавьте gк началу, чтобы ускорить его.

Попробуйте онлайн!

Объяснение:

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?

Старое объяснение:

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

Попробуйте онлайн!


Палиндромизировать? Что это делает? Потому что, как вы, наверное, знаете, на лестнице с 10+ нет палиндромов
Ясин Хаджай,

@YassinHajaj Это палиндромизирует массив, а не строку
Okx

Хорошо, спасибо за информацию
Ясин Хаджай,

@YassinHajaj gLη€ûJså- это еще один пример , где вы можете увидеть векторизацию палиндромизации, используя €ûкаждый палиндромиз.
Волшебная урна осьминога

@okx gLη€ûJsåза 8 байт, которые не взрывают TIO.
Волшебная урна осьминога



1

Атташе , 57 55 46 байт

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

Попробуйте онлайн! Ах, это намного элегантнее.

С Generate(49 байтов):

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

объяснение

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

Функция генерации просто создает Nномер лестницы. Затем этот поиск прекращается, как только `>=:`#&_удовлетворено. Расширено это:

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

Таким образом, это заканчивается, как только длина выходных данных функции генерации равна по крайней мере длине входов. Таким образом, это генерирует наименьший номер лестницы, по крайней мере, столько же, сколько и входной номер. Таким образом, если входными данными является номер лестницы, результатом будет тот же номер лестницы, а в противном случае следующий самый длинный номер лестницы. Таким образом, простой проверки с равенством исходному вводу достаточно для определения, был ли это номер лестницы.

Атташе, 55 байт

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

Попробуйте онлайн! С планом рекурсии.




1

К , 36 байт

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

Принимает строку, такую ​​как «12321» в качестве параметра.

Эта функция написана в виде длинной цепочки приложений функций f g h x, поэтому читайте закомментированные версии снизу вверх. {x+1}is lambda x: x+1, x это имя параметра по умолчанию. Проверьте https://pastebin.com/cRwXJn7Z или справку переводчика для значений оператора.

Мы генерируем номер лестницы с nпосередине {,/$(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

Вся функция {|/($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

Хаскелл , 64 60 58 байт

-6 спасибо @BMO!

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

Попробуйте онлайн!


Теоретически работает 12345678910987654321, если вы можете создать список с таким количеством элементов.
Esolanging Fruit

@ БМО Я знал, что должен быть способ сделать это. Спасибо
Esolanging Fruit

@BMO Ваш гольф действительно очевиден в ретроспективе ...
Esolanging Fruit

Это также очень близко, я бы предложил это как улучшение, если бы я не опубликовал его (я не видел ваш, пока я не опубликовал мой).
ბიმო


0

Java 10, 142 байта

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

Попробуйте онлайн.

Объяснение:

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

Принимает ввод в виде строки.

Êõõ mê m¬øU

Попытайся


объяснение

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

Альтернатива, 10 9 байт

Это решение, которое может принимать входные данные в виде строки или целого числа, вернет массив чисел для правдивых данных или, в конечном итоге, выдаст ошибку для Falsey, если до этого не повредил ваш браузер. Используйте с осторожностью.

@¥Xê q}aõ

Попытайся


0

Retina , 45 43 байта

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

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Изменить: Сохранено 2 байта благодаря @Leo. Объяснение:

$
;1

Инициализировать nдо 1.

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

Пока sначинается и заканчивается n:

$2;$.(_$1*

Удалить nс концов sи увеличить n.

^(.+);\1$

Проверьте, nосталось ли .


Я думаю, что вы \dможете стать .и сохранить вам два байта
Лев


-1

Спасибо следующим пользователям:

@Nooneishere
@LyricLy
@JoKing

Python 2 , 147 байт

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

Попробуйте онлайн!


Выход не должен быть строки trueи falseно truthy и falsey значения. 1и 0будет работать, например,
Dylnan

@dylnan: Я только что прочитал это, спасибо. Все еще

Не могли бы вы просто использовать s[0]вместо startswith? Ошибки допускаются, и вы можете сказать «выходные данные 1 для лестничной клетки, что-нибудь еще (включая ничего) [поскольку stderrr игнорируется] для не лестничной клетки».
NoOneIsHere

@NoOneIsHere: хорошая идея. очевидно, кодирование во время сна не очень хорошая идея, спасибо

1
Ваше 138-байтовое решение всегда возвращает False, поскольку gникогда не равно 1. Вероятно, вам следует проверить эти решения, прежде чем публиковать их ...
Джо Кинг,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.