Номери Холієра


22

Як ми дізналися з «Святих чисел» , існує 5 святих цифр ( 0, 4, 6, 8, 9), а додатні цілі числа, що складаються виключно з цих цифр, є святими. Крім того, святість ряду є сумою отворів в кількості ( +2для кожного 0або 8, і в +1іншому випадку).

Тепер є додаткова властивість, яку слід врахувати, щоб справді і точно представити святість числа. Розумієте, важливе значення має не лише кількість дірок у цифрі, а й те, де в кількості це відбувається.

Розглянемо число 88. За нашими старими правилами, це було б святістю 4. Але це навряд чи справедливо! 8Зліва робить більше роботи , ніж інший 8- в 10 разів більше роботи! Його слід винагороджувати за свою працю. Ми будемо винагороджувати її додатковими пунктами святості, рівними загальній святості всіх цифр праворуч (включаючи додаткові бали святості, надані цим правилом, цифрам праворуч), мінус 1.

Ось кілька прикладів, які слід врахувати:

Number: 8080
Digital holiness: (2 + 7 - 1) + (2 + 3 - 1) + (2 + 1 - 1) + (2 + 0 - 1)
Total holiness: 15

Number: 68904
Digital holiness: (1 + 5 - 1) + (2 + 2 - 1) + (1 + 1 - 1) + (2 + 0 - 1) + (1 + 0 - 1)
Total holiness: 10

Усі цифри належним чином нагороджуються за свою працю додатковою святістю, і все добре. Ми будемо називати цю властивість "посиленою холодністю".

На чудовому мові Python алгоритм обчислення посиленої галасності може виглядати приблизно так:

# assumes n is a holy number
def enhanced_holarity(n):
    if n < 10:
        return 1 if n in [0, 8] else 0
    else:
        digits = list(map(int,str(n)[::-1]))
        res = []
        for i,x in enumerate(digits):
            res.append(enhanced_holarity(x))
            if i > 0:
                res[i] += sum(res[:i])
        return sum(res)

Змагання

Враховуючи ціле число n > 0, виведіть перші nСвяті числа, відсортовані за зростанням посиленої галасності, використовуючи числове значення як розрив. Ви можете припустити, що вхід і вихід не будуть перевищувати максимальне представлене ціле число у вашій мові, або 2^64 - 1залежно від того, що менше.

Для довідки, ось декілька тестових випадків (введення, а потім вихід):

25
4, 6, 9, 44, 46, 49, 64, 66, 69, 94, 96, 99, 0, 8, 84, 86, 89, 40, 48, 60, 68, 90, 98, 80, 88

100
4, 6, 9, 44, 46, 49, 64, 66, 69, 94, 96, 99, 444, 446, 449, 464, 466, 469, 494, 496, 499, 644, 646, 649, 664, 666, 669, 694, 696, 699, 0, 8, 84, 86, 89, 844, 846, 849, 864, 866, 869, 894, 896, 899, 40, 48, 60, 68, 90, 98, 404, 406, 409, 484, 486, 489, 604, 606, 609, 684, 686, 689, 80, 88, 804, 806, 809, 884, 886, 889, 440, 448, 460, 468, 490, 498, 640, 648, 660, 668, 690, 698, 840, 848, 860, 868, 890, 898, 400, 408, 480, 488, 600, 608, 680, 688, 800, 808, 880, 888

200
4, 6, 9, 44, 46, 49, 64, 66, 69, 94, 96, 99, 444, 446, 449, 464, 466, 469, 494, 496, 499, 644, 646, 649, 664, 666, 669, 694, 696, 699, 944, 946, 949, 964, 966, 969, 994, 996, 999, 4444, 4446, 4449, 4464, 4466, 4469, 4494, 4496, 4499, 4644, 4646, 4649, 4664, 4666, 4669, 4694, 4696, 4699, 0, 8, 84, 86, 89, 844, 846, 849, 864, 866, 869, 894, 896, 899, 40, 48, 60, 68, 90, 98, 404, 406, 409, 484, 486, 489, 604, 606, 609, 684, 686, 689, 904, 906, 909, 984, 986, 989, 4044, 4046, 4049, 4064, 4066, 4069, 4094, 4096, 4099, 80, 88, 804, 806, 809, 884, 886, 889, 440, 448, 460, 468, 490, 498, 640, 648, 660, 668, 690, 698, 940, 948, 960, 968, 990, 998, 4404, 4406, 4409, 4484, 4486, 4489, 4604, 4606, 4609, 4684, 4686, 4689, 840, 848, 860, 868, 890, 898, 400, 408, 480, 488, 600, 608, 680, 688, 900, 908, 980, 988, 4004, 4006, 4009, 4084, 4086, 4089, 800, 808, 880, 888, 4440, 4448, 4460, 4468, 4490, 4498, 4640, 4648, 4660, 4668, 4690, 4698, 4040, 4048, 4060, 4068, 4090, 4098, 4400, 4408, 4480, 4488, 4600, 4608, 4680, 4688, 4000, 4008, 4080, 4088

10
Ця ідея лунки є веселою.
Захоплення Кальвіна

