Este é um número de três dígitos que termina em um?


27

Dado um número inteiro não negativo, retorne se é um número de três dígitos que termina em um, em qualquer base inteira consistente. Em outras palavras, o número precisa ser representado na base-N, sendo N um número inteiro maior que zero.

Regras

  • Isso é , então a resposta mais curta vence.
  • Como o unário se comporta de maneira estranha, o comportamento com a entrada 3 10 é indefinido.
  • As brechas padrão são proibidas.

Exemplos

Verdade:

5   
73  
101 
1073
17
22
36
55
99  

Falso:

8
18
23
27
98
90
88
72
68

Um punhado de grandes números:

46656 true
46657 true
46658 true
46659 true
46660 true
46661 false
46662 false
46663 true
46664 false
46665 true
46666 true
46667 false
46668 false
46669 false
46670 true
46671 true

1
Uma vez que se comporta unárias estranhamente não há, não se comportam estranhamente, a representação unária de um número inteiro não negativo né apenas n 1s, por exemplo 0 = ()₁, 3 = (111)₁, 10 = (1111111111)₁, etc
Erik a Outgolfer

6
@EriktheOutgolfer Comporta-se de maneira bem diferente; você não pode dividir por 1 para n-itshift, por exemplo.
wizzwizz4

3
O que significa base inteira consistente ? (Além disso, em vez de excluir unário nas regras que você poderia apenas especificar N ≥ 2)
Lynn

1
@Lynn Uma notação posicional com uma única raiz, por exemplo, base dez, em oposição a uma raiz dependente da posição, como você vê nas unidades imperiais ou no tempo.
HAEM

1
@ Lynn como um adendo, eu também estava tentando excluir bases racionais, negativas, complexas etc. Quanto ao seu segundo ponto, a regra sobre unário não deve incluir nem excluir unário. A menos que minha compreensão da advocacia da linguagem seja ainda mais fraca do que eu pensava, "comportamento indefinido" significa "o que a parte implementadora quiser", que é o que eu estava buscando.
HAEM

Respostas:


10

Geléia , 7 bytes

bRṫ€3ċJ

Retorna o número de bases (diferente de zero sendo verdadeiro, zero sendo falso) em que a entrada é um número de três dígitos que termina em um.

Experimente online!

Como funciona

bRṫ€3ċJ  Main link. Argument: n

 R       Range; yield [1, ..., n].
b        Base; convert n to bases 1, ..., n.
  ṫ€3    Tail each 3; remove the first two elements of each digit array.
      J  Indices of [n]; yield [1].
     ċ   Count the number of times [1] appears in the result to the left.

10

JavaScript (ES7), 43 40 39 bytes

f=(n,b)=>n<b*b?0:n%b==1&n<b**3|f(n,-~b)

Casos de teste

Comentado

f = (n,           // given n = input
        b) =>     // and using b = base, initially undefined
  n < b * b ?     // if n is less than b²:
    0             //   n has less than 3 digits in base b or above -> failure
  :               // else:
    n % b == 1 &  //   return a truthy value if n is congruent to 1 modulo b
    n < b**3 |    //   and n is less than b³ (i.e. has less than 4 digits in base b)
    f(n, -~b)     //   or the above conditions are true for some greater value of b




4

05AB1E , 11 8 bytes

Economizou 3 bytes graças a Adnan .

Lв3ù€θ1å

Experimente online!

Explicação

Lв            # convert input to bases [1 ... input]
  ʒg3Q}       # keep only elements of length 3
       €θ     # get the last item of each
         1å   # is there any 1?


3

Mathematica, 43 bytes

