単一損失の整数:単一の要素が欠落した連結シーケンス


18

シーケンスを結合する方法を定義して、シーケンス内のすべての数値が文字列として連結され、その結果が整数になることを意味します。

[1, 2, 3] -> 123

少なくとも3つの連続する整数の有限シーケンスごとに、シーケンス内の要素を1つだけ欠落し、この欠落した要素がシーケンスの最初または最後の要素ではない可能性がある場合、シーケンスを結合した結果の整数を出力します。これを「単一損失のある整数」と呼んでいます。

[1, 2, 3] -> {1, 3} (missing an element) -> 13

この単一損失整数のシーケンスは、次のサブシーケンス(パーティション?)の結合です。

最初のサブシーケンス{n, n+2}A032607です。

{n, n+2}            -> 13, 24, 35, 46, 57, 68, 79, 810, 911, 1012, ...
{n, n+1, n+3}       -> 124, 235, 346, ...
{n, n+2, n+3}       -> 134, 245, 356, ...
{n, n+1, n+2, n+4}  -> 1235, 2346, 3457, ...
{n, n+1, n+3, n+4}  -> 1245, 2356, 3467, ...
{n, n+2, n+3, n+4}  -> 1345, 2456, 3567, ...
... 
for n ∈ ℕ (integers >= 1)

これらの整数は昇順で印刷する必要があります。最初の25個の単一損失整数は以下のとおりです。

13, 24, 35, 46, 57, 68, 79, 124, 134, 235, 245, 346, 356, 457, 467, 568, 578, 679, 689, 810, 911, 1012, 1113, 1214, 1235, ...

最初の7597単一損失性整数

ゴルフされていないリファレンス実装。小さくするのではなく、速くした。

ルール:

  • 最短のコードが勝つ
  • 次のいずれか(いずれかを言う)を使用できます。
    • 単一の不可逆整数を永久に出力します
    • 正の整数nを指定すると、リストとして最初のn個の要素を出力するか、コンマまたは空白で区切られた文字列を出力または返します。
  • 言語で許可されている場合、特に永久に印刷する場合は、任意の大きな整数をサポートする必要があります。

インスピレーション/関連

注:このシーケンスのOEISにはまだエントリがありません。

別のメモ:「二重損失のある整数」、「N-ly損失のある整数」、「(N + 1)-ly損失のある整数」、および「損失のある整数"(これらすべての結合)。


最初の〜7600要素のリストと、Pythonで完了したばかりの参照実装を追加しました。
mbomb007

2
これは楽しいfastest-codeチャレンジです。
マイケルクライン

それだろう。チャレンジを再投稿することはできますか?もしそうなら、私はとにかく最初に一週間以上待つでしょう。
mbomb007

私の知る限り、それは問題ないはずです。ただし、念のため/ヒントを得るために、チャットにアクセスしてmodを要求することもできます。
マイケルクライン

回答:


3

Mathematica、101バイト

