Bu bir merdiven numarası mı?


15

Meydan okuma :

Verilen sayı oluşturan bir kontrol edin number staircaseya da değil


Giriş:

Bir tamsayı (0'dan büyük ve ondalık değil). NOT: Girişi dize, basamak dizisi olarak alabilirsiniz.


Çıktı :

sayının merdiven oluşturup oluşturmadığına bağlı olarak doğruluk / tahrif değeri


Merdiven sayısı:

Bir numara merdiven , soldan sağa okunan bir tam sayıdır:

  • 1 ile başlar
  • bunu 2 izleyebilir
  • bunu 3 izleyebilir
  • ve benzeri kadar n
  • sonra sayı n - 1'den başlayarak iner
  • sonra n - 2
  • sonra n - 3
  • ve böylece o ulaşana kadar 1

Not :

Olabilir parçası olduğu gibi sipariş takip edilmelidir ise uzunluğu ise> 1'den büyük olduğunu belirtmek için kullanılır. yani: 12321


Misal :

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

Not :

Verilen girdi her zaman 0'dan büyük bir tam sayı olacaktır ve ondalık sayı olmayacaktır. Çıktınız truthy or falsygirdiye bağlı olarak bir değer olmalıdır


Kısıtlamalar:

Bu yani bayt (her programlama dili için) en kısa kod kazanır.



2
Girdileri bir rakam listesi olarak alabilir miyiz? Gibi [1,2,3,4,5,6,7,8,9,1,0,1,1,1,0,9,8,7,6,5,4,3,2,1]için 123456789101110987654321?
Bay Xcoder

@ Mr.Xcoder: Yapmamayı tercih ederim ama sanırım yapabilirsin
Muhammed Salman

Girişte bir üst sınır var mı?
mypetlion

@ mypetlion: Gerçekten değil, kodunuzun destekleyebileceği kadar yüksek (sabit kodlu ve amaçlı olarak düşük olanlar hariç). Normalde dilinizin destekleyebileceği en yüksek (ancak bu durumda değil)
Muhammad Salman

Bir işleve girdi olarak bir karakter dizisi alabilir miyiz? (veya bu tam program için kabul edilebilir bir girdi mi?)
Jonathan Allan

Yanıtlar:


5

R , 97 bayt

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)

Çevrimiçi deneyin!

Alır nbir şekilde characterya da bir integer; kullanmak character, tam olarak 64 bit olarak tutulamayan tamsayılar için doğru sonuçlar verecektir double.

En az bir tane bulana kadar merdiven sayıları üretir n, sonra eşitliği test eder.

Eşittir:

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)


Yerine olmaz function(n)ile n=scan();daha kısa? (elbette tamsayılar için)
pajonk

@pajonk Sanırım öyle. Ama dize olarak alıyorum diyorum, bu yüzden bu cevap daha büyük girdiler için doğru.
Giuseppe


3

JavaScript (ES6), 62 57 bayt

@ L4m2 sayesinde 2 bayt kaydedildi

Bir boole döndürür.

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

Çevrimiçi deneyin!

Nasıl?

İle başlayarak k = 1 , biz bakmak k başında ve dizesinin sonunda ve yinelemeli kalan orta alt dizede süreci yineleme k + 1 . Artık hiçbir eşleşme olmazsa özyineleme durur. Son alt dize k'ye eşitse giriş bir merdiven numarasıdır .

S = "1234321" için örnek:

 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 bayt . 0 gibi doğruluk ve null falsy olarak varsayın (o tam olarak belirtmedi mi)

Hum bunun geçersiz olduğunu tahmin etmedim. Üzgünüz

@ I'mnoone Endişelenme! İlginç bir şekilde, m[0]==s&bunun yerine kaldırılması tüm test senaryolarını geçmesine neden olur (ancak yine de gibi diğer durumlarda başarısız olur "123217").
Arnauld

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


2

Pyth, 13 12 bayt

/mjk+Sd_Stdl

RK sayesinde bir bayt kurtardı.
Burada deneyin

açıklama

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

Girdiyi gerçekten bir tamsayı olarak kullanmak istiyorsanız, }Qmsjk+Sd_Stdbunun yerine kullanabilirsiniz , ancak bu korkunç derecede yavaştır.


/bunun yerine kullanabilirsiniz , }Qböylece Qsonunda otomatik tamamlanır
RK.


2

C # (Visual C # Etkileşimli derleyicisi) , 138 107 102 bayt

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

Çevrimiçi deneyin!

Açıklama:

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?

Aslında, Zip...Skipönceki yorumumdaki yöntem başarısız olur , spesifikasyonu anlarsam [1,1]geri dönmelidir true. Sildim.
benj2240

Yine de teşekkürler! Daha önce hiç Zip kullanmadım, ama şimdi nasıl faydalı olabileceğini görüyorum.
Kahzaar

1

05AB1E , 9 8 bayt

L€L€ûJså

Uyarı: EXOWEMELY SLOW! gHızlandırmak için başlangıca ekleyin .

Çevrimiçi deneyin!

Açıklama:

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?

Eski Açıklama:

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

Çevrimiçi deneyin!


