Generar valores perezosos.

25

Relacionado: Programar mi horno microondas . Inspirado en Generar entrada de microondas perezosa .

El valor diferido del entero no negativo N es el menor de los enteros más cercanos a N, mientras que todos sus dígitos son idénticos.

Return (por cualquier medio) el valor perezoso de un (por cualquier medio) dado N .

Nel entero más grande que su idioma representa en forma no exponente de forma predeterminada. 1000000 (Se pierden muchas soluciones interesantes debido a este requisito demasiado alto).

Casos de prueba:

   0 →    0
   8 →    8
   9 →    9
  10 →    9
  16 →   11
  17 →   22
  27 →   22
  28 →   33
 100 →   99
 105 →   99
 106 →  111
 610 →  555
 611 →  666
7221 → 6666
7222 → 7777 

El colega en cuestión demostró que no habrá lazos: excepto para el 11 de septiembre, el 99/111, etc. para los cuales uno es más corto que el otro, dos respuestas válidas consecutivas siempre están a una distancia impar, por lo que ningún número entero puede ser exactamente equidistante de ellos.

Adán
fuente

Respuestas:

15

JavaScript (ES6), 31 bytes

n=>~-(n*9+4).toPrecision(1)/9|0

Calcula directamente el valor diferido de cada uno n.

Editar: solo funciona hasta 277777778 debido a las limitaciones del tipo entero de JavaScript. Versiones alternativas:

n=>((n*9+4).toPrecision(1)-1)/9>>>0

35 bytes, funciona hasta 16666666667.

n=>((n=(n*9+4).toPrecision(1))-n[0])/9

38 bytes, funciona hasta 944444444444443. Pero todavía es algo menos que 2 53, que es 9007199254740992.

Neil
fuente
@ user81655 He agregado algunas versiones alternativas con sus limitaciones numéricas.
Neil
1
No pude hacer funcionar este algoritmo Number.MAX_SAFE_INTEGERporque 8e16 - 1se expresa como 8e16. Lamentablemente, parece que la única forma sería codificar el resultado máximo. +1 no obstante.
user81655
@ user81655 Bajé el límite superior para permitir la solución.
Adám
Te tengo a 10k @Neil, me encantan los campos de golf!
NiCk Newman
1
@NiCkNewman Woohoo! ¡Gracias!
Neil
5

Jalea, 16 bytes

ḤRµDIASµÐḟµạ³ỤḢị

Pruébalo en línea!

Cómo funciona

ḤRµDIASµÐḟµạ³ỤḢị  Main link. Input: n

Ḥ                 Compute 2n.
 R                Yield [1, ..., 2n] or [0].
  µ               Begin a new, monadic chain. Argument: R (range)
   D              Convert to base 10.
    I             Compute all differences of consecutive decimal digits.
     A            Take the absolute values of the differences.
      S           Sum the absolute values.
       µÐḟ        Filter-false by the chain to the left.
          µ       Begin a new, monadic chain. Argument: L (lazy integers)
           ạ³     Take the absolute difference of each lazy integer and n (input).
             Ụ    Grade up; sort the indices of L by the absolute differences.
                  This is stable, so ties are broken by earlier occurrence and,
                  therefore, lower value.
              Ḣ   Head; retrieve the first index, corresponding to the lowest
                  absolute difference.
               ị  Retrieve the item of L at that index.
Dennis
fuente
4

Oracle SQL 11.2, 200 bytes

WITH v(i)AS(SELECT 0 FROM DUAL UNION ALL SELECT DECODE(SIGN(i),0,-1,-1,-i,-i-1)FROM v WHERE LENGTH(REGEXP_REPLACE(:1+i,'([0-9])\1+','\1'))>1)SELECT:1+MIN(i)KEEP(DENSE_RANK LAST ORDER BY rownum)FROM v;

Sin golf

WITH v(i) AS
(
  SELECT 0 FROM DUAL      -- Starts with 0
  UNION ALL
  SELECT DECODE(SIGN(i),0,-1,-1,-i,-i-1) -- Increments i, alternating between negatives and positives
  FROM   v 
  WHERE  LENGTH(REGEXP_REPLACE(:1+i,'([0-9])\1+','\1'))>1  -- Stop when the numbers is composed of only one digit
)
SELECT :1+MIN(i)KEEP(DENSE_RANK LAST ORDER BY rownum) FROM v;
Jeto
fuente
3

Pyth - 26 bytes

Esta respuesta no siempre devuelve el valor más pequeño en un empate, pero eso no está en las especificaciones, por lo que se espera una aclaración fijada para 3 bytes.