Sort@Flatten@Table[FromDigits[""<>ToString/@(z~Range~x~Delete~y)],{x,3,#},{z,1,x-1},{y,2,x-z}][[1;;#]]&

わーい!かつて私は最短の答えを持っています!Party[Hard]


1
それは実際のMathematicaビルトインですか?驚かないでしょう。:D
mbomb007

4
いいえ、しかしそれはで修正できますParty[_]:=While[True,Print["PARTY!!!"]]。すべてのパーティーがパーティーであるため、引数は無視されます。
CalculatorFeline

1
@CatsAreFluffy私は同意しません。Party[Where]印刷する必要がありHere!、およびParty[When]印刷する必要がありますNow!、などパーティーを軽く考えてはいけません。
Sanchises

Party[x_]:=Switch[x,Where,"Here!",When,"Now!",How,Pause[1];"...Really?",_,While [True,Print["PARTY!!!"]]]
CalculatorFeline

3

ハスケル、131114、106のバイト

iterate(\n->minimum[x|x<-[read(show=<<filter(/=k)[i..j])::Int|i<-[1..n],j<-[i+2..n],k<-[i+1..j-1]],x>n])13

これは、の大きさによって制限されるIntが、それは容易に交換することによって拡張することができるIntInteger

少ないゴルフ:

concatInt x = read (concatMap show x) ::Int
allUpToN n = [concatInt $ filter (/=k) [i..j] | i <- [1..n], j <- [i+2..n], k <- [i+1..j-1]]
f n = minimum[x | x <- allUpToN, x > n ]
iterate f 13

@nimiがゴルフした8バイト。


これは無限nですか、それともかかりますか?
mbomb007

@ mbomb007ではInteger、メモリが不足する(または忍耐する)まで続きます。で続行しますが、Intオーバーフローすると間違った答えを出し始めます(> 2^29-1)。
マイケルクライン

これを実行できるインタープリターにリンクできますか?TryHaskell.orgに貼り付けましたが、うまくいきませんでした。
mbomb007

@ mbomb007私がこれまでに見つけた最高です、このことが必要ものの、main=print$GHCiのがないこと。GHC.ioのメモリが不足し、TryHaskell.orgの機能セットが制限されすぎています。
マイケルクライン

うわー、タイムアウトするまでにそれほど遠くはありません。:D
mbomb007

2

Pythonの3、136の 127 126 122バイト

ブルートフォースソリューション、私はn = 7000を試してさえいません(n = 100の場合はすでに10秒かかります)

r=range
f=lambda n:sorted(int(''.join(str(i+k)for i in r(1,j)if l-i))for k in r(n)for j in r(4,n)for l in r(2,j-1))[:n]

説明

# f=lambda n:sorted( int(''.join(str(i+k) for i in r(1,j)   if l-i)) for k in r(n) for j in r(4,n) for l in r(2,j-1))[:n]
#            ──┬──                        ───────┬───────    ───┬──  ──────┬──────  ──────┬──────  ────────┬──────── ─┬─
#              │                                 │              │          │              │                │          └── selection of the n first numbers
#              │                                 │              │          │              │                └── loop to remove missing element
#              │                                 │              │          │              └── loop for the dimension of the list n to be sure we miss nothing xD
#              │                                 │              │          └── loop on the n in op description 
#              │                                 │              └── Test to remove missing element
#              │                                 └── loop on {n, n+1 ...} in the op description
#              └──── sort the list

結果

>>> f(25)
[13, 24, 35, 46, 57, 68, 79, 124, 134, 235, 245, 346, 356, 457, 467, 568, 578, 679, 689, 810, 911, 1012, 1113, 1214, 1235]

>>> f(100)
[13, 24, 35, 46, 57, 68, 79, 124, 134, 235, 245, 346, 356, 457, 467, 568, 578, 679, 689, 810, 911, 1012, 1113, 1214, 1235, 1245, 1315, 1345, 1416, 1517, 1618, 1719, 1820, 1921, 2022, 2123, 2224, 2325, 2346, 2356, 2426, 2456, 2527, 2628, 2729, 2830, 2931, 3032, 3133, 3234, 3335, 3436, 3457, 3467, 3537, 3567, 3638, 3739, 3840, 3941, 4042, 4143, 4244, 4345, 4446, 4547, 4568, 4578, 4648, 4678, 4749, 4850, 4951, 5052, 5153, 5254, 5355, 5456, 5557, 5658, 5679, 5689, 5759, 5789, 5860, 5961, 6062, 6163, 6264, 6365, 6466, 6567, 6668, 6769, 6870, 6971, 7072, 7173, 7274, 7375]

@ mbomb007と@FricativeMelonの支援に感謝


a )と次の文字の間にスペースは必要ありません。t=rangeプログラムの先頭に追加して、すべてのrange関数呼び出しをt呼び出しに置き換えることができます。これにより、バイト数が大幅に削減されます。
摩擦摩擦メロン

@FricativeMelon右、無駄なスペースを削除します
Erwan

i!=l+kl+k-i、バイトを節約するに置き換えることもできます。
摩擦摩擦メロン

@FricativeMelon私は小さな説明を追加しました:)
Erwan

str(i)for i in r(1+k,j+k)if l+k-iに置き換えることができstr(i+k)for i in r(1,j)if l-i、4バイトを節約します。
mbomb007

1

Pythonの3、319270、251のバイト

