¿Es este un número de tres dígitos que termina en uno?


27

Dado un número entero no negativo, devuelve si es un número de tres dígitos que termina en uno, en cualquier base entera consistente. En otras palabras, el número debe representarse en base-N, siendo N un número entero mayor que cero.

Reglas

  • Este es el , por lo que gana la respuesta más corta.
  • Como el comportamiento unario es extraño, el comportamiento con la entrada 3 10 no está definido.
  • Las lagunas estándar están prohibidas.

Ejemplos

Cierto:

5   
73  
101 
1073
17
22
36
55
99  

Falso:

8
18
23
27
98
90
88
72
68

Un puñado 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
Desde comporta unarios extrañamente no hay, no se comporta extrañamente, la representación unaria de un número entero no negativo nes sólo n 1es, por ejemplo 0 = ()₁, 3 = (111)₁, 10 = (1111111111)₁, etc.
Erik el Outgolfer

66
@EriktheOutgolfer Se comporta de manera bastante diferente; no se puede dividir entre 1 a n-itshift, por ejemplo.
wizzwizz4

3
¿Qué significa base entera consistente ? (Además, en lugar de excluir unary en las reglas, podría especificar N ≥ 2.)
Lynn

1
@ Lynn Una notación posicional con una única raíz, por ejemplo, base diez, en lugar de una raíz dependiente de la posición, como se ve con las unidades imperiales o el tiempo.
HAEM

1
@Lynn como un apéndice, también estaba tratando de excluir bases racionales, negativas, complejas, etc. En cuanto a su segundo punto, la regla sobre unario no pretende incluir ni excluir unario. A menos que mi comprensión de la abogacía lingüística sea incluso más débil de lo que pensaba, "comportamiento indefinido" significa "lo que quiera la parte ejecutora", que es lo que estaba buscando.
HAEM

Respuestas:


10

Jalea , 7 bytes

bRṫ€3ċJ

Devuelve el número de bases (que no es cero es verdadero, cero es falso) en las que la entrada es un número de tres dígitos que termina en uno.

Pruébalo en línea!

Cómo 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 prueba

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

Guardado 3 bytes gracias a Adnan .

Lв3ù€θ1å

Pruébalo en línea!

Explicación

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}]&

Pruébalo en línea!

o Pruébelo en línea! (números grandes)

Martin Ender ahorró 3 bytes


!FreeQ[#~IntegerDigits~Range@#,{_,_,1}]&es un poco más corto si no te importa ver la IntegerDigits::ibase: Base 1 is not an integer greater than 1.advertencia. (Todavía devuelve las respuestas correctas.)
Misha Lavrov




2

APL (Dyalog Unicode) , SBCS 21 20 14 bytes

-5 gracias a @ngn.

Solución puramente aritmética (en realidad no hace ninguna conversión de base) y, por lo tanto, muy rápida.

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

Pruébalo en línea!

⊢(... )⍨1↓⍳ en uno de los argumentos ɩ ndices 1 ... y el argumento, aplique:

| los restos de la división

×∘⌈ veces el redondeado

Argumento  log N

3∊ es tres un miembro de eso?


puede guardar 1 con el truco estándar de intercambio de los argumentos:⊢(∨/(3=∘⌈⍟)∧1=|)⍨1↓⍳
NGN

@ngn Gracias. La próxima vez, siéntase libre de editarlo (si lo desea).
Adám

Okay. Aquí hay una mejora más complejo que lo dejo para que usted resuelva - que hace que este tan corto como su otra solución:(⊂1 3)∊⊢(⌈|,¨⍟)⍨1↓⍳
NGN

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

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


1

Casco , 15 bytes

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

Pruébalo en línea!

Explicación

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

sale con 0por falsedad (o entrada 3), 1por verdad.
Ejecutar como tubería con -nRo probarlo en línea .


1

C, 60 bytes

Una función que devuelve un valor distinto de cero si el argumento puede representarse como un número de tres dígitos que termina en 1:

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

Nota: esto funciona con GCC, donde las funciones están integradas. Para otros compiladores, probablemente deba asegurarse de que se conocen los argumentos y los tipos de retorno:

#include<math.h>

Explicación

La base más baja en la que nse representa en 3 dígitos es ⌊∛n⌋, y la base más baja en la que nse representa en 2 dígitos es ⌊√n⌋, por lo que simplemente probamos si el número es congruente con 1 módulo de cualquier base en el rango de 3 dígitos. Devolvemos el recuento del número de bases que satisfacen la condición, dando un valor distinto de cero (verdadero) o cero (falso) según corresponda.

Programa de prueba

Pase cualquier cantidad de entradas como parámetros posicionales:

#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⇹∈;

Explicación:

←ĐĐ                                             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

Pruébalo en línea!


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.