È questo un numero di scala?


15

Sfida:

Controlla se il numero dato forma number staircaseo meno


Input:

Un numero intero (maggiore di 0 e non decimale). NOTA: è possibile accettare input come stringa, matrice di cifre.


Produzione :

un valore di verità / falsità a seconda che il numero formi una scala o meno


Numero scala:

Una scala numerica è un numero intero che, quando letto da sinistra a destra:

  • Inizia con 1
  • che può essere seguito da 2
  • che può essere seguito da 3
  • e così via fino a n
  • quindi il numero scende a partire da n - 1
  • quindi n - 2
  • quindi n - 3
  • e così via fino a raggiungere 1

Nota :

La parte può essere utilizzata per indicare che se la lunghezza> è maggiore di 1. Se è l'ordine deve essere seguito così com'è. cioè: 12321


Esempio :

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

Nota :

L'input fornito sarà sempre un numero intero maggiore di 0 e non sarà un decimale. L'output deve essere un truthy or falsyvalore in base all'input


Restrizioni:

Questo è quindi vince il codice più breve in byte (per ogni linguaggio di programmazione).



2
Possiamo prendere l'input come un elenco di cifre? Come [1,2,3,4,5,6,7,8,9,1,0,1,1,1,0,9,8,7,6,5,4,3,2,1]per 123456789101110987654321?
Mr. Xcoder

@ Mr.Xcoder: Preferirei se non lo facessi ma immagino che tu possa
Muhammad Salman

C'è un limite superiore sull'ingresso?
mypetlion il

@mypetlion: Non proprio, è alto quanto il tuo codice può supportare (esclusi quelli hardcoded e appositamente bassi). Normalmente il massimo che la tua lingua può supportare (ma non in questo caso)
Muhammad Salman

Possiamo prendere una stringa di caratteri come input per una funzione? (o questo è solo un input accettabile per un programma completo?)
Jonathan Allan

Risposte:


5

R , 97 byte

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)

Provalo online!

Prende ncome un charactero un integer; l'utilizzo characterfornirà risultati corretti per numeri interi che non possono essere mantenuti esattamente come 64 bitdouble .

Genera numeri di scale fino a quando non ne trova uno almeno quanto è lungo n, quindi verifica l'uguaglianza.

Equivalente a:

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)


La sostituzione function(n)con non n=scan();sarebbe più breve? (per numeri interi ovviamente)
pajonk

@pajonk Suppongo di si. Ma dirò che lo prendo come una stringa, quindi questa risposta è corretta per input più grandi.
Giuseppe,


3

JavaScript (ES6), 62 57 byte

Salvato 2 byte grazie a @ l4m2

Restituisce un valore booleano.

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

Provalo online!

Come?

A partire da k = 1 , cerchiamo k all'inizio e alla fine della stringa e ripetiamo in modo ricorsivo il processo sulla sottostringa centrale rimanente con k + 1 . La ricorsione si interrompe non appena non c'è più corrispondenza. L'input è un numero di scala se l'ultima sottostringa è uguale a k .

Esempio per 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 byte . Assumi 0 come verità e null come falsa (non ha specificato esattamente se)

Hum non ho visto quell'ipotesi che non è valido. Siamo spiacenti

@ I'mnoone Nessun problema! È interessante notare che la rimozione m[0]==s&invece gli farebbe passare tutti i casi di test (ma fallirà comunque su altri come "123217").
Arnauld,

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


2

Pyth, 13 12 byte

/mjk+Sd_Stdl

Salvataggio di un byte grazie a RK.
Provalo qui

Spiegazione

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

Se vuoi davvero l'input come numero intero, puoi }Qmsjk+Sd_Stdinvece usarlo , ma questo è terribilmente lento.


puoi usare /invece di }Qcosì si completa automaticamente Qalla fine
RK.


2

C # (compilatore interattivo Visual C #) , 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);

Provalo online!

Spiegazione:

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?

In realtà, il Zip...Skipmetodo nel mio commento precedente non riesce [1,1], che dovrebbe tornare truese capisco le specifiche. L'ho cancellato.
benj2240,

Grazie comunque! Non ho mai usato Zip prima, ma vedo ora come può essere utile.
Kahzaar,

1

05AB1E , 9 8 byte

L€L€ûJså

Avvertenza: ESTREMAMENTE LENTO! Inseriscig all'inizio per accelerarlo.

Provalo online!

Spiegazione:

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?

Vecchia spiegazione:

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

Provalo online!


Palindromizzare? Cosa fa questo? Perché come forse saprai le scale con 10+ non sono palindromi
Yassin Hajaj

@YassinHajaj Palindromizza l'array, non la stringa
Okx