Що ви маєте на увазі під "вихід буде не більшим, ніж ..."? Як у виході не буде жодної кількості більше 2^64 - 1? Якщо це так, напевно, варто розібратися, який вхід спочатку генерує такі числа, щоб люди могли перевірити свої відповіді.
FryAmTheEggman

@FryAmTheEggman Не більший за значення, менші або рівні. Я оновлю публікацію з деякими максимумами для різних цілих розмірів.
Мего

Ваш код python не працює 6, він створює холіни 0.
shrx

Відповіді:


2

Python 2, 138 122 байт

Це шукає святих чисел до 5 N для входу N , що смішно повільно:

e=lambda s:s and(s[0]in'08')+e(s[1:])*2or 0
lambda N:sorted([`x`for x in range(5**N)if set(`x`)<=set('04689')][:N],key=e)

Тут обмеження становить 5 N 2 , і ви можете фактично запускати тестові приклади, ціною одного байту:

e=lambda s:s and(s[0]in'08')+e(s[1:])*2or 0
lambda N:sorted([`x`for x in range(5*N*N)if set(`x`)<=set('04689')][:N],key=e)

Перший фрагмент дійсний, як 5 N ≥ 5 Н 2 для всіх позитивних цілих чисел N .


Ой, чекай, я щось пропустив .. Занадто втомився від цього.
seequ

3

Луа, 317 байт

У мене були проблеми з цим, деякі речі в Луї не працюють так, як я думаю, що це робиться. Мені доведеться спробувати пограти з ними, якщо я хочу пограти в цей гольф. Ви можете протестувати lua в Інтернеті , замінивши arg[1]потрібну кількість елементів :).

function f(y)h=0(y..''):reverse():gsub(".",function(c)h=c:find("[08]")and 1+h or h end)return h end
x,a=0,{}while(#a<arg[1]+0)do a[#a+1],x=(x..''):find("^[04689]*$")and x or nil,x+1 end
for i=1,#a do m=1
for j=1,#a do x=a[m]m=(f(x)~=f(a[j])and f(x)>f(a[j])or x>a[j])and j or m
end end print(a[m])table.remove(a,m)end

Необурені і пояснення

function f(y)                     -- function returning the enhanced holiness of a holy number
  h=0                             -- h is the cumulated holyness of processed digits
  (y..''):reverse()               -- reverse the digits in y
         :gsub(".",function(c)    -- iterate over each digits
     h=c:find("[08]")and 1+h or h -- ternary based on the digit being [08] or [469]
   end)                           
  return h                        -- return h
end

x,a=0,{}                          -- initialise a counter, and the array of holy numbers
while(#a<arg[1]+0)                -- iterate until we have n holy numbers
do
  a[#a+1]=(x..'')                 
      :find("^[04689]*$")         -- if we can't find an unholy digit
             and x or nil         -- insert x into a
  x=x+1                           -- increment x anyway
end

for i=1,#a                        -- iterate n times(current size of a)
do
  m=1                             -- m is the index of the lowest value
  for j=1,#a                      -- iterate over a
  do
    x=a[m]                        -- x is shorter to write than a[m]
    m=(f(x)~=f(a[j])              -- nested ternaries, translated in
        and f(x)>f(a[j])          -- nested if below
        or x>a[j])and j or m      
  end
  print(a[m])                     -- output a[m]
  table.remove(a,m)               -- remove it from the table a
end

Вкладені тернари, які використовуються для нового значення, mможна перекласти у вкладені ifs як:

if(f(a[m])~=f(a[j])) then         -- if a[m] and a[j] don't have the same holyness
  if(f(a[m])>f(a[j])) then m=j end-- compare by holyness
else
  if(a[m]>a[j]) then m=j end      -- else, compare by numeric value

Крім того, я б хотів замінити вкладене forна використання table.sort, але, з тієї причини, якої я не знаю, наступне не працює, не створюючи нескінченний цикл або роздавлюючи функцію сортування.

table.sort(a,function(i,j)
    return f(i)~=f(j)              
         and f(i)>f(j)          
         or i>j
end)

1

JavaScript (ES6), 166 165 байт

f=n=>[...Array(n)].map((_,i)=>i.toString(5)).sort((a,b)=>e(a)-e(b),e=n=>'0b'+[...n.replace(/./g,c=>'10010'[c])].reverse().join``).map(n=>+n.replace(/./g,c=>"04689"[c]))

Редагувати: збережено 1 байт, повернувши масив рядків.

Безголівки:

function base5_to_extended_holiness_binary(c) {
    return "10010"[c];
}
function extended_holiness(n) {
    var binary = n.toString(5).replace(/./g, base5_to_extended_holiness_binary);
    binary = s.split("").reverse().join("");
    return parseInt(s, 2);
}
function extended_holiness_sort(a, b) {
    return extended_holiness(a) - extended_holiness(b);
}
function base5_to_holy_number(c) {
    return "04689"[c];
}
function list_by_extended_holiness(n) {
    var array = new Array(n);
    for (var i = 0; i < n; i++)
         array[i] = i;
    array = array.sort(extended_holiness_sort);
    for (var i = 0; i < n; i++)
        array[i] = parseInt(array[i].toString(5).replace(/./g, base5_to_holy_number);
    return array;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.