ホリエ番号


22

The Holy Numbersから学んだように、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 > 0n数値をタイブレーカーとして使用して、昇順の拡張ホラリティでソートされた最初のホーリーナンバーを出力します。入力および出力は、言語で表現可能な最大の整数またはの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のholinesを生成
shrx

回答:


2

Python 2、138 122バイト

これは、入力Nに対して最大5 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であり、1バイトのコストで実際にテストケースを実行できます。

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

非ゴルフと説明

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

の新しい値に使用されるネストされた3項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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.