リエン数


38

Champernowne定数は、最初のnnを無限大に連結して構築される数です。次のようになります。

0.123456789101112131415161718192021222324252627282930...

次に、Rien番号について説明します。これは、整数としてのシャンペルノーン定数の最小化と考えることができます。Rien番号の最初のn桁をRi(n)と呼びます。これはそれを定式化する方法です:

  1. 最初のn自然数(シーケンス{1,2,3、...})は連結されます。
  2. この結果は、数字の値に従ってソートされます。の1..12ようになり011111223456789ます。
  3. 以来離煙の数がゼロをリードすることはできません、我々はすべて移動し0、言って、その結果、最小限の数を維持しながら、彼らは重要であるようです101111223456789。これはRi(n)、この場合はRi(12)です。

Ri(n)の結果の一部を次に示します。

n     Ri(n)
1 1
2 12
3 123
7 1234567
9 123456789
10 10123456789
15 101111111223344556789
34 10001111111111111222222222222223333333334444555666777888999
42 100001111111111111122222222222222233333333333333444444455556666777788889999
45 100001111111111111122222222222222233333333333333344444444444555556666777788889999
55 10000011111111111111122222222222222223333333333333333444444444444444455555555555566666777778888899999
100 1000000000001111111111111111111111122222222222222222222333333333333333333334444444444444444455555555555555555555666666666666666666667777777777777777777788888888888888888888999999999999999999994449999
9991000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444445555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555556666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777778888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888889999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

目的n入力として1≤<10000の数値(引数、STDIN、または言語が従来の入力をサポートしていない場合はハードコーディングを使用)を与え、Ri(n)を出力/返します。

これはであるため、バイト単位の最短コードが優先されます。このチャレンジに答えるために作成されていない限り、このコンテスト後に作成された言語を使用できます。(もちろん、それ興味深い解決策を提供する場合、それを使用できますが、非競合として答えをマークします。)

リファレンス実装

IEでこれをテストしたので、実際には問題はないはずです。問題ある場合、簡単な解決策があります:健全なブラウザを取得します。

function min(n) {
  var seq = [];
  for(var i = 1; i <= n; i++) seq.push(i);
  seq = seq.join("").split("").map(Number);
  var to;
  if(seq.indexOf(1) >= 0) to = seq.splice(seq.indexOf(1), 1);
  seq.sort(function(a, b) {
    return a - b;
  });
  if(to) seq = to.concat(seq);
  return seq.join("");
}
t.onchange = t.onkeyup = function() {
  h.innerHTML = min(this.value)
}
* {
  font-family: Consolas, monospace;
}
input {
  border: 2px dotted #aaaaaa;
  border-radius: 5px;
  margin: 10px;
}
<input id="t" type="number">
<div id="h">


リーダーボード

この投稿の下部にあるスタックスニペットは、a)言語ごとの最短ソリューションのリストとして、b)全体的なリーダーボードとして、回答からカタログを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

## Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

## Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、スニペットに表示することもできます。

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


22
私はいつもリエン数だと思っ0ていました。
-flawr

何かが欠けているかどうかはわかりませんが、1sの1つをsの前に移動するだけ0ですよね?
FryAmTheEggman

@FryAmTheEggmanあなたは正しいです。
コナーオブライエン

@MartinBüttner\ o /見つけました。
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴ違います それは、個々の数字ではなく、数字全体の順列のみを許可しました。
マーティンエンダー

回答:



13

Perl、44 42 41 33 31バイト

やった、初めての投稿!

primoに2バイトの節約をありがとう。

print 1,sort"@{[2..<>]}"=~/\d/g

他の人が行ったように、1を削除して手動で先頭に追加することで機能します。

オンラインで試す


2
PPCGにようこそ。最初の投稿をおめでとう(おめでとうございます。私が入社する前に参加していたので、おかしくなりましたが...)。2つのこと-私は43バイトをカウントします ... 2番目に、あなたの "Try it online"リンクはあなたのコードの古い/異なるリビジョンを指しているように見えます。コードをIdeoneに手動でコピーアンドペーストしても機能しますが、リンクは機能しません。
AdmBorkBork

