হলিয়ার নাম্বার


22

যেহেতু আমরা পবিত্র নাম্বার থেকে শিখেছি , সেখানে পাঁচটি পবিত্র সংখ্যা ( 0, 4, 6, 8, 9) রয়েছে এবং কেবলমাত্র digit সংখ্যার সমন্বিত ইতিবাচক পূর্ণসংখ্যাগুলি পবিত্র। উপরন্তু, একটি সংখ্যা বিশুদ্ধতা সংখ্যা দোষ এর সমষ্টি (হয় +2যে জন্য 0বা 8, এবং +1অন্যথায়)।

এখন, সংখ্যার পবিত্রতা উপস্থাপনের জন্য, বিবেচনার জন্য আরও একটি অতিরিক্ত সম্পত্তি রয়েছে। আপনি দেখুন, এটি কেবল গুরুত্বপূর্ণ যে সংখ্যাটির গর্তের সংখ্যা তা নয়, যেখানে সংখ্যায় এটি ঘটে সেখানেও এটি।

সংখ্যাটি বিবেচনা করুন 88। আমাদের পুরানো নিয়ম অনুসারে, এর পবিত্রতা থাকবে 4। তবে তা মোটামুটি ফর্সা! 8বাম অন্য বেশী কাজ করছে 810 বার কাজ - এটির কাজের জন্য পুরস্কৃত করা উচিত। বিয়োগ 1, আমরা তার ডান দিকে সমস্ত সংখ্যার মোট পবিত্রতার সমান অতিরিক্ত পবিত্রতা পয়েন্টগুলি দিয়ে এটিকে পুরস্কৃত করব (বিধি 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টাইব্রেকার হিসাবে সংখ্যাসূচক মান ব্যবহার করে বর্ধিত পবিত্রতার দ্বারা সাজানো প্রথম পবিত্র নম্বরগুলি আউটপুট করুন । আপনি ধরে নিতে পারেন যে ইনপুট এবং আউটপুট আপনার ভাষার সর্বাধিক উপস্থাপনযোগ্য পূর্ণসংখ্যার চেয়ে বড় হবে না বা 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

@ ফ্রাইআমএইজিগম্যান এর চেয়ে বড় বা এর চেয়ে কম বা এর চেয়ে বড় আর কোনও নয়। আমি বিভিন্ন পূর্ণসংখ্যার আকারের জন্য কিছু সর্বাধিক সহ পোস্টটি আপডেট করব।
মেগো

তোমার পাইথন কোড 6 জন্য কাজ করে না, এটি 0. একটি holines উত্পাদন করে
shrx

উত্তর:


2

পাইথন 2, 138 122 বাইট

এটি ইনপুট এন এর জন্য 5 এন অবধি পবিত্র সংখ্যার সন্ধান করে , যা হাস্যকরভাবে ধীর:

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 এন 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 এন ≥ 5 এন 2 হিসাবে বৈধ ।


ওহ, অপেক্ষা করুন, আমি কিছু মিস করেছি .. এর জন্য খুব ক্লান্ত হয়ে পড়েছি।
seequ

3

লুয়া, 317 বাইট

এটি করতে আমার কিছুটা সমস্যা হয়েছিল, লুয়ায় কিছু জিনিস যেমন মনে হয় ঠিক তেমন কাজ করে না। আমি যদি এটিকে গলফ করতে চাই তবে তাদের সাথে খেলতে হবে। আপনার পছন্দের উপাদানগুলির সংখ্যা দ্বারা প্রতিস্থাপন করে আপনি লুয়া অনলাইন পরীক্ষা 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অনুবাদ করা যেতে পারে:

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

জাভাস্ক্রিপ্ট (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.