Palindromize mi? Bu ne yapar? Çünkü bildiğiniz gibi 10+ ile merdivenler palindrom değildir
Yassin Hajaj

@YassinHajaj Dizeyi değil diziyi
palromromize

Bilgi için teşekkürler
Yassin Hajaj

@YassinHajaj gLη€ûJså, €ûher biri palindromize kullanarak palindromizasyonun vektörleşmesini görebileceğiniz başka bir yerdir .
Sihirli Ahtapot Urn

@okx gLη€ûJså, TIO'yu patlatmayan 8 bayt için.
Sihirli Ahtapot Urn



1

Ataşe , 57 55 46 bayt

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

Çevrimiçi deneyin! Ah, bu çok daha zarif.

İle Generate(49 bayt):

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

açıklama

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

Üretim fonksiyonu sadece Nmerdiven numarasını oluşturur . Ardından, bu arama `>=:`#&_tatmin olduktan sonra sona erer . Genişletilmiş, bu:

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

Bu nedenle, üretim fonksiyonunun çıktısının uzunluğu en azından girdilerinki olduğunda bu sona erer. Böylece, bu en az girdi numarası kadar en küçük merdiven sayısını üretir. Dolayısıyla, giriş bir merdiven numarası ise, sonuç aynı merdiven numarası ve aksi takdirde bir sonraki en uzun merdiven numarası olacaktır. Bu nedenle, bir merdiven numarası olup olmadığını belirlemek için orijinal girişe eşitlikle basit bir kontrol yeterlidir.

Ataşe, 55 bayt

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

Çevrimiçi deneyin! Planı ile özyineleme.



1

SNOBOL4 (CSNOBOL4) , 109 bayt

	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

Çevrimiçi deneyin!

İlginçtir ki, '1'ikinci satırla değiştirmek 1, programın girişinde başarısız olmasına neden olur 1.


1

K , 36 bayt

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

Parametre olarak "12321" gibi bir dize alır.

Bu işlev, olduğu gibi uzun bir işlev uygulamaları zinciri olarak yazılır f g h x, bu nedenle yukarıdan yorumlanan sürümleri aşağıdan okuyun. {x+1}olduğu lambda x: x+1, x varsayılan param adıdır. Check out https://pastebin.com/cRwXJn7Z veya operatör anlamları için tercüman yardımı.

Merdiven sayısını nortada şu şekilde üretiyoruz {,/$(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

Tüm fonksiyon {|/($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 bayt

-B @ BMO sayesinde!

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

Çevrimiçi deneyin!


Teorik olarak 12345678910987654321, bu kadar çok öğeyle bir liste oluşturabiliyorsanız, çalışır.
Esolanging Fruit

@BMO Bunu yapmanın bir yolu olması gerektiğini biliyordum. Teşekkürler
Esolanging Meyve

@BMO Golf gezinizde gerçekten belli ...
Esolanging Fruit

Ayrıca çok yakın, eğer zaten göndermediysem bir iyileştirme olarak önerirdim (benimkini yayınlayana kadar seninkini görmedim).
ბიმო


0

Java 10, 142 bayt

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

Çevrimiçi deneyin.

Açıklama:

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 bayt

Girişi dize olarak alır.

Êõõ mê m¬øU

Dene


açıklama

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

Alternatif, 10 9 bayt

Bir dize veya bir tamsayı olarak girdi alabilen bu çözüm, doğruluk için bir dizi sayı döndürür veya sonunda tarayıcınızı bundan önce saklamıyorsa, falsey için bir hata atar. Dikkatle kullanın.

@¥Xê q}aõ

Dene


0

Retina , 45 43 bayt

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

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Düzenleme: @Leo sayesinde 2 bayt kaydedildi. Açıklama:

$
;1

Initialise niçin 1.

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

Süre sbaşlar ve biter n:

$2;$.(_$1*

Sil nuçlarından sve artım n.

^(.+);\1$

Kalan olup olmadığını test edin n.


Ben senin düşünüyorum \dler haline gelebilir .ve siz iki bayt tasarruf
Leo


-1

Aşağıdaki kullanıcılar için teşekkürler:

@Nooneishere
@LyricLy
@JoKing

Python 2 , 147 bayt

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

Çevrimiçi deneyin!


Çıkış dizeleri olmak zorunda değildir trueve falseancak truthy ve Falsey değerleri. 1ve 0örneğin işe yarayacaktır
dylnan

@dylnan: Bunu yeni okudum, teşekkürler. Hala golf (gidecek çok şey)

s[0]Bunun yerine sadece kullanamaz startswithmısın? Hatalara izin verilir ve 'merdiven için çıkışlar 1, merdiven olmayanlar için başka hiçbir şey (hiçbir şey dahil) [stderrr yok sayıldığı için ”diyebilirsiniz.
HayırOneIsHere

@NoOneIsHere: iyi fikir. Görünüşe göre uyurken kodlama iyi bir fikir değil teşekkürler

1
138 bayt çözümünüz her zaman False gdeğerini döndürür, çünkü asla 1 değildir. Bu çözümleri göndermeden önce test ...
Jo King
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.