カウントダウンとリサイクル


14

秒読み

このコードとゴルフのチャレンジの目標は、カウントダウンしながら、数字をリサイクルすることです。説明させてください。

まず、アプリケーションはプログラム引数として、またはstdinを使用して、数値を読み取ります。次のあなたは、単にこのようにカウントダウンする必要があります 10 9 8 7 6(で降順順序)

しかし、待って、もっとあります!

リサイクル

すべての番号を印刷できる場合もありますが、すべての番号をリストするのではなく、リサイクルできます。簡単な例を挙げましょう:

Input: 110

Output:   11091081071061051041031021010099... etc
Recycled:  10                        1

これで、110、109、108のすべての数値がリストされましたが、01がリサイクルされました。

もう一つの例:

Input: 9900

Output:   9900989989897989698959894... etc
Recycled:        9 98  

コードゴルフチャレンジ

  • 数値を読み取る(引数または標準入力)
  • すべての可能な数字を(標準出力またはファイルに)リサイクルながら、降順でカウントダウンを出力します
  • 1に達するか、0〜9をリサイクルした瞬間に停止します(最初に起こることは何でも)

簡単な例(1に達するまで):

Input: 15
Output: 15141312110987654321

(Notice the 110 instead of 1110)

より高度な例(すべてリサイクル):

Input: 110
Output:   110910810710610510410310210100998979695949392919089887868584838281807978776757473727170696867665646362616059585756554535251504948474645443424140393837363534332313029282726252423221
Recycled:  10                            9                    8                    7                    6                    5                    4                    3                    2

(We've recycled all 0-9)


2
これは、「すべてを支配する1つのリング」問題とはまったく関係ありません。
ウィル

@RoyvanRijnあなたはあなたの質問で昇順について何も言及しませんでした-私が重複として近い投票をしないなら、私は「あなたが何を求めているのかわからない」になります。番号が昇順でなければならない場合、10(2番目の例では)がシーケンスの先頭にどのようになりますか?
誇りに思ってhaskeller 14

1
@proudhaskellerは質問で降順を指定していませんか?「カウントダウン」は降順を意味すると理解されています。
ウィル

1
ロイ、私は重複として閉めることに投票しなかった。しかし、関連する質問に明示的に言及することは、システムが関連する質問を自動推測することを補います。@ウィル、もちろん関連しています。早期停止条件を削除すると、この質問は、「すべてを支配する1つの文字列」に対して特定の最適でない戦略を実装するように求めています。
ピーターテイラー14

回答:


11

T-SQL - 291 277 267 217 199 191 166 158 153 145 142 128 117

これに新しい方法でアプローチした後、私は145(数回の微調整後の142)になりました。つまり、私は銀や銅を競うことができるかもしれません。^^

DECLARE @ INT=100;WITH N AS(SELECT 1A UNION ALL SELECT A+1FROM N WHERE A<@)SELECT LEFT(A,LEN(A)-1+A%11)FROM N ORDER BY-A

これはリストを印刷せず、結果を選択します。質問は出力に関する詳細を決して与えなかったので、これは問題ないはずです。これには、入力の100という同じ制限があります。これは、一部は100未満の11番目の用語ごとに文字が失われるという事実と、一部は共通テーブル式のデフォルトの100再帰制限のためです。

DECLARE @ INT=100;

WITH N AS
(
    SELECT 1A
    UNION ALL
    SELECT A+1
    FROM N
    WHERE A<@
)

SELECT LEFT(A,LEN(A)-1+A%11)
FROM N
ORDER BY-A

1
ハハT-SQL、いいね!
ロイ・ファン・レイン

7

Python 143 147

def t(n):
 p=o='';r=0 # p is previous string, o is output string, r is recycled bitmap
 while n and r<1023: # 1023 is first 10 bits set, meaning all digits have been recycled
    s=`n`;i=-1 # s is the current string representation of n
       # i is from end; negative offsets count backwards in strings
    while p.endswith(s[:i])-1:i-=1 # find common ending with prev; s[:0] is '',
       # which all strings end with
    for j in s[:i]:r|=1<<int(j) # mark off recycled bits
    o+=s[i:];p=s;n-=1 # concatenate output, prepare for next number
 print o # done

第1レベルのインデントはスペース、第2レベルのインデントはタブ文字です。


2
いくつかの標準的な文字の保存:p=o=''関数にオプションのパラメーターとしてのようなものを置きます。あなたが使用することができる*ためandn and r<1023も、または多分r<1023*nwhile x-1:としてスペースを剃ることができwhile~-xます。また、ビットマスクではなく数字のセットを使用して、使用されている数字を保存する方が短い場合があります。
XNOR

5

ハスケル、154 149 147 145 128 120 119 117バイト

import Data.List
(r%x)n|n>0&&r<":"=[(r\\t)%(x++(show n\\t))$n-1|t<-tails x,isPrefixOf t$show n]!!0|0<1=x
h=['0'..]%""

リサイクルチェックに多くのキャラクターを追加する...ため息

まだリサイクルされていない数字を思い出し、リストが空になったら停止することで、少しゴルフをしました。その後、明示的な再帰といくつかのトリックに移動して、もう少しゴルフをしました。

出力例:

*Main> h 110
"110910810710610510410310210100998979695949392919089887868584838281807978776757473727170696867665646362616059585756554535251504948474645443424140393837363534332313029282726252423221"

5

Python 2:119 117

これは、ウィルの答えのよりゴルフバージョンにすぎないため、これをコミュニティウィキとしてマークします

n=input()
d=s,={''}
exec"t=`n`;i=len(t)\nwhile(s*i)[-i:]!=t[:i]:i-=1\ns+=t[i:];d|=set(t[:i]);n-=len(d)<11;"*n
print s

素晴らしい!どのように動作しd=s,={''}ますか?
ウィル

2
@Willはとd=s,={''}同等d={''}; s,={''}です。s,={''}は、などのステートメントでより一般的に使用される機能であるシーケンスのアンパックを使用しa, b = (b, a)ますが、単一要素のシーケンスから唯一の要素を抽出するためにも使用できます。
flornquake 14

1
@flornquakeああ、私の間違い。まだ実行できると思いますがlen(d)%11*n、execループを使用することはあなたにとっては意味がないように見えます。
xnor 14

1
@Willこの巧妙なトリックが効率的である理由の背景としてset()、単一要素セットよりも空のセットを作成する方が皮肉なことに長くなり{x}ます。そのため、flornquakeはフィラーメンバで初期化し、11個の要素があるかどうかを確認して、10桁すべてがあるかどうかを確認します。空の文字列はに初期化する必要があるsため、このフィラーメンバーとして機能し、これらの初期化を組み合わせて文字を保存します。
xnor 14

1
@ウィルはい、len(d)%11*n良かったでしょう。:)
flornquake 14

