Encuentra la suma de los primeros n números hinchables

19

Terminología

Un número creciente es aquel en el que cada dígito es mayor o igual que todos los dígitos a la izquierda del mismo (ej. 12239)

Un número decreciente es aquel en el que cada dígito es menor o igual que todos los dígitos a la izquierda del mismo (por ejemplo, 95531)

Un número de rebote es cualquier número que no aumenta o disminuye. Como esto requiere al menos 3 dígitos, el primer número de rebote es 101

La tarea

Dado un número entero n mayor o igual a 1, encuentre la suma de los primeros n números hinchables

Reglas

  • Este es el código de golf, por lo que gana la respuesta con la menor cantidad de bytes
  • Si su idioma tiene límites en el tamaño del entero (ej. 2 ^ 32-1) n será lo suficientemente pequeño como para que la suma se ajuste al entero
  • La entrada puede ser cualquier forma razonable (stdin, archivo, parámetro de línea de comando, entero, cadena, etc.)
  • La salida puede tener cualquier forma razonable (stdout, archivo, elemento gráfico de usuario que muestre el número, etc.)

Casos de prueba

1 > 101
10 > 1065
44701 > 1096472981
avern
fuente
3
No estoy seguro de entender sus restricciones. ¿Puedo ver sortlos números y verificar si son iguales al número original? Eso está usando un incorporado ( sort), pero no es estrictamente un incorporado para verificar si está aumentando. Echa un vistazo a los requisitos del programa no observables y haz X sin Y en nuestra publicación Meta "Cosas para evitar".
AdmBorkBork
55
Hola, bienvenido a PPCG! Si bien este es un buen primer mensaje (1), tengo algunas pequeñas sugerencias: No hay órdenes internas que cheque si se está incrementando puede utilizar un número , no hay órdenes internas que cheque si una cadena está aumentando lexicográfico puede utilizarse (no permitir órdenes internas) es algo que debe evitarse al escribir desafíos ; Tenemos un Sandbox para los desafíos propuestos , donde puede compartir su idea de publicación antes de
enviarla
Actualicé las restricciones para que coincidan mejor con la categoría "Excepciones" del enlace que publicaste
avern
44
Todavía no veo el punto de tener tal restricción en primer lugar. Por supuesto, depende de usted si desea conservarlo o no, pero prohibir las incorporaciones suele ser una mala práctica. Si cree que el desafío es trivializado por los elementos integrados, debe tener en cuenta que simplemente restringirlos no hace que la resolución de la tarea sea más interesante, sino que agrega repeticiones. ¿Podría considerar eliminar esa restricción? (por cierto, esto todavía cae bajo Do X sin Y ) De lo contrario, me gusta mucho la idea, y no quisiera que una restricción un poco subjetiva le reste valor a la tarea real.
Sr. Xcoder
10
Sin embargo, he eliminado la restricción, ya que está claro que es más agradable para la comunidad de esa manera, y confiará en las directrices y mejores prácticas que aseguran que aquí retos son de la mejor calidad
averno

Respuestas:

8

Jalea , 10 8 bytes

ṢeṚƬ¬µ#S

Pruébalo en línea!

Cómo funciona

ṢeṚƬ¬µ#S  Main link. No arguments.

      #   Read an integer n from STDIN and call the chain to the left with argument
          k = 0, 1, 2, ... until n of them return a truthy result.
          Yield the array of successful values of k.
     µ    Monadic chain. Argument: k (integer)
Ṣ           Sort, after promoting k to its digit array.
  ṚƬ        Reverse 'til the results are no longer unique and yield unique results.
            Calling Ṛ on k promotes it to its digit array. If k = 14235, the 
            result is [14235, [5,3,2,4,1], [1,4,2,3,5]].
 e          Check if the result to the left appears in the result to the right.
    ¬       Negate the resulting Boolean.
       S  Take the sum.
Dennis
fuente
44
+1 ṚƬes extremadamente ordenado ...
Sr. Xcoder
6

Pyth , 10 bytes

s.f!SI#_B`

Pruébalo aquí!

¿Cómo funciona?