Va bene grazie per l'informazione
Yassin Hajaj,

@YassinHajaj gLη€ûJsåè un altro, dove puoi vedere la vettorializzazione della palindromizzazione usando €ûpalindromize ciascuna.
Magic Octopus Urn

@okx gLη€ûJsåper un 8 byte che non fa esplodere TIO.
Magic Octopus Urn

1

Python 2 , 77 byte

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

Provalo online!


Salva quattro accettando un numero intero se potremmo avere un errore dopo aver premuto long: TIO . A quel punto avremmo bisogno di un po 'di tempo e memoria!
Jonathan Allan,


1

Attache , 57 55 46 byte

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

Provalo online! Ah, è molto più elegante.

Con Generate(49 byte):

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

Spiegazione

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

La funzione di generazione crea semplicemente il Nnumero della scala. Quindi, questa ricerca termina una volta `>=:`#&_soddisfatta. Espanso, questo è:

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

Quindi, questo termina quando la lunghezza dell'uscita della funzione di generazione è almeno quella degli ingressi. Pertanto, questo genera il numero di scala più piccolo almeno finché il numero di input. Pertanto, se l'input è un numero di scala, il risultato sarà lo stesso numero di scala e in caso contrario il numero di scala più lungo successivo. Come tale, un semplice controllo con uguaglianza all'input originale è sufficiente per determinare se fosse o meno un numero di scala.

Attache, 55 byte

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

Provalo online! Con piano o ricorsione.



1

SNOBOL4 (CSNOBOL4) , 109 byte

	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

Provalo online!

Curiosamente, la sostituzione '1'nella seconda riga con 1causa il fallimento del programma nell'input di 1.


1

K , 36 byte

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

Accetta una stringa come "12321" come parametro.

Questa funzione è scritta come una lunga catena di applicazioni funzionali, come in f g h x, quindi leggi le versioni commentate dal basso, salendo. {x+1}è lambda x: x+1, x è un nome param predefinito. Dai un'occhiata a https://pastebin.com/cRwXJn7Z o l'aiuto dell'interprete per i significati dell'operatore.

Generiamo il numero della scala con nal centro per {,/$(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

L'intera funzione {|/($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 byte

-6 grazie a @BMO!

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

Provalo online!


Teoricamente funziona per 12345678910987654321, se sei in grado di costruire un elenco con così tanti elementi.
Esolanging Fruit

@BMO sapevo che doveva esserci un modo per farlo. Grazie
Esolanging Fruit il

@BMO Il tuo golf è davvero evidente col senno di poi ...
Esolanging Fruit

È anche molto vicino, l'avrei suggerito come un miglioramento se non l'avessi già pubblicato (non ho visto il tuo fino a quando non ho pubblicato il mio).
ბიმო


0

Java 10, 142 byte

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

Provalo online.

Spiegazione:

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 byte

Accetta l'input come stringa.

Êõõ mê m¬øU

Provalo


Spiegazione

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

Alternativa, 10 9 byte

Questa soluzione, che può accettare input come una stringa o un numero intero, restituirà una matrice di numeri per verità o, alla fine, genererà un errore per falsa, se prima non paralizza il browser. Usare con cautela.

@¥Xê q}aõ

Provalo


0

Retina , 45 43 byte

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

Provalo online! Il link include casi di test. Modifica: salvato 2 byte grazie a @Leo. Spiegazione:

$
;1

Inizializzazione na 1.

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

Mentre sinizia e termina con n:

$2;$.(_$1*

Elimina ndalle estremità di se incrementa n.

^(.+);\1$

Verifica se nè rimasto.


Penso che i tuoi messaggi \dpossano diventare .e salvarti due byte
Leone,

0

Regex (PCRE) , 92 byte

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

Provalo online!

Sono aperto a qualsiasi suggerimento per migliorare questo.


-1

Grazie ai seguenti utenti:

@Nooneishere
@LyricLy
@JoKing

Python 2 , 147 byte

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

Provalo online!


L'uscita non deve essere le corde truee false, ma i valori truthy e Falsey. 1e 0funzionerebbe ad esempio
dylnan il

@dylnan: l'ho appena letto, grazie. Ancora golf (molto da fare)

Non potresti semplicemente usare s[0]invece di startswith? Gli errori sono consentiti e si può dire "output 1 per stair, qualsiasi altra cosa (incluso niente) [poiché stderrr viene ignorato] per non-stair".
NoOneIsHere

@NoOneIsHere: buona idea. apparentemente programmare durante il sonno non è una buona idea grazie

1
La tua soluzione a 138 byte restituisce sempre False, poiché gnon è mai 1. Dovresti probabilmente testare queste soluzioni prima di pubblicarle ...
Jo King,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.