Генерировать ленивые значения

25

Связанный: Запрограммируйте мою микроволновую печь . Вдохновленный генерировать ленивый микроволновый вход .

Ленивое значение неотрицательного целого числа N является наименьшим из целых чисел, которые являются ближайшими к N, в то время как все их цифры идентичны.

Возврат (любым способом) ленивым значение заданной (любым способом) N .

Nнаибольшее целое число, которое ваш язык представляет в неэкспоненциальной форме по умолчанию. 1000000 (Из-за этого слишком высокого требования потеряно много интересных решений.)

Тестовые случаи:

   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 

Рассматриваемый коллега доказал, что не будет никаких связей: за исключением 9/11, 99/111 и т. Д., Для которых один короче другого, два последовательных правильных ответа всегда находятся на расстоянии нечетного расстояния, поэтому никакое целое число не может быть точно равноудалено от них.

Адам
источник

Ответы:

15

JavaScript (ES6), 31 байт

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

Непосредственно вычисляет ленивое значение для каждого n.

Изменить: работает только до 277777778 из-за ограничений целочисленного типа JavaScript. Альтернативные версии:

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

35 байт, работает до 16666666667.

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

38 байт, работает до 944444444444443. Но это все еще немного меньше 2 53, что составляет 9007199254740992.

Нил
источник
@ user81655 Я добавил несколько альтернативных версий с их числовыми ограничениями.
Нил
1
Я не мог заставить этот алгоритм работать с Number.MAX_SAFE_INTEGERлюбым из 8e16 - 1них, потому что выражается как 8e16. К сожалению, похоже, что единственным способом было бы жестко запрограммировать максимальный результат. +1 тем не менее.
user81655
@ user81655 Я опустил верхнюю границу, чтобы позволить решение.
Адам
Получил 10k @Neil, люблю гольф!
NiCk Newman
1
@NiCkNewman Woohoo! Благодарность!
Нил
5

Желе, 16 байт

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

Попробуйте онлайн!

Как это работает

Ḥ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.
Деннис
источник
4

Oracle SQL 11.2, 200 байт

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;

Un-golfed

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;
школа для водителей
источник
3

Pyth - 26 байт

Этот ответ не всегда возвращает наименьшее значение в связи, но это не указано в спецификации, поэтому ожидаем уточнения для 3 байтов.

hSh.g.a-kQsmsM*RdjkUTtBl`Q

Тестовый пакет .

Maltysen
источник
3

Pyth, 16 байт

haDQsM*M*`MTSl`Q

Попробуйте онлайн: демонстрация или тестовый набор

Объяснение:

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
источник
3

MATL , 25 байт

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

Использует грубую силу, поэтому для больших чисел это может занять некоторое время.

Попробуйте онлайн!

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
Луис Мендо
источник
3

Perl, 32

Основано на прекрасном решении JavaScript от Neil.

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

Начинает терпеть неудачу в 5e15

Тон Хоспел
источник
2

Mathematica, 122 байта

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

Функция с именем х.

CalculatorFeline
источник
2

JavaScript (ES6), 59 байт

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

Рекурсивное решение (56 байт)

Это немного короче, но не работает, n > 1111111110потому что превышен максимальный размер стека вызовов, поэтому он технически недопустим.

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

объяснение

Перебирает все ленивые числа, пока не доберется до первого, который больше чем n, затем сравнивает nэто и предыдущее число, чтобы определить результат.

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>

user81655
источник
Я опустил верхнюю границу, чтобы позволить ваше решение.
Адам
1

05AB1E , 20 байтов

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

Попробуйте онлайн!

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.
Урна волшебного осьминога
источник
99, безусловно, более ленивый, чем 111, так как он требует только двух нажатий кнопок.
Адам
@ Adam достаточно справедливо, добавил командование головой.
Волшебная Осьминог Урна
1

Mathematica, 56 байт

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

Чистая функция с первым аргументом #, работает для входов до 10^6.

Для неотрицательного числа nи цифры d, 10^n-1 = 99...9( 9повторные nраза), поэтому d(10^n-1)/9 = dd...d( dповторяющиеся nраз). Создает Tableзначения для 0 <= n <= 6и 0 <= d <= 9, затем сглаживается таблица, находит список элементов Nearestдо #и берета Min.

Я считаю, что эта версия будет работать для произвольно больших целых чисел:

Min@Nearest[##&@@@Table[d(10^n-1)/9,{n,0,IntegerLength@#},{d,0,9}],#]&
ngenisis
источник