4

ルビー、145の 139 130バイト

n=gets.to_i
d=*?0..?9
s=''
n.times{|i|j=(t=(n-i).to_s).size;j-=1 while s[-j,j]!=u=t[0,j];d-=u.chars;s=t;$><<t[j..-1];exit if[]==d}

Willのアプローチと似ていますが、ビットマスクを使用せず、代わりに未使用の数字のセットのような配列を使用します。入力はSTDIN経由です。

while代わりに使用する代替バージョンがありtimesますが、私が試したものは何でも、バイト数は同じです:

n=gets.to_i
d=*?0..?9
s=''
(j=(t=n.to_s).size;j-=1 while s[-j,j]!=u=t[0,j];d-=u.chars;s=t;$><<t[j..-1];exit if[]==d;n-=1)while 0<n

3

CJam、80 77 65 57 54文字

おそらくまったく最適化されていませんが、ここで多くの最適化とデバッグを行っ後、CJamでのES6の回答を直接変換します。

Mr{s:C_,{:H<M_,H->=!_CH@-@}g:T>+:MCT<_O@-+:O,A<Ci(*}h;

こちらからオンラインでお試しください。この関数は、数値をSTDINとして受け取り、リサイクルされたカウントダウンを出力し、リサイクルが完了するとその間に停止します。

さらにゴルフを試みます。

使い方:

基本的な考え方は、カウントダウン番号Cごとに、最初のH桁が結果の文字列の最後のH桁と等しいかどうかをチェックすることです。HはCの桁数から0になります。

Mr                                    "Put an empty string and input on stack";
  { ... }h;                           "Run while top element of stack is true, pop when done";
s:C                                   "Store string value of top stack element in C"
   _,                                 "Put the number of characters in C to stack";
     { ... }g                         "Run while top element of stack is true";
:H<                                   "Store the digit iteration in H and slice C";
   M                                  "M is the final output string in making";
    _,H-                              "Take length of M and reduce H from it";
        >                             "Take that many digits of M from end and..."
         =!_                          "Compare with first H digits of C, negate and copy";
            CH@                       "Put C and H on stack and bring the above result to top of stack";
               -                      "Reduce H if the matched result was false";
                @                     "Bring the matched result on top in order continue or break the loop"
             :T                       "Store top stack element in T after the loop";
               >+:M                   "Take everything but first T digits of C and add it to M and update M";
                   CT<_               "Take first T digits of C and copy them";
                       O@             "Put saved digits on stack, and rotate top three elements";
                         -            "Remove all occurence of first T digits of C from O";
                          +:O         "Add first T digits of C to O and update O";
                             ,A<      "Compare number of saved digits with 10";
                                Ci(   "Decrement integer value of C and put it on stack";
                                   *  "If number of saved digits greater than 9, break loop";

2

JavaScriptのES6、149 146文字

そのような冗長で、多くのキャラクター、すごい。

C=n=>{s=c='';while(n>0&s.length<10){j=1;while(t=(n+'').slice(0,-j++))if(c.endsWith(t)){s+=~s.search(t)?'':t;break}c+=(n--+'').slice(1-j)}return c}

最新のFirefoxのWebコンソールで実行してください。

実行後、次のCように使用できるメソッドが作成されます

C(12)
12110987654321

更新:時々、普通の古いreturnは矢印関数の閉鎖よりも短いです:)


それはどのような数字ではない出力は、リサイクルした後、シーケンスダウンのみカウントをリサイクルしたはずです
誇りhaskeller

ああ!あれ?彼の例はすべてそれも出力していました。
オプティマイザー14

@proudhaskellerああ、私もリサイクル文字を出力しました。おかげで、文字が節約できます。
PenutReaper 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.