sf! SI # _B` - Programa completo. Toma un entero Q de STDIN y sale a STDOUT.
 .f - Encuentra los primeros Q enteros positivos que satisfacen una determinada condición.
   ! SI # _B - La condición. Devuelve verdadero solo para números hinchables.
       _B` - Emite el número a una cadena y bifurca (empareja) con su reverso.
      # - Filtrar-guardar esos ...
     I - Que son invariables bajo ...
    S - Clasificación.
           - Para aclarar, I (invariante) es un operador Pyth que toma dos entradas, una 
             función y un valor y comprueba si function (value) == value, entonces
             Esto técnicamente no es una función incorporada.
   ! - Lógico no. La lista vacía se asigna a verdadero, otros valores a falso.
s - Suma.
Sr. Xcoder
fuente
4

K (ngn / k) , 37 bytes

{+/x{{(a~&\a)|a~|\a:10\x}(1+)/x+1}\0}

Pruébalo en línea!

{ } es una función con argumento x

x{ }\0aplica los tiempos de {}encendido 0 x, preservando los resultados intermedios

(1+) es la función sucesora

{ }(1+)/x+1aplica la función sucesora a partir de x+1hasta que el {}retorno sea verdadero

10\x son los dígitos decimales de x

a: asignar a a

|\ es la exploración máxima (máximos parciales) de a

&\ análogamente, es el escaneo mínimo

a~|\ano aigualar su máximo de escaneo?

| o

a~&\a su escaneo min?

+/ suma

ngn
fuente
4

JavaScript (ES6), 77 bytes

f=(i,n=0,k,p)=>i&&([...n+''].map(x=>k|=x<p|2*(p<(p=x)))|k>2&&i--&&n)+f(i,n+1)

Pruébalo en línea!

Comentado

f = (                     // f = recursive function taking:
  i,                      //   i = number of bouncy numbers to find
  n = 0,                  //   n = current value
  k,                      //   k = bitmask to flag increasing/decreasing sequences
  p                       //   p = previous value while iterating over the digits
) =>                      //
  i && (                  // if there's still at least one number to find:
    [...n + '']           //   turn n into a string and split it
    .map(x =>             //   for each digit x in n:
      k |=                //     update k:
        x < p |           //       set bit #0 if x is less than the previous digit
        2 * (p < (p = x)) //       set bit #1 if x is greater than the previous digit
                          //       and update p
    )                     //   end of map()
    | k > 2               //   if both bits are set (n is bouncy):
    && i--                //     decrement i
    && n                  //     and add n to the total
  ) + f(i, n + 1)         //   add the result of a recursive call with n + 1
Arnauld
fuente
3

Python 2, 110 92 89 bytes

n=input()
x=s=0
while n:b={-1,1}<=set(map(cmp,`x`[:-1],`x`[1:]));s+=x*b;n-=b;x+=1
print s

Pruébalo en línea

Esta función determina si un número es hinchable:

lambda x:{-1,1}<=set(map(cmp,`x`[:-1],`x`[1:]))
mbomb007
fuente
Puedes comparar personajes directamente. De hecho, su comprensión puede llegar a ser set(map(cmp,`x`[:-1],`x`[1:])).
Jakob
@ Jakob Gracias. Siempre olvido que puedes usarlo de mapesa manera.
mbomb007
1
x=s=0\nwhile n:b={-1,1}<=set(map(cmp,`x`[:-1],`x`[1:]));s+=x*b;n-=b;x+=1ahorra 3 bytes
Sr. Xcoder
3

Retina , 93 bytes

K`:
"$+"{/(?=.*;(_*);\1_)(?=.*_(_*);\2;)/^{`:(#*).*
:$1#;$.($1#
)`\d
*_;
)`:(#+).*
$1:$1
\G#

Pruébalo en línea! Explicación:

K`:

Inicializar s=i=0. ( ses el número de #s antes del :, iel número de #s después).

"$+"{
...
)`

Repite nveces.

/(?=.*;(_*);\1_)(?=.*_(_*);\2;)/^{`
...
)`

Repita mientras ino sea hinchable.

:(#*).*
:$1#;$.($1#

Incrementar iy hacer una copia en decimal.

\d
*_;

Convierta los dígitos de la copia a unario. La prueba de rebote utiliza la copia unaria, por lo que solo funciona una vez que ise ha incrementado al menos una vez.

:(#+).*
$1:$1

Añadir ia sy borrar la copia de los dígitos unarios, de manera que para la siguiente pasada del bucle interno de la prueba bounciness falla y ise incrementa al menos una vez.

\G#

Convierte sa decimal.

La versión de 121 bytes se calcula en decimal, por lo que podría funcionar para valores mayores de n:

K`0:0
"$+"{/(?=.*;(_*);\1_)(?=.*_(_*);\2;)/^{`:(\d+).*
:$.($1*__);$.($1*__)
)+`;\d
;$&*_;
)`\d+:(\d+).*
$.(*_$1*):$1
:.*

Pruébalo en línea! Explicación:

K`0:0

Inicializar s=i=0.

"$+"{
...
)`

Repite nveces.

/(?=.*;(_*);\1_)(?=.*_(_*);\2;)/^{`
...
)

Repita mientras ino sea hinchable.

:(\d+).*
:$.($1*__);$.($1*__)

Incrementar iy hacer una copia.

+`;\d
;$&*_;

Convierta los dígitos de la copia a unario. La prueba de rebote utiliza la copia unaria, por lo que solo funciona una vez que ise ha incrementado al menos una vez.

\d+:(\d+).*
$.(*_$1*):$1

Añadir ia sy borrar la copia de los dígitos unarios, de manera que para la siguiente pasada del bucle interno de la prueba bounciness falla y ise incrementa al menos una vez.

:.*

Eliminar i.

Neil
fuente
3

05AB1E , 12 bytes

µN{‚Nå_iNO¼

Pruébalo en línea!

Explicación

µ              # loop over increasing N until counter equals input
     Nå_i      # if N is not in
 N{‚          # the pair of N sorted and N sorted and reversed
         NO    # sum N with the rest of the stack
           ¼   # and increment the counter
Emigna
fuente
3

Java 8, 114 112 bytes

n->{int i=0,s=0;for(;n>0;++i)s+=(""+i).matches("0*1*2*3*4*5*6*7*8*9*|9*8*7*6*5*4*3*2*1*0*")?0:--n*0+i;return s;}

Utiliza una expresión regular para verificar si el número aumenta o disminuye. Pruébelo en línea aquí .

Sin golf:

n -> { // lambda
    int i = 0, // the next number to check for bounciness
        s = 0; // the sum of all bouncy numbers so far
    for(; n > 0; ++i) // iterate until we have summed n bouncy numbers, check a new number each iteration
        s += ("" + i) // convert to a String
             .matches("0*1*2*3*4*5*6*7*8*9*" // if it's not an increasing  number ...
             + "|9*8*7*6*5*4*3*2*1*0*") ? 0 // ... and it's not a decreasing number ...
             : --n*0 // ... we have found another bouncy number ...
               + i; // ... add it to the total.
    return s; // return the sum
}
OOBalance
fuente
2

Python 2, 250 bytes

n=input()
a=0
b=0
s=0
while a<n:
    v=str(b)
    h=len(v)
    g=[int(v[f])-int(v[0]) for f in range(1,h) if v[f]>=v[f-1]]
    d=[int(v[f])-int(v[0]) for f in range(1,h) if v[f]<=v[f-1]]
    if len(g)!=h-1 and len(d)!=h-1:
       a+=1
       s+=b
    b+=1
print s
Papitas fritas
fuente
¡Bienvenido! Es posible que desee ver esta página de Consejos para
jugar
1
Sugiero usar ;para poner tantas declaraciones en una sola línea como sea posible, eliminar espacios en blanco y definir una función para las 2 líneas largas que son muy similares, para que pueda reutilizar parte del código. Además, puedes hacer a=b=s=0y len(g)!=h-1!=len(d).
mbomb007
Gracias por los consejos. Tengo que irme ahora. pero trabajaré en eso más tarde.
Hashbrowns
0

Rojo , 108 bytes

func[n][i: s: 0 until[t: form i
if(t > u: sort copy t)and(t < reverse u)[s: s + i n: n - 1]i: i + 1
0 = n]s]

Pruébalo en línea!

Más legible:

f: func [ n ] [
    i: s: 0
    until [
       t: form i  
       if ( t > u: sort copy t ) and ( t < reverse u ) [
            s: s + i
            n: n - 1
       ]
       i: i + 1
       0 = n
    ]
    s
]

Una buena oportunidad de uso form: form ies 5 bytes más corto queto-string i

Galen Ivanov
fuente
0

MATL , 31 30 bytes

l9`tVdZS&*0<a?wQtG>?.]y]QT]xvs

Pruébalo en línea!

l       % Initialize counter to 1
9       % First value to check for being bouncy
`       % Start do-while loop
  tV    % duplicate the current number and convert to string
        % (let's use the iteration where the number is 1411)
        % stack: [1, 1411, '1411']
  d     % compute differences between the characters
        %  For non-bouncy numbers, this would be either all 
        %  positive values and 0, or all negative values and 0
        % stack: [1, 1411, [3 -3 0]]
  ZS    % keep only the signs of those differences
        % stack: [1, 1411, [1 -1 0]]
  &*    % multiply that array by its own transpose, so that
        %  each value is multiplied by every other value
        %  for non-bouncy numbers, all products will be >=0
        %  since it would have had only all -1s or all 1 (other than 0s)
        % stack: [1, 1411, [1 -1  0
                            -1  1 0
                            0  0  0]]
  0<a?  % if any value in the matrix is less than 0
    wQ    % switch the counter to top, increment it
          % stack: [1411, 2]
    tG>?  % duplicate it, check if it's gotten greater than the input limit
      .]    % if so, break out of loop
  y]    % else, duplicate bouncy number from inside stack,
        %  keeping a copy to be used for summing later
        % stack: [1411, 2, 1411]
  QT    % increment number, push True to continue loop
]     % loop end marker
x     % if we've broken out of loop, remove counter from stack
v     % concatenate the bouncy numbers we've collected in stack and 
s     % sum them
sundar - Restablecer a Monica
fuente
0

R , 96 bytes

function(n){while(n){y=diff(T%/%10^(0:log10(T))%%10);g=any(y<0)&any(y>0);F=F+T*g;n=n-g;T=T+1};F}

Pruébalo en línea!

Explicacion:

while(n){                         # while n > 0

        T%/%10^(0:log10(T))%%10   # split T into digits(T==TRUE==1 at the 1st loop)
y=diff(                         ) # compute the diff of digits i.e. digits[i] - digits[i+1]

g=any(y<0)&any(y>0)               # if at least one of the diff is < 0 and 
                                  # at least one is > 0 then T is "bouncy"

F=F+T*g                           # if bouncy increment F (F==FALSE==0 at the 1st loop)

n=n-g                             # decrement n by 1 if bouncy

T=T+1}                            # increment T by 1 and loop

F}                                # return F
digEmAll
fuente
0

Rubí (123 bytes)

o=0
x=["0"]
while n>0 do x=(x.join.to_i+1).to_s.split('')
(x.sort!=x&&x.sort!=x.reverse ? (n-=1;o+=x.join.to_i):'')
end
p o

Me parece bastante feo. Bounciness se define en este bloquex.sort!=x&&x.sort!=x.reverse

aaaaa dice reinstalar a Mónica
fuente
0

C (gcc), 104 bytes

f(b,o,u,n,c,y){for(o=u=0;b;u+=y?0:o+0*--b,++o)for(n=o,y=3;n/10;)c=n%10,n/=10,y&=(c-=n%10)<0?:c?2:y;b=u;}

Pruébelo en línea aquí .

Sin golf:

f(n, // function: return type and type of arguments defaults to int;
     // abusing extra arguments to declare variables
  i,   // number currently being checked for bounciness
  s,   // sum of the bouncy numbers
  j,   // copy of i to be used for checking bounciness in a loop
  p,   // used for investigating the last digit of j
  b) { // whether i is not bouncy; uses the two least significant bits to indicate increasing/decreasing
    for(i = s = 0; // check numbers from zero up; initial sum is zero
        n; // continue until we have n bouncy numbers
        s += b ? 0 // not bouncy, no change to the sum
        : i + 0* --n, // bouncy, add it to the sum and one less bouncy number to go
        ++i) // either way, move to the next number
        for(j = i, b = 3; j/10; ) // make a copy of the current number, and truncate it from the right until there is just one digit left
        // bounciness starts as 0b11, meaning both increasing and decreasing; a value of 0 means bouncy
            p = j % 10, // get the last digit
            j /= 10, // truncate one digit from the right
            b &= // adjust bounciness:
                 (p -= j % 10) // compare current digit to the next
                 < 0 ? // not an increasing number, clear second to least significant bit
                 : p ? 2 // not a decreasing number, clear least significant bit
                 : b; // keep it the same
    n = s; // gcc shortcut for return s
}
OOBalance
fuente
Sugerir en u+=!y?--b,o:0,++olugar de u+=y?0:o+0*--b,++o, en ;y&=(c-=n%10)<0?:c?2:y)c=n%10,n/=10;lugar de;)c=n%10,n/=10,y&=(c-=n%10)<0?:c?2:y;
ceilingcat