文字列に収まるすべての数字


12

正の整数Nを取り込むプログラムまたは関数を作成します。数字()、小数点()、および負符号()を使用して、正確にN文字で記述できるすべての個別の10進数のリストを出力します。0123456789.-

例えば、N = 4の出力リストであろういくつかの数であり13373.14.999-789-2.7、および-.09

数字は通常の方法で書かれますが、できるだけ短い形式で書かれます。これの意味は:

  • 小数点は、数値が整数でない場合にのみ含める必要があります。

    • たとえば45.045.プレーンとして記述される必要があります45
    • -45.00 として書かれるべきです -45
  • 小数点の左側に先行ゼロがないはずです。

    • 03003として記述される必要330あり300ますが、そのままで問題ありません
    • 0.3そして00.3ただのように書かれるべきです.3
    • -03 として書かれるべきです -3
    • -0.3 として書かれるべきです -.3
  • 小数点の右側に後続ゼロがないはずです

    • .50そして、.500のように記述する必要があります.5
    • 900.090 として書かれるべきです 900.09
  • 最後の2つの規則の例外はそれ自体がゼロであり、これは常にplainと記述0する必要があります

  • 正符号(+)は、番号を不必要に長くするため使用しないでください。

また、マイナス記号(-)を減算記号として使用しないでください。ゼロ未満の数字の最初の文字としてのみ表示されます。

書式設定

数値の出力リストの順序は重要ではありません。上昇、下降、または完全に混ざり合っている可能性があります。それだけでその重要すべてをN文字で記述できる個別の数字。

リストは、物事が一貫している限り、スペース、改行、コンマ、またはおそらく数字の間の何かを使用して、合理的な方法でフォーマットできます。先頭と末尾の括弧(または同様のもの)は問題ありませんが、数値を引用符で囲むことはできません。(つまり、出力で文字列とint / floatを目に見えて混同しないでください。)

たとえば、N = 1の場合、有効な出力は次のようになります。

0 1 2 3 4 5 6 7 8 9
[1, 2, 3, 4, 5, 6, 7, 9, 0]
ans = { 5 8 9 1 3 2 0 3 4 7 6 }

ただし、これは無効です。

[0, 1, 2, 3, 4, "5", "6", "7", "8", "9"]

N = 1 -> 0 1 2 3 4 5 6 7 8 9

N = 2 -> -9 -8 -7 -6 -5 -4 -3 -2 -1 .1 .2 .3 .4 .5 .6 .7 .8 .9 10 11 12 ... 97 98 99

N = 3 -> -99 -98 ... -11 -10 -.9 -.8 ... -.2 -.1 .01 .02 ... .98 .99 1.1 1.2 ... 1.9 2.1 2.2 ... 2.9 3.1 ...... 9.9 100 101 ... 998 999

リストは昇順で、読みやすいように一部の場所で省略されています。

得点

バイト単位の最短コードが優先されます。同点の場合、上位の回答が勝者となります


-0有効な出力である必要がありますか?
ドアノブ

@DoorknobAlso note that the negative sign (-) should not be used as a subtraction sign. It should only appear as the first character of numbers less than zero.
Mego

@Megoはい。負のゼロはゼロと区別されますか?
ドアノブ

@Doorknobゼロはゼロ未満ですか?
メゴ

@Doorknobいいえ。Megoが言ったことと、「[ゼロ]は常にプレーンとして記述する必要があります0」。
カルビンの趣味

回答:


2

Pyth、47 45バイト

FryAmTheEggmanには、順序は重要ではないことに注意してくれてありがとう。

jf!sm:Td)c".- \..*\. ^-?0. [.-]0*$"d^{`c_T17Q

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

ランタイムは恐ろしく、基本的にO(12 n)ですがn、コンピューターで= 6 をテストしました(2分かかりました)。実行n≥5 の意志オンラインタイムアウト。

キャラクターの生成方法のため 0123456789.-の、出力は本当に奇妙な順序になります。

技術的に{端近くを削除することもできますが、O(19 n)の複雑さになります。(大量の複製も作成されますが、許可されています。)

説明

                  _T       -10
                 c  17     -10 / 17 = -0.5882352941176471
                `          representation: "-0.5882352941176471"
               {           uniquify: "-0.582394176"
              ^       Q    input'th Cartesian power
 f                         filter on:
         c"…"d               split this string by spaces
    m:Td)                    check if the parts match the current string
  !s                         true if none of the parts matched
j                            join by newlines

コードの主要部分はで".- \..*\. ^-?0. [.-]0*$"、これには出力が一致してはならない正規表現が含まれています。

.-         minus must be first character
\..*\.     there may only be one decimal point
^-?0.      no extra leading zeroes
[.-]0*$    number must not end with decimal/minus and 0+ zeroes

3

Pyth、57バイト

j-f:T"^0$|^-?([1-9]\d*)?(\.\d*[1-9])?$"0{.P*Q+jkUT".-"Q\-

オンライン通訳で試してみてください

あまりにも長く、恐ろしい実行時間(N = 4の場合は数秒かかりますが、N = 5での実行は推奨されません)。

            .P           Q    all permutations of length (input) of
                 jkUT         ... the string "0123456789"
                +    ".-"     ... plus the chars "." and "-"
              *Q              ... whole thing times the input -- pyth has
                              no repeated_permutation, so this is necessary
           {                  uniquify
  f                           filter by
   :T"..."0                   does it match the really long regex?
 -                        \-  get rid of "-"
j                             join on newline

正規表現の説明:

^0$|            "0", or...
^
 -?             optional negative sign
 ([1-9]\d*)?    optional part-before-decimal
 (\.\d*[1-9])?  optional part-after-decimal
$

1
ゴルフではありませんが、数字を変更するだけ*Qで、順列を作ることができると思います+。これにより、パフォーマンスがかなり向上するはずです。正規表現でいくつかのバイトを節約するのに役立つかもしれませんか?
FryAmTheEggman

2

ジュリア、126 117バイト

n->filter(i->ismatch(r"^0$|^-?([1-9]\d*)?(\.\d*[1-9])?$",i)&&i!="-",∪(map(join,combinations((".-"join(0:9))^n,n))))

これは、整数を受け入れて文字列の配列を返すラムダ関数です。呼び出すには、変数に割り当てます。ここでのアプローチは、DoorknobのPyth answerと同じです。

ゴルフをしていない:

function g(n::Int)
    # Get all n-character combinations of .-0123456789
    c = combinations((".-"join(0:9))^n, n)

    # Join each group of n characters into a string and take unique
    u = ∪(map(join, c))

    # Filter to only appropriately formatted strings
    filter(i -> ismatch(r"^0$|^-?([1-9]\d*)?(\.\d*[1-9])?$", i) && i != "-", u)
end

1

MATL、60バイト

45:57iZ^!"@!'^(-?(([1-9]\d*)|([1-9]\d*)?(\.\d*[1-9]))|0)$'XX

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

これは、スーパーブルートフォース(デカルトの力による)を使用し、その後にフィルタリング(正規表現による)を使用します。後で説明を追加します。

結果はプログラムの最後に表示されます。これは時間がかかる場合があります。生成された結果を表示する場合は、最後追加Dします

45:57iZ^!"@!'^(-?(([1-9]\d*)|([1-9]\d*)?(\.\d*[1-9]))|0)$'XXD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.