hSh.g.a-kQsmsM*RdjkUTtBl`Q

Test Suite .

Maltysen
fuente
3

Pyth, 16 bytes

haDQsM*M*`MTSl`Q

Pruébelo en línea: Demostración o conjunto de pruebas

Explicación:

haDQsM*M*`MTSl`Q   implicit: Q = input number
              `Q   convert Q to a string
             l     take the length
            S      create the list [1, 2, ..., len(str(Q))]
         `MT       create the list ["0", "1", "2", "3", ..., "9"]
        *          create every combination of these two lists:
                   [[1, "0"], [1, "1"], [1, "2"], ..., [len(str(Q)), "9"]]
      *M           repeat the second char of each pair according to the number:
                   ["0", "1", "2", ..., "9...9"]
    sM             convert each string to a number [0, 1, 2, ..., 9...9]
  D                order these numbers by:
 a Q                  their absolute difference with Q
h                  print the first one
Jakube
fuente
3

MATL , 25 bytes

2*:"@Vt!=?@]]N$vtG-|4#X<)

Utiliza fuerza bruta, por lo que puede llevar un tiempo para grandes cantidades.

Pruébalo en línea!

2*:       % range [1,2,...,2*N], where is input
"         % for each number in that range
  @V      %   push that number, convert to string
  t!=     %   test all pair-wise combinations of digits for equality
  ?       %   if they are all equal
    @     %     push number: it's a valid candidate
  ]       %   end if
]         % end for each
N$v       % column array of all stack contents, that is, all candidate numbers
t         % duplicate
G-|       % absolute difference of each candidate with respect to input
4#X<      % arg min
)         % index into candidate array to obtain the minimizer. Implicitly display
Luis Mendo
fuente
3

Perl, 32

Basado en la hermosa solución JavaScript de Neil.

$_=0|1/9*~-sprintf"%.e",$_*9+4.1

Comienza a fallar a las 5e15

Ton Hospel
fuente
2

Mathematica, 122 bytes

f@x_:=Last@Sort[Flatten@Table[y*z,{y,1,9},{z,{FromDigits@Table[1,10~Log~x+1-Log[10,1055555]~Mod~1]}}],Abs[x-#]>Abs[x-#2]&]

Función llamada x.

CalculadoraFeline
fuente
2

JavaScript (ES6), 59 bytes

n=>eval(`for(i=a=0;i<=n;a=i%10?a:++i)p=i,i+=a;n-p>i-n?i:p`)

Solución recursiva (56 bytes)

Esto es un poco más corto pero no funciona n > 1111111110porque se excede el tamaño máximo de la pila de llamadas, por lo que técnicamente no es válido.

f=(n,p,a,i=0)=>n<i?n-p>i-n?i:p:f(n,i,(i-=~a)%10?a:i++,i)

Explicación

Itera a través de cada número diferido hasta llegar al primero, que es mayor que n, luego se compara ncon este y el número anterior para determinar el resultado.

var solution =

n=>
  eval(`           // eval enables for loop without {} or return
    for(
      i=a=0;       // initialise i and a to 0
      i<=n;        // loop until i > n, '<=' saves having to declare p above
      a=i%10?a:++i // a = amount to increment i each iteration, if i % 10 == 0 (eg.
    )              //     99 + 11 = 110), increment i and set a to i (both become 111)
      p=i,         // set p before incrementing i
      i+=a;        // add the increment amount to i
    n-p>i-n?i:p    // return the closer value of i or p
  `)
N = <input type="number" oninput="R.textContent=solution(+this.value)"><pre id="R"></pre>

usuario81655
fuente
Bajé el límite superior para permitir su solución.
Adám
1

05AB1E , 20 bytes

9Ývy7L×})˜ïD¹-ÄWQÏ{¬

Pruébalo en línea!

9Ý                   # Push 0..9
  vy7L×})˜           # For each digit, 0-9, push 1-7 copies of that number.
          ïD         # Convert to integers, dupe the list.
            ¹        # Push original input (n).
             -Ä      # Push absolute differences.
               WQ    # Get min, push 1 for min indices.
                 Ï{¬ # Push indices from original array that are the min, sort, take first.
Urna de pulpo mágico
fuente
99 es seguramente más vago que 111, ya que solo requiere presionar dos botones.
Adám
@ Adám bastante justo, comando principal añadido.
Urna mágica del pulpo
1

Mathematica, 56 bytes

Min@Nearest[##&@@@Table[d(10^n-1)/9,{n,0,6},{d,0,9}],#]&

Función pura con primer argumento #, funciona para entradas de hasta10^6 .

Para un entero no negativo ny un dígito d, 10^n-1 = 99...9( tiempos 9repetidos n), entonces d(10^n-1)/9 = dd...d( tiempos drepetidos n). Crea un Tablede los valores de 0 <= n <= 6y 0 <= d <= 9, a continuación, se aplana la tabla, se encuentra la lista de elementos Nearesta #y toma el Min.

Creo que esta versión funcionará para enteros arbitrariamente grandes:

Min@Nearest[##&@@@Table[d(10^n-1)/9,{n,0,IntegerLength@#},{d,0,9}],#]&
ngenisis
fuente