Це номер сходів?


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 є правдоподібним та нульовим, як фальшивий (він точно не вказав це)

Хам, я не бачив цієї здогадки, що недійсна. Вибачте

@ Inoone Не хвилюйся! Цікаво, що видалення m[0]==s&замість цього дозволить пройти всі тестові випадки (але все-таки не вдасться до інших, таких як "123217").
Арнольд

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


2

Pyth, 13 12 байт

/mjk+Sd_Stdl

Збережено байт завдяки RK.
Спробуйте тут

Пояснення

/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завершується в кінці
RK.


2

C # (Visual C # Interactive Compiler) , 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

Attache , 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] }

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

Attache, 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}є 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

@BMO Я знав, що повинен бути спосіб це зробити. Спасибі
Esolanging Fruit

@BMO Ваш гольф справді очевидний заднім
поглядом

Це також дуже близько, я б запропонував це як поліпшення, якби я вже не опублікував це (я не бачив ваших, поки не розмістив свою).
ბიმო


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

Це рішення, яке може приймати введення як рядок або ціле число, поверне масив чисел для truthy або, врешті-решт, видасть помилку для falsey, якщо воно не покалічить ваш браузер до цього. Використовуйте обережно.

@¥Xê q}aõ

Спробуй це


0

Сітківка , 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 байтами завжди повертає помилкове значення, оскільки gце ніколи. Ви, мабуть, повинні перевірити ці рішення, перш ніж публікувати їх ...
Джо Кінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.