Números de escada

29

Um número escadaria é um número inteiro positivo x tal que a sua n th dígitos (uma indexadas começando com o dígito menos significativo) é igual a X% (n + 1) . Isso é um pouco exagerado, então vamos ver um exemplo. Pegue 7211311 , se usarmos os resíduos modulares de 7211311 no intervalo de 2 a 8, obteremos o seguinte:

7211311 % 2 = 1
7211311 % 3 = 1
7211311 % 4 = 3
7211311 % 5 = 1
7211311 % 6 = 1
7211311 % 7 = 2
7211311 % 8 = 7

Estes são os dígitos de 7211311 ! Portanto, 7211311 é um número da escada.

Tarefa

Escreva o código que recebe quando recebe um número positivo como entrada, produzirá dois valores distintos, um se o número for um número de escada e o outro se não for.

Como é uma competição de , seu objetivo deve ser minimizar o número de bytes no seu código-fonte.

Casos de teste

Aqui estão os 13 primeiros números da escada:

1, 10, 20, 1101, 1121, 11311, 31101, 40210, 340210, 4620020, 5431101, 7211311, 12040210
Assistente de Trigo
fonte
Não é 0um número de escada? Muitas respostas pensam assim.
Okx 02/07/19
3
@Okx, a tarefa é apenas distinguir números positivos de escadas de números positivos que não sejam de escadas, para que o comportamento seja indefinido para números 0 e negativos.
Pa Elo Ebermann

Respostas:

10

Haskell, 55 57 bytes

f m|let n#x=n==0||n`mod`10==m`mod`x&&div n 10#(x+1)=m#2

Uma abordagem diferente da outra solução Haskell.

Obrigado xnor por salvar 2 bytes.

Silvio Mayolo
fonte
4
Você pode usar esta dica para diminuir a letexpressão.
Xnor
Uma abordagem diferente e mais curta. Bem feito! +1
qfwfq
9

Brachylog , 25 21 16 14 bytes

{it+₂;?↔%}ᶠ↔c?

Experimente online!

Primeira submissão ao Brachylog: D provavelmente muito não-destruído ... muito obrigado a Leaky Nun e Fatalize pelo incentivo e ajuda a jogar de 25 a 25 para apenas 14. :) :)

Erik, o Outgolfer
fonte
7

Javascript, 42 41 39 38 bytes

-4 bytes graças a @Shaggy e @ETHProductions

s=>[...s].some(d=>s%i++^d,i=~s.length)

Isso pega o número como uma sequência e retorna falsese o número for um número de escada ou truenão.

Exemplo de trecho de código:

f=
s=>[...s].some(d=>s%i++^d,i=~s.length)

function update() {
  o.innerText = f(document.getElementById("i").value)
}
<input id="i" type="number">
<button onclick="update()">Test</button>
<p id="o">

Herman L
fonte
2
Você deve ser capaz de descartar a opção, !pois o desafio não especifica explicitamente que você deve retornar truepara true e falsefalse, simplesmente que você deve retornar 2 valores distintos.
Shaggy
2
Isso é muito bem jogado, bem feito. Eu acho que você deve ser capaz de espremer mais dois bytes se você calcular i-se:s=>[...s].some(d=>s%i--^d,i=s.length+1)
ETHproductions
2
Na verdade, explorando o fato de que ~x == -(x+1)em números inteiros e x%-y == x%y, acho que você pode obter mais um:s=>[...s].some(d=>s%i++^d,i=~s.length)
ETHproductions
6

05AB1E , 6 bytes

Código:

ā>%JRQ

Usa a codificação 05AB1E . Experimente online!

Explicação:

ā        # Get the range [1 .. len(input)]
 >       # Increment by 1
  %      # Vectorized modulo
   J     # Join the array into a single number
    RQ   # Reverse that number and check if it's equal to the original input
Adnan
fonte
6

Haskell, 60 bytes

Pega o número como int

x n|s<-show n=reverse s==(rem n.(+1)<$>[1..length s]>>=show)
qfwfq
fonte
5

Mathematica, 60 bytes

FromDigits@Reverse@Mod[#,Range@Length@IntegerDigits@#+1]==#&

Experimente online!

@alephalpha jogou até 48

Mathematica, 48 bytes

FromDigits@Reverse@Mod[#,Range[2,Log10@#+2]]==#&

o próximo é 24120020

J42161217
fonte
5

Japonês , 9 7 bytes

Recebe a entrada como uma sequência.

¥£%´JÃw

Teste-o

  • 2 bytes salvos com a ajuda da ETHproductions.

Explicação

Nós assumimos implicitamente a string como entrada.

£   Ã

Mapeie sobre cada caractere na sequência.

´J

Jé a constante Japt para -1e a ´diminui em 1 em cada passagem ( --em JavaScript). Então, na primeira passagem, isso nos dá -2.

%

Usamos esse valor para executar uma operação de módulo na sequência de entrada que é automaticamente convertida em um número inteiro no processo. Em JavaScript x%-ydá o mesmo resultado que x%y.

w

Inverta a sequência resultante.

¥

Verifique se a nova sequência é igual à entrada original e gera implicitamente o resultado como um booleano.

Shaggy
fonte
Puxa danado (Y+2, eu sinto que poderia ser de pelo menos 1 byte mais curto ...
ETHproductions
11
... e pode: ¥£%´JÃw:-) (funciona porque x%y == x%-yem JS)
ETHproductions
Aha, sim, estava tentando algumas coisas diferentes para reduzir esse cálculo para 2 bytes.
Shaggy
4

Neim , 6 bytes

𝐧ᛖ𝕄𝐫𝐣𝔼

Explicação:

𝐧         Get the length of the input, then create an exclusive range
 ᛖ        Add 2 to each element
  𝕄       Modulus
    𝐫      Reverse
     𝐣     Join
      𝔼   Check for equality

Experimente online!

Okx
fonte
@Thehx Em relação à sua edição, o Neim usa uma codificação personalizada: esta
Okx
2

Perl 6 , 32 bytes

{$_ eq[~] $_ «%«(1+.comb...2)}

Experimente online!

  • .combé o número de caracteres na representação em cadeia do argumento de entrada $_(ou seja, o número de dígitos).
  • 1 + .comb ... 2 é a sequência de números de um maior que o número de dígitos até 2.
  • «%«é o módulo de hyperoperator que dá o restante quando $_, o argumento de entrada no seu lado esquerdo, é dividida por cada um dos elementos da sequcia no seu direito: $_ % 2, $_ % 3, ....
  • [~]concatena esses dígitos em um novo número, que é comparado com o argumento de entrada usando o operador de igualdade de cadeias eq.
Sean
fonte
2

Pitão , 13 bytes

-1 bytes graças a Okx .

qsjk_m%QhdSl`

Experimente online!

Explicação

             QQ    # Implicit input
          Sl`Q     # Generate [1, len(str(Q))]
     m%Qhd         # For digit d in above range, perform Q % (d + 1)
 sjk_              # Reverse, then convert to number
q             Q    # Test equality with input

Solução alternativa , ainda com 13 bytes (graças a karlkastor )

qi_.e%Q+2k`QT

Experimente online! Isso é essencialmente o mesmo que a primeira solução, exceto pelo fato de ele ser usado ipara converter da matriz de números em um número, e que o intervalo é gerado de maneira diferente.

Jim
fonte
11
Você pode substituir ss`M_por jk_para salvar 2 bytes.
Okx 01/07/19
@ Ok, preciso disso porque jgera uma string, enquanto preciso de um número para comparar com a entrada (que é um número).
Jim
11
Outra solução de 13 bytes seria: qi_.e%Q+2k`QTusando map enumerated ( .e) em vez de map. E convertendo os restantes para uma base 10 int da lista em vez de usar junção.
KarlKastor
2

C ++, 104 bytes

1) versão original:

int main(){int N,T,R=1;cin>>N;T=N;for(int i=1;i<=log10(N)+1;i++){if(N%(i+1)!=T%10){R=0;}T/=10;}cout<<R;}

2) de forma legível:

int main()
{
    int N, T, R = 1;

    cin >> N;
    T = N;

    for (int i = 1; i <= log10(N) + 1; i++)
    {
        if (N % (i + 1) != T % 10)
        {
            R = 0;
        }

        T /= 10;
    }

    cout << R;
}

Experimente Online!

koita_pisw_sou
fonte
1

Python 2 , 66 60 58 57 bytes

  • Graças à freira @Leaky por 6 bytes: remova desnecessariamente x and(não deve verificar se há 0)
  • Obrigado a @Einkorn Enchanter por 1 byte: uso de enumerate
lambda x:all(a==`x%(i+2)`for i,a in enumerate(`x`[::-1]))

Experimente online!

officialaimm
fonte
11
Menor se você enumerar
Assistente de Trigo
Obrigado. E hey, eu só percebi que era assistente de trigo ..: D
officialaimm
1

Python 3: 63 bytes

lambda m:all(int(x)==m%(n+2)for n,x in enumerate(str(m)[::-1]))

Se eu pudesse contar o número de vezes que desejava que "enumerar" fosse menor ...

Experimente online!

Bendl
fonte
Sim, e acabei de perceber que é exatamente o mesmo que a resposta que @officialaimm deu ... Devo remover?
BENDL
O deles está no python 2 e você o criou independentemente, então eu o deixaria.
Assistente de trigo
Pode salvar dois bytes, iniciando seu enumeração em 2 e reorganizando a lógica:lambda m:all(m%n==int(x)for n,x in enumerate(str(m)[::-1],2))
Nocturama
1

Java 8, 156 149 bytes

interface B{static void main(String[]s){String f="";for(int i=1;i<=s[0].length();)f=new Long(s[0])%++i+f;System.out.print(f.equals(s[0]));}}

Ungolfed:

interface B {
    static void main(String[] s) {
        String f = "";
        for (int i = 1; i <= s[0].length();)
            f = new Long(s[0]) % ++i + f;
        System.out.print(f.equals(s[0]));
    }
}

Experimente Online!

UPDATE:
-7 bytes : removido inútil {}e substituído Integer.parseInt(...)por new Integer(...)
-9 bytes : graças a Kevin Cruijssen, removemos um monte de inúteis (), usados ​​em Longvez de Integere em printvez de println. Obrigado Kévin!

Alex Ferretti
fonte
11
Boa resposta, +1 de mim. Aliás, algumas pequenas coisas do golfe: new Integerpodem ser new Long(-3 bytes); printlnpode ser print(-2 bytes); e você pode remover o parêntese ao redor new Long(s[0])%i+f;(-4 bytes).
Kevin Cruijssen
Muito bom! Obrigado, eu vou atualizar isso!
Alex Ferretti
1

Carvão , 20 15 bytes

⌊Eθ⁼ιI﹪Iθ⁻⁺¹Lθκ

Experimente online! Saídas -para um número de escada, nada diferente. Link é a versão detalhada do código.

Neil
fonte
0

Python 2, 61 bytes

lambda x:[`x%(n+2)`for n in range(len(`x`))][::-1]==list(`x`)
Daniel
fonte
Não, seu novo golfe é um byte mais curto. :)
Assistente de trigo
0

q / kdb +, 34 bytes

Solução:

{s~raze($)x mod'2+(|)(!)(#)s:($)x}

Exemplo:

q){s~raze($)x mod'2+(|)(!)(#)s:($)x}7211311 / this is a staircase number (true)
1b
q){s~raze($)x mod'2+(|)(!)(#)s:($)x}7211312 / this is not (false)
0b
q)t(&){s~raze($)x mod'2+(|)(!)(#)s:($)x}each t:1 + til 1000000 / up to a million
1 10 20 1101 1121 11311 31101 40210 340210

Explicação:

Converta o número da entrada em uma string, conte de 0..length da string, adicione 2 a todos, inverta-o e alimente cada número modjunto com a entrada original. Lance o resultado do mod para uma string e reduza a lista, verifique se é igual à string do número de entrada:

{s~raze string x mod'2 + reverse til count s:string x} / ungolfed solution
{                                                    } / lambda function
                                           s:string x  / convert input to string, save as s
                                     count             / return length of this string
                                 til                   / like python's range() function
                         reverse                       / reverses the list
                     2 +                               / adds two to each element in the list
               x mod'                                  / ' is each both, so feeds x, and each element of the list to modulo function
        string                                         / converts output list to string list ("7";"2";"1"..etc)
   raze                                                / reduce list ("721...")
 s~                                                    / is s equal to this reduced list, returns boolean

Notas:

A maior parte da solução é para gerar a 2,3,4..lista, eu tenho outra solução que faz menos coisas, mas acaba sendo 37 bytes depois do golfe:

{s~x mod'reverse 2 + til count s:("J"$) each string x} / ungolfed
{s~x mod'(|)2+til(#)s:("J"$)each($)x}                  / golfed
rua
fonte
0

Clojure, 75 bytes

#(=(sort %)(sort(map(fn[i c](char(+(mod(Integer. %)(+ i 2))48)))(range)%)))

A entrada é uma string, usando mape o final %acabou sendo mais curto que a for[i(range(count %))]abordagem.

NikoNyrh
fonte
0

Haskell, 62 bytes

f x=and$zipWith(==)(reverse$show x)$map(head.show.mod x)[2..]

Em vez de reverter a lista (infinita) de módulos, ela trunca a lista, compactando-a com a representação de seqüência de caracteres invertida da integral x, o que garante que seja igual em termos de elementos.

archaephyrryx
fonte
0

Perl 5 , 41 bytes

39 bytes de código + 2 sinalizadores -pa

map{$\||=$_!=$F[0]%++$n}0,reverse/./g}{

Experimente online!

Não produz nada (undef) para números de escadas, 1 para qualquer outra coisa

Xcali
fonte