เบอร์โฮเลีย


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

ตัวเลขทั้งหมดได้รับการตอบแทนอย่างเหมาะสมสำหรับงานของพวกเขาด้วยความศักดิ์สิทธิ์พิเศษและทั้งหมดนั้นก็ดี เราจะเรียกคุณสมบัตินี้ว่า

ในภาษาไพ ธ อนที่ยิ่งใหญ่อัลกอริทึมสำหรับการคำนวณไฮเทคที่ปรับปรุงแล้วอาจมีลักษณะดังนี้:

# 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หมายเลขศักดิ์สิทธิ์แรกเรียงตามการเพิ่มขึ้นของ holarity โดยใช้ค่าตัวเลขเป็น tiebreaker คุณอาจสมมติว่าอินพุตและเอาต์พุตจะไม่มากกว่าจำนวนเต็มที่แทนค่าสูงสุดในภาษาของคุณหรือ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
ความคิดของรูนี้คือ holarious
งานอดิเรกของ Calvin

คุณหมายถึงอะไรโดย "ผลผลิตจะไม่เกิน ... "? ในขณะที่การส่งออกจะไม่ได้มีมากกว่าจำนวนใดมากกว่า2^64 - 1? หากเป็นกรณีนี้อาจเป็นสิ่งที่ควรค่าแก่การพิจารณาว่าอินพุตแรกสร้างหมายเลขดังกล่าวเพื่อให้ผู้คนสามารถทดสอบคำตอบของพวกเขาได้
FryAmTheEggman

@FryAmTheEggman ไม่มากไปกว่าน้อยกว่าหรือเท่ากับ ฉันจะอัปเดตโพสต์ด้วยค่าสูงสุดสำหรับขนาดจำนวนเต็มต่างๆ
Mego

รหัสไพ ธ อนของคุณใช้งานไม่ได้สำหรับ 6 มันสร้าง holines จาก 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 N 2สำหรับจำนวนเต็มบวกทั้งหมดN


โอ้เดี๋ยวก่อนฉันคิดถึงอะไรบางอย่างเหนื่อยเกินไปสำหรับเรื่องนี้
seequ

3

Lua, 317 ไบต์

ฉันมีปัญหาในการทำสิ่งนี้บางอย่างใน Lua ไม่ทำงานอย่างที่ฉันคิด ฉันจะต้องลองและเล่นกับพวกเขาหากฉันต้องการลงสนามนี้ คุณสามารถทดสอบ 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

Ungolfed และคำอธิบาย

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

Ternaries ที่ซ้อนกันที่ใช้สำหรับค่าใหม่ของ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

นอกจากนี้ฉันยังชอบที่จะแทนที่ nested 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 ไบต์โดยส่งกลับอาร์เรย์ของสตริง

Ungolfed:

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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.