Bir dizeye uyan tüm sayılar


12

Pozitif tamsayı N alan bir program veya işlev yazın. Basamak ( ), ondalık noktalar ( ) ve negatif işaretler ( ) kullanılarak tam olarak N karakterle yazılabilen tüm farklı ondalık sayıların bir listesini çıkarın .0123456789.-

Örneğin, N = 4 çıkış listesinde olacaktır bazı rakamlar 1337, 3.14, .999, -789, -2.7, ve -.09.

Sayılar normal şekilde, ancak mümkün olduğunca kısa bir biçimde yazılmalıdır . Bu şu anlama gelir:

  • Ondalık nokta yalnızca sayı bir tamsayı değilse dahil edilmelidir.

    • mesela 45.0ve 45.sade olarak yazılmalıdır45
    • -45.00 şu şekilde yazılmalıdır: -45
  • Ondalık virgülünün solunda baştaki sıfırlar olmamalıdır.

    • 03ve 003olarak yazılmalıdır 3, ancak 30ve 300oldukları gibi gayet
    • 0.3ve 00.3tam olarak yazılmalıdır.3
    • -03 şu şekilde yazılmalıdır: -3
    • -0.3 şu şekilde yazılmalıdır: -.3
  • Ondalık virgülünün sağında sondaki sıfırlar olmamalıdır

    • .50ve .500şu şekilde yazılmalıdır:.5
    • 900.090 şu şekilde yazılmalıdır: 900.09
  • Son iki kuralın istisnası sıfırdır ve her zaman düz olarak yazılmalıdır0 .

  • Sayıları +gereksiz yere uzattıklarından pozitif işaretler ( ) kullanılmamalıdır.

Ayrıca, negatif işaretinin ( -) çıkarma işareti olarak kullanılmaması gerektiğini unutmayın. Yalnızca sıfırdan küçük sayıların ilk karakteri olarak görünmelidir.

Biçimlendirme

Çıktı sayı listesinin sırası önemli değildir. Artan, azalan veya tamamen karışmış olabilir. Yalnızca N karakterle yazılabilen tüm ayrı sayıların mevcut olduğu önemlidir.

Liste, işler tutarlı olduğu sürece boşluklar, yeni satırlar, virgüller veya sayılar arasında belki başka bir şey kullanılarak makul bir şekilde biçimlendirilebilir. Önde gelen ve sondaki parantezler (veya benzeri) uygundur, ancak sayılardaki tırnak işaretleri gibi şeyler değildir. (yani çıktıdaki dizeleri ve iç / yüzmeleri gözle karıştırmayın.)

Örneğin, N = 1 olduğunda, bazı geçerli çıktılar şöyle olur:

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 }

Ancak bu geçersiz olacaktır:

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

Örnekler

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

Listeler, okuma kolaylığı için bazı yerlerde elips şeklinde artan sıradadır.

puanlama

Bayt cinsinden en kısa kod kazanır. Bağlar durumunda, daha yüksek oylanan cevap kazanır


-0Geçerli çıktı olmalı mı ?
Kapı tokmağı

@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 Evet. Negatif sıfır sıfırdan farklı mıdır?
Kapı tokmağı

@Doorknob Sıfır sıfırdan küçük mü?
Mego

Mego ne dedi ve ayrıca "[sıfır] her zaman düz olarak yazılmalıdır 0".
Calvin'in Hobileri

Yanıtlar:


2

Pyth, 47 45 bayt

Sayesinde FryAmTheEggman için kayda sırası önemli olmadığı.

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

Çevrimiçi deneyin.

Çalışma zamanı korkunç, temelde O (12 n ), ancak nbilgisayarımda (6 dakika) = 6 için test ettim . Koşu n≥ 5 olacak çevrimiçi zaman aşımına.

Karakterleri yaratma şeklimden dolayı 0123456789.- dolayı çıktı gerçekten garip bir sırada.

Biri teknik {olarak sonunu kaldırabilir , ancak O'nun karmaşıklığına neden olur (19 n ). (Ayrıca çok sayıda kopya üretecektir, ancak buna izin verilir.)

açıklama

                  _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

Kodun ana kısmı, ".- \..*\. ^-?0. [.-]0*$"herhangi bir çıkışın eşleşmemesi gereken normal ifadeleri içeren .

.-         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 bayt

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

Çevrimiçi yorumlayıcıda deneyin .

Çok uzun ve korkunç çalışma süresiyle (N = 4 için birkaç saniye sürer, N = 5 ile çalıştırmak önerilmez).

            .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

Normal ifade açıklaması:

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

1
Bir golf değil, ama sadece rakamları etkiler bu yüzden *Qpermütasyon yapma şey koyabilirsiniz düşünüyorum +, bu performansı biraz artırmak gerekir. Normal ifadeye bazı baytların kaydedilmesine bile yardımcı olabilir mi?
FryAmTheEggman

2

Julia, 126 117 bayt

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

Bu, bir tamsayıyı kabul eden ve bir dize dizisi döndüren lambda işlevidir. Bunu çağırmak için bir değişkene atayın. Buradaki yaklaşım Kapı Tokmağı'nın Pyth cevabı ile aynı .

Ungolfed:

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 bayt

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

Çevrimiçi deneyin!

Bu, süper kaba kuvvet (Kartezyen gücü ile) ve ardından filtreleme (normal bir ifade ile) kullanır. Daha sonra bir açıklama ekleyeceğim.

Sonuçlar programın sonunda görüntülenir. Bu biraz zaman alabilir. Sonuçları oluşturulduklarını görmek istiyorsanız , sonuna ekleyinD :

45:57iZ^!"@!'^(-?(([1-9]\d*)|([1-9]\d*)?(\.\d*[1-9]))|0)$'XXD
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.