コメントありがとうございます!バイトカウントにTextWranglerを使用しましたが、1を超えすぎたのではないかと思います(さらにスペースは必要なかったため、バイトカウント全体が42に減少しました)。Ideoneは今修正されるはずです。
ポールピカール

ああ、それについて知りませんでした。Mac上のPerlでも動作します(5.18)ありがとう!
ポールピカール


2
分割/結合をprint 1,sort"@{[2..<>]}"=~/\d/g
削除

11

Japt、14 12バイト

1+2o°U ¬¬n ¬

オンラインでお試しください!

使い方

1+2o°U ¬¬n ¬  // Implicit: U = input integer
  2o°U        // Generate the range of integers from 2 to U, inclusive.
       ¬¬     // Join, then split into chars.
         n    // Sort.
1+         ¬  // Join again, and add a 1 to the beginning.
              // Implicit: output last expression

4
o_o 5分間の猶予期間にゴルフをしましたか?西の最速の銃
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴその後、新しいコードゴルフを投稿したくないと思います:D
ピエールアラウド

9

網膜、78バイト

いくつかの新しいRetina機能を披露する時間です(まだそれほど競争力はありませんが、今日まではおそらく300バイトに近かったでしょう)。

.+
$0$*1
\B
 $`
(1)+
$#1
^1| 

.
 1$0$*1
+r`(1+\2) (1+)\b
$2 $1
 1(1)*
$#1
^
1

オンラインでお試しください。

説明

今では非常に便利に小数と単項の間の変換が可能ですが、一部の操作は単項よりも小数で実行可能であるため、何度も前後に変換する必要があるため、これはまだかなり長いです。

.+
$0$*1

入力を単項に変換することから始めましょう。これは、入力を照合し、それを何回$*1繰り返す1かを使用することで機能します(この繰り返し機能は今日の時点で新しいものです)。

\B
 $`

次に、から1までの範囲Nを単項で生成します。これがなぜFizzBu​​zzの回答で機能するのかを説明しました。

(1)+
$#1

範囲内の各数値を10進数に戻すので、10進数を操作できます。これは、各単項数を照合して、それぞれが1個別のキャプチャを生成することによって行われます。次に、新しいキャプチャカウント構文を使用して、グループ1のキャプチャ数に置き換えます$#1

^1| 

これにより、1文字列から先頭のスペースとすべてのスペースが削除されるため、数字のみが残ります(単一のを除く1)。

.
 1$0$*1

単項に変換1し、各桁に追加します(偶数0が空でないことを確認するため)。また、各桁の前にスペースを挿入して、数字が分離されるようにします。

+r`(1+\2) (1+)\b
$2 $1

大きな数字が前に付いた小さな数字を繰り返し照合し、それらを入れ替えます。それがRetinaのバブルソートです。:)

 1(1)*
$#1

Aaaと10進数に戻ります。

^
1

最後に、1前に削除したものを考慮して、先頭にシングルを挿入します。


1
あなたがたは何の新機能について語っていますか?
コナーオブライエン

1
@CᴏɴᴏʀO'Bʀɪᴇɴ後で説明を追加します。これは、キャプチャをカウントするために新しい置換構文を使用し、合理的に短い10進数/単項変換に使用できる文字を繰り返します。完全な変更ログは次のとおり
Martin Ender

@MartinBüttnerいいね。これは、Retinaがこの免除を要求できなくなったことを意味しますか?
デジタル外傷

@DigitalTraumaまだ最も自然な入力形式だと思います。また、この種の言語主義がこのサイトでこれほど多くの支持を得たことを私は理解していませんでした。
マーティンエンダー

6

Haskell、44バイト

import Data.List
f n='1':sort(show=<<[2..n])

残念なことに、それsortData.List17バイトです!


6

JavaScript(ES6)、65 62 54 52バイト

edc65のおかげで3バイト節約

x=>eval("for(b='';x>1;)1+[...b+=x--].sort().join``")

2〜のすべての数値の文字列を作成しx、分割、並べ替え、結合し、先頭に1を追加します。これはまだゴルフ可能です。提案を歓迎します!