t,h,n,k,q*=range,input(),1,2,
while h>len(q)or n*k<=len(str(q[h])):
 q+=[int("".join([str(c+s)for c in t(k+1)if c-y]))for s in t(10**~-n,10**n)for y in t(1,k)]
 if~-n:n*=k;k+=1
 else:n,k=k+1,2
 while n//k*k-n:k+=1
 n//=k;q.sort()
print(q[:h])

かかるhSTDINから入力されると第一のアレイ印刷h単独で、非可逆整数。それも非常に高速で、数秒しかかかりませんh=7000

説明:無限の時間がある場合は、単純にすべてn,kを反復処理し、各ペアでn+1,n+2,...,n+k-1k-1可能性)のそれぞれを削除し、それらからすべての(無限に多くの)値を取得してから、シーケンスを昇順で並べ替えて、h要素。もちろん、実際にそれを行うことはhできませんが、将来のn,kペアの値を追加することで最初のソートされた要素が変更できなくなるポイントに到達できる場合、有限の時間内に切り捨てて実行できます。任意のn,kペアについて、少なくともfloor(log10(n)+1)*k桁、おそらくそれ以上があります。だから、グループはこれらのペアは、値によってすることができますc(n,k)=floor(log10(n)+1)*k我々があればことを保証し、c(a,b)<c(n,k)我々が処理a,bする前にn,k。リストをソートし、その最後の要素がd桁数、そしてd<c(n,k)次にn,k処理するために、停止することができます。これは、その桁数以下の数字を取得できなくなったためです。最終的に計算が行われるため、最初のh要素は変更できないため、それらを返すだけです。

そのため、で指定された順序を保証する関数が必要になりますc(n,k)。それぞれのy取得可能についてc(n,k)(n,k)そのようなすべてを処理する必要がありますy=c(n,k)L=floor(log10(n)+1)いくつか言いましょうn。したがって、y=L*k保持する必要があります。で開始しk=2,L=y/2、次にk=3,L=y/3;k=4,L=y/4...k=y,L=1、の非整数値をスキップしますLc(n,k)関数全体を生成するには、で始まり、(1,2)を1 y=2増やして、yを取得するたびに再度開始しますL==1。ペアの列挙があり(L,k)、条件を満たします。ただし、すべての整数を列挙することにより、nから可能なすべてを取得する必要がありますLL数字で。次に、これらの(n,k)ペアのそれぞれについて、それぞれのk-1ドロップされた要素の可能性があるため、結果として得られる不可逆数を生成し、空のリストに追加する必要があります。次に、リストを並べ替えて、次の(L,k)ペアで繰り返し、前述のd<c(n,k)とおりに停止します。

コードの内訳(少し時代遅れ):

t=range                     #shortens code
def f(r,n,k):               #helper function
 for s in t(10**~-n,10**n): #for the (L,k) pair, add value of (s,k,y)
  for y in t(1,k):r+=[(int("".join(map(str,[c+s for c in t(k+1)if c!=y]))))]
 if n>1:                    #case where L!=1
  n*=k;k+=1                 #multiply n (which is n'/k from prev iter), inc k
 else:n,k=k+1,2             #reset n and k
 while n//k*k-n:k+=1        #find next proper divisor of n
 return(r,n//k,k)           #divide by that divisor and return
def g(h):                   #main function
 q,a,b=[],1,2               #initial values
 while h>=len(q)or a*b<=len(str(q[h])):(q,a,b)=f(q,a,b);q.sort()
 return q[:h]               #continues until at least h numbers and surpassed current max

任意の整数をサポートするlen(`q[h]`)必要があると思いlen(str(q[h]))ますか?または、パラメータを取得しているため、永久に印刷するのではなく、特定の限界までしか機能しない場合にだけ言ってください。
mbomb007

私は、非負整数の場合、 `x` == repr(x)== str(x)であると考えましたが、これが真ではないという参照は見つかりません。なぜこれは真実ではないと思いますか?
摩擦摩擦メロン

私は頻繁にPythonでゴルフをするので、これは真実ではないことを知っています。。を使用している場合、整数の最大値(2**63-1)より大きい値Lは末尾にありreprます。このエントリはおそらく非常に順番に沿ってはるかに。
mbomb007
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.