!FreeQ[IntegerDigits[#,2~Range~#],{_,_,1}]&

Experimente online!

ou Experimente online! (grandes números)

Martin Ender salvou 3 bytes


!FreeQ[#~IntegerDigits~Range@#,{_,_,1}]&é um pouco mais curto se você não se importa de ver o IntegerDigits::ibase: Base 1 is not an integer greater than 1.aviso. (Ele ainda retorna as respostas corretas.)
Misha Lavrov




2

APL (Dyalog Unicode) , 21 20 14 bytes SBCS

-5 graças a @ngn.

Solução puramente aritmética (na verdade, não faz nenhuma conversão básica) e, portanto, muito rápida.

3∊⊢(|×∘⌈⍟)⍨1↓⍳

Experimente online!

⊢()⍨1↓⍳ Em um descartado do argumento 1ndices 1… e o argumento, aplique:

| os remanescentes da divisão

×∘⌈ vezes o arredondado

argumento N do  log

3∊ três é um membro disso?


você pode salvar 1 com o truque padrão de trocar os argumentos:⊢(∨/(3=∘⌈⍟)∧1=|)⍨1↓⍳
ngn

@ngn Obrigado. Da próxima vez, sinta-se à vontade para editá-las (se quiser).
Adám 15/01/18

Está bem. Aqui está uma melhoria mais complexa que eu deixo para você lidar - ela torna tão curta quanto a sua outra solução:(⊂1 3)∊⊢(⌈|,¨⍟)⍨1↓⍳
ngn

1
3∊⊢(|×|×∘⌈⍟)⍨1↓⍳
NGN

2
@ngn 1=⌈a⍟b, a≤ba=b0=a|b0=b|b
Adám


1

Casca , 15 bytes

V§&o=1→o=3LṠMBḣ

Experimente online!

Explicação

V§&(=1→)(=3L)ṠMBḣ  -- implicit input, for example: 5
             ṠMB   -- map "convert 5 to base" over..
                ḣ  --   range [1..5]
                   -- [[1,1,1,1,1],[1,0,1],[1,2],[1,1],[1,0]]
V                  -- does any of the elements satisfy the following
 §&( 1 )( 2 )      --   apply functions 1,2 and join with & (logical and)
         =3L       --     is length equals to 3?
    =1→            --     is last digit 1?

1

PHP, 48 + 1 bytes

while(++$b**2<$n=$argn)$n%$b-1|$n>$b**3||die(1);

sai com 0para falsidade (ou entrada 3), 1para verdade.
Execute como pipe -nRou experimente online .


1

C, 60 bytes

Uma função que retorna diferente de zero se o argumento puder ser representado como um número de três dígitos que termina em 1:

i,j;f(n){for(j=0,i=sqrt(n);i>cbrt(n);)j+=n%i--==1;return j;}

Nota: isso funciona com o GCC, onde as funções estão embutidas. Para outros compiladores, você provavelmente precisará garantir que os tipos de argumento e retorno sejam conhecidos:

#include<math.h>

Explicação

A base mais baixa na qual né representado em 3 dígitos é ⌊∛n⌋e a base mais baixa na qual né representada em 2 dígitos é ⌊√n⌋, então simplesmente testamos se o número é congruente a 1 módulo em qualquer base no intervalo de 3 dígitos. Retornamos a contagem do número de bases que satisfazem a condição, fornecendo um valor diferente de zero (verdade) ou zero (falsidade), conforme apropriado.

Programa de teste

Passe qualquer número de entradas como parâmetros posicionais:

#include<stdio.h>
int main(int c,char**v)
{
    while(*++v)
        printf("%s => %d\n", *v, f(atoi(*v)));
}



0

Pyt , 35 33 bytes

←ĐĐ3=?∧∧:ŕĐ2⇹Ř⇹Ľ⅟⌊⁺3=⇹Đ2⇹Ř%*ž1⇹∈;

Explicação:

←ĐĐ                                             Push input onto stack 3 times
   3=?  :                       ;               If input equals 3, execute code after the question mark;otherwise, execute code after the colon. In either case, afterwards, execute the code after the semicolon
      ∧∧                                        Get 'True'
        :                                       Input not equal to 3
         ŕ                                      Remove 'False'
          Đ2⇹Ř                                  Push [2,3,...,n]
              ⇹Ľ⅟⌊⁺                             Push [floor(log_2(n))+1,floor(log_3(n))+1,...,floor(log_n(n))+1]
                   3=                           Is each element equal to 3
                     ⇹                          Swap the top two elements on the stack (putting n back on top)
                      Đ2⇹Ř                      Push [2,3,...,n]
                          %                     Push [n%2,n%3,...,n%n]
                           *                    Multiply [n%x] by the other array (i.e. is floor(log_x(n))+1=3?)
                            ž                   Remove all zeroes from the array
                             1⇹∈                Is 1 in the array?
                                ;               End conditional
                                                Implicit print

Experimente online!


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.