ES6は手元にありませんが、(new)だけを使用することはできませんArray(x-1).map((_,y)=>y+2)か?
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴマップは空の配列要素をスキップするため、使用する必要がありますArray(n).fill().map(...(ES6のヒントを参照)
edc65

私の投稿には遅すぎますが、あなたへのヒント:n=>1+[...[...Array(n-1)].map(_=>++n,n=1).join``].sort().join`` (1バイト短く、分割です)
-edc65

@ edc65とCᴏɴᴏʀO'Bʀɪᴇɴヒントをありがとう!使用して、なぜ私が疑問に思った.split()ので、奇妙に感じた...
ETHproductions

@ edc65フー、私のソリューションはあなたと同じ長さです。– n=>1+[...[...Array(n+1).keys()].slice(2).join``].sort().join``
ニール



4

APL(17)

'1',∆[⍋∆←1↓∊⍕¨⍳⎕]

説明:

'1',∆[⍋∆←1↓∊⍕¨⍳⎕]
-----------------
               ⎕   read a number from the keyboard
               ⍳    get the natural numbers up to and including that number
             ⍕¨    get the string representation for each number
           ∊       flatten the array (giving a string of digits)
         1↓        remove the first digit (which is always 1)
       ∆←          store the result in ∆
      ⍋            get a permutation to sort ∆ upwards
    ∆[           ] rearrange ∆ so that it is sorted
'1',               add a 1 to the front

テスト:

      '1',∆[⍋∆←1↓∊⍕¨⍳⎕]
⎕:
      1
1
      '1',∆[⍋∆←1↓∊⍕¨⍳⎕]
⎕:
      10
10123456789
      '1',∆[⍋∆←1↓∊⍕¨⍳⎕]
⎕:
      55
10000011111111111111122222222222222223333333333333333444444444444444455555555555566666777778888899999

いいね!私よりもずっといい。:DIは、配列がフラット化され、文字列が提供されることを認識していませんでした。知っておくといいです。
アレックスA.

3

Python 2、60バイト

_="".join;print"1"+_(sorted(_(map(str,range(2,input()+1)))))


3

ルビー、48バイト

匿名関数。基本的に、ここで他の回答の一部をRubyfiedしました。

->n{n>1?(?1+[*2..n].join.chars.sort*'').to_i: n}

3

Brachylog76 41バイト

1 .;{,1:.e?}?:1fcbZlL,ZoOlM,10^(L-M)=:Oc.

入力として数値を受け取ります。

このソリューションは、組み込みのFindall述語に加えたいくつかの変更で機能しfます。OPは回答よりも古い言語を使用しても問題ないようですので、これでいいと思います(私が行った変更はずっと前に意図されたもので、この挑戦​​のためにやる気になりました)。

説明

1 .                                            § If the input is 1, unify output with 1

   ;                                           § Else

    {      }?:1f                               § Output a list of all inputs which satisfy
                                               § the predicate in brackets with the input
                                               § of the main predicate (ie the input number)
                                               § as output

     ,1:.e?                                    § True if the input is an integer between 1
                                               § and . (the output)

                cbZ                            § Concatenate everything into a single number,
                                               § remove the first digit (1) and call it Z

                   lL,ZoOlM,                   § L is the length of Z, M is the length of O
                                               § O being Z sorted (which removes the leading
                                               § 0s)

                            10^(L-M)=:Oc.      § Concatenate 10^(L-M) at the beginning of O
                                               § and unify it with the output

3

Smalltalk、76バイト

Smalltalkではいつものように、概念的には非常に簡潔ですが、テキスト的には非常に冗長です...

f:l^'1',((2to:l)fold:[:p :q|p asString,q asString])asByteArray sort asString

これをクラスメソッドとして追加し、次のStringように呼び出します。たとえば、20String f: 20



3

Bash、35 34バイト

printf %d 1`seq 2 $1|fold -1|sort`

これは@DigitalTrauma@OlivierDulacの回答に基づいていますIdeoneでオンラインでお試しください。

使い方

  • seq 2 $12からコマンドラインで指定された整数までのすべての整数を出力します。

  • fold -1 すべての行を幅1で折り返します。つまり、各文字を独自の行に配置します。

    -1 文書化されていない機能のようです。

  • sort 文字を数値でソートします。

  • printf %d 1`...`​最初の行の先頭に1を追加し、各行を整数(%d)として、区切りなしで出力します。

    これは、すべての引数が消費されるまでフォーマット文字列を繰り返し繰り返す、Bashの奇妙なprintf実装を利用しています。


+1、私はそれが私たちのものよりも好きです:)
オリビエデュラック

3

JavaScriptのES6、49の、46バイト

2バイトのedc65に感謝

F=
x=>1+[...(g=_=>x>1?x--+g``:_)``].sort().join``

;console.log(F(15))


1
似たようなものになりましたが、1バイト短くなりました。引数なしで再帰関数を使用してみてください。元のパラメーターxを減らすだけです
edc65

2

ジュリア、33バイト

n->"1"*join(sort([join(2:n)...]))

これは、整数を受け入れて文字列を返すラムダ関数です。呼び出すには、変数に割り当てます。

<2の2:n場合は空になるrangeを構築し、nそれを文字列に結合し、文字列を文字の配列にスプラットし、それらをソートし、文字列に結合し、1を付加します。


2

APL、21バイト

{' '~⍨⍕1,x[⍋x←⍕1↓⍳⍵]}

これは、右側の整数を受け入れて文字列を返す名前のないモナド関数です。呼び出すには、変数に割り当てます。

説明:

            x←⍕1↓⍳⍵]}   ⍝ Get the numbers 1:input, drop 1, convert to string
         x[⍋            ⍝ Sort
      ⍕1,               ⍝ Tack 1 onto the front, flatten to string
{' '~⍨                  ⍝ Remove the spaces (side effect of ⍕ on an array)

オンラインで試す


2

Python 2、60バイト

P=input();print"1"+"".join(sorted(`range(2,P+1)`)[P*2-4:-2])

勝利のためのインデックス作成。:-)


Python 2、60バイト

P=input();print"1"+"".join(sorted(`range(-P,-1)`))[P*3-5:-2]

ただの代替。


2

天の川1.6.4、22バイト(競合しない)

^^'LH=^^JB", "-Q"1";+!

このチャレンジのためにソートオペコードを追加する必要がありました。


説明

^^                      ` pop the TOS
  '                     ` read input from the command line
   LH                   ` push a reversed Pythonic range(TOS+1)
     =^^J               ` remove the top 2 items from the TOS
         B              ` push the string literal of the TOS
          ", "-         ` remove ", " from the TOS
               Q        ` sort the TOS
                "1";+   ` add "1" to the beginning of the TOS
                     !  ` output the TOS


2

BashおよびGNUツール、58 52バイト

echo 1$(seq 2 $1|sed -e 's/./&\n/g'|sort|tr -d \\n)

@ Digital-traumaと同様のアプローチですが、1を追加する方法が異なり、数字は1桁の長さなので-nは不要です。(最初の試行を行った後、彼の答えを見ました)
オリビエデュラック

2

PowerShell、61 59バイト

param($a)(("1"+-join([char[]]-join(2..$a)|sort)),1)[$a-eq1]

入力を受け取りparam($a)、それを使用して、を使用して配列にインデックスを付け[$a-eq1]ます。trueの場合、2番目の要素とoutputにインデックスを付けます1。それ以外の場合は、1)"1"一緒にjoin編集された新しい範囲2..$aを定義joinし、2)それを文字配列としてキャストし、3)Sort-Objectコマンドレットを介して送信し、すべてが出力されることによって作成されたed配列と連結します。

Edit1-内部-join演算子を移動して2バイトを保存しました。


2

ゴッホ9 7バイト

GJT1-1P

これは次を使用して実行できます。

$ ./gogh noi 'GJT1-1P' <input>

G     “ Push a range (1, TOS]       ”
J     “ Join the TOS                ”
T     “ Sort the TOS                ”
1-    “ Remove the first 1          ”
P     “ Prepend the TOS to the STOS ”

「このチャレンジに答えるために作られていない限り、このコンテスト後に作られた言語を使用できます。」このような言語は私の挑戦において競争力
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴ:ああ、素晴らしい!そのアウトを指してくれてありがとう:)
ザック・ゲイツ

2

ゼリー、8 バイト

RDFṢ1œ|Ḍ

オンラインでお試しください!

使い方

RDFṢ1œ|Ḍ  Main link. Argument: n (integer)

R         Range; yield r := [1, ..., n].
 D        Convert each k in r into the array of its digits in base 10.
  F       Flatten the resulting array of lists.
   Ṣ      Sort the resulting flat list of digits.
    1œ|   Perform multiset union with 1 as left argument.
          This moves a single 1 to the beginning of the list.
       Ḍ  Convert the resulting list of base 10 to integer.

2

OracleのSQL 11.2、222の 211バイト

SELECT 1||TRIM(xmlagg(xmlelement(e,c)).EXTRACT('//text()'))FROM(SELECT SUBSTR(s,LEVEL+2,1)c FROM(SELECT MAX(sys_connect_by_path(LEVEL,' '))s FROM DUAL CONNECT BY LEVEL<=:1)CONNECT BY LEVEL<=LENGTH(s)ORDER BY 1);

ゴルフをしていない

SELECT 1||TRIM(xmlagg(xmlelement(e,c)).EXTRACT('//text()'))  -- add leading 1, concatenate each char and remove spaces
FROM   (
         SELECT SUBSTR(s,LEVEL+2,1)c                          -- split the string in characters, omiting the first number (1)   
         FROM   (
                  SELECT MAX(sys_connect_by_path(LEVEL,' '))s -- create a string by concatenating numbers
                  FROM   DUAL 
                  CONNECT BY LEVEL<=:1
                )
         CONNECT BY LEVEL<=LENGTH(s)ORDER BY 1
       )

2

MATL、17バイト

言語/コンパイラの現在のバージョン(7.0.0)を使用します。

49[]i:"@YUh]6L)Sh

FryTheEgggmanの答えに触発されました

編集(2016年7月29日):言語の変更に適合させるために、いくつかの変更を加えてオンライン試すことができます。

>> matl
 > 49[]i:"@YUh]6L)Sh
 >
> 12
101111223456789

説明

49        % push '1'
[]        % push empty array
i:        % input "N" and build vector [1, 2, ... N]
"         % for each number in this vector
   @      % push that number
   YU     % convert to string
   h      % concatenate horizontally
]         % end
6L)       % remove first element
S         % sort
h         % concatenate horizontally

1

05AB1E、6バイト

注:この提出では、この課題を後回しにする機能を使用しているため、競争力はありません。

コード:

Lß?J{?

説明:

L      # Creates the list [1 .. input]
 ß     # Extract the smallest value of the list
  ?    # Print this value (always 1)
   J   # ''.join(list)
    {  # Sort the string
     ? # Print this value

ISO 8859-1エンコードを使用


これはどのように作動しますか?
リルトシアスト

@ThomasKwa説明が追加されました
アドナン

おっ これは素晴らしいです!
コナーオブライエン

1

Mathcad、86「バイト」

関数s(n)は、forループを使用して、各数値を文字列形式に変換し、それらを連結することにより、Champernowne「整数」を構築します。次に、文字列はASCIIコードの同等のベクトルに変換され、並べ替えられます。関数は、先頭のゼロを最初のゼロと交換し、最後にベクトルを文字列に変換します。

関数をチェックするために、テストケースをベクトルvnに入れ、vectorize演算子を使用してsをvnに適用しました。次に、指定されたテストケース値に対して結果を確認します。

ここに画像の説明を入力してください


Mathcadは、それぞれがテキスト、数式、プログラム、プロット、またはスクリプトコンポーネントである「領域」で構成される2Dワークシートに基づく数学アプリケーションです。

数学またはプログラミングの指示は、パレットのツールバーから選択するか、キーボードショートカットを使用して入力します。ゴルフの目的では、操作(「バイト」)は、名前または式を作成するために必要なキーボード操作の数と見なされます(たとえば、変数aを3に設定するには、a:= 3と記述します。定義演算子:=は単一のキープレス「:」で、aおよび3は合計3「バイト」を与えます。オペレーターのプログラミングにはctl-shft-#(またはプログラミングツールバーのシングルクリック)を入力する必要があるため、再び1バイト。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.