Semua angka yang cocok dalam sebuah string

12

Tulis program atau fungsi yang menggunakan bilangan bulat positif N. Keluarkan daftar semua angka desimal berbeda yang dapat ditulis dalam karakter N persis menggunakan digit ( 0123456789), titik desimal ( .), dan tanda negatif ( -).

Sebagai contoh, beberapa nomor yang akan di daftar keluaran N = 4 adalah 1337, 3.14, .999, -789, -2.7, dan -.09.

Angka-angka harus ditulis dengan cara biasa, tetapi dalam bentuk sesingkat mungkin . Ini berarti:

  • Titik desimal hanya boleh dimasukkan jika angka tersebut bukan bilangan bulat.

    • mis 45.0dan 45.harus dituliskan sebagai polos45
    • -45.00 harus ditulis sebagai -45
  • Seharusnya tidak ada angka nol di sebelah kiri titik desimal.

    • 03dan 003harus ditulis sebagai 3, namun 30dan 300baik-baik saja karena mereka
    • 0.3dan 00.3harus ditulis sebagai adil.3
    • -03 harus ditulis sebagai -3
    • -0.3 harus ditulis sebagai -.3
  • Seharusnya tidak ada trailing nol di sebelah kanan titik desimal

    • .50dan .500harus ditulis sebagai.5
    • 900.090 harus ditulis sebagai 900.09
  • Pengecualian untuk dua aturan terakhir adalah nol itu sendiri, yang harus selalu ditulis sebagai biasa0 .

  • Tanda-tanda positif ( +) tidak boleh digunakan karena tidak perlu memperpanjang jumlahnya.

Perhatikan juga bahwa tanda negatif ( -) tidak boleh digunakan sebagai tanda pengurangan. Seharusnya hanya muncul sebagai karakter pertama angka kurang dari nol.

Memformat

Urutan daftar output angka tidak masalah. Itu bisa naik, turun, atau benar-benar tercampur. Yang penting hanyalah semua angka berbeda yang dapat ditulis dalam huruf N ada.

Daftar dapat diformat dengan cara yang masuk akal, menggunakan spasi, baris baru, koma, atau mungkin sesuatu yang lain di antara angka-angka, selama semuanya konsisten. Tanda kurung terkemuka dan tertinggal (atau serupa) baik-baik saja tetapi hal-hal seperti kutipan di sekitar angka tidak. (Yaitu tidak terlihat mencampur string dan int / mengapung dalam output.)

Misalnya, ketika N = 1, beberapa output yang valid adalah:

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 }

Tetapi ini tidak valid:

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

Contohnya

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

Daftar dalam urutan menaik, elips di beberapa tempat untuk kenyamanan membaca.

Mencetak gol

Kode terpendek dalam byte menang. Dalam hal ikatan, jawaban yang lebih tinggi menang

Hobi Calvin
sumber
Haruskah -0output yang valid?
Gagang Pintu
@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 Ya. Apakah nol negatif berbeda dari nol?
Gagang pintu
@ Dooorknob Apakah nol kurang dari nol?
Mego
@Doorknob No. Apa yang dikatakan Mego, dan juga "[nol] harus selalu dituliskan sebagai gamblang 0".
Calvin Hobbies

Jawaban:

2

Pyth, 47 45 byte

Terima kasih kepada FryAmTheEggman karena memperhatikan bahwa pesanan tidak masalah.

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

Cobalah online.

Runtime itu mengerikan, pada dasarnya O (12 n ), tapi saya mengujinya untuk n= 6 di komputer saya (yang butuh 2 menit). Berjalan n≥ 5 akan habis waktu online.

Karena cara saya menghasilkan karakter 0123456789.-, outputnya dalam urutan yang sangat aneh.

Seseorang dapat secara teknis menghapus {dekat akhir, tetapi akan menghasilkan kompleksitas O (19 n ). (Ini juga akan menghasilkan banyak duplikat, tetapi itu dibolehkan.)

Penjelasan

                  _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

Bagian utama dari kode ini adalah ".- \..*\. ^-?0. [.-]0*$", yang berisi regex, output apa pun tidak boleh cocok.

.-         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
PurkkaKoodari
sumber
3

Pyth, 57 byte

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

Cobalah menggunakan penerjemah online .

Terlalu lama, dan dengan runtime yang mengerikan (membutuhkan beberapa detik untuk N = 4, berjalan dengan N = 5 tidak disarankan).

            .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

Penjelasan regex:

^0$|            "0", or...
^
 -?             optional negative sign
 ([1-9]\d*)?    optional part-before-decimal
 (\.\d*[1-9])?  optional part-after-decimal
$
Gagang pintu
sumber
1
Bukan golf, tapi saya pikir Anda bisa memasukkan *Qpermutasi Anda sebelum +jadi hanya mempengaruhi digit, ini seharusnya meningkatkan kinerja sedikit. Bahkan mungkin membantu menghemat beberapa byte di regex?
FryAmTheEggman
2

Julia, 126 117 byte

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

Ini adalah fungsi lambda yang menerima integer dan mengembalikan array string. Untuk menyebutnya, tetapkan ke variabel. Pendekatan di sini sama dengan jawaban Doorknob's Pyth .

Tidak Disatukan:

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
Alex A.
sumber
1

MATL , 60 byte

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

Cobalah online!

Ini menggunakan kekuatan super-brute (melalui kekuatan Cartesian) diikuti dengan penyaringan (melalui ekspresi reguler). Saya akan menambahkan penjelasan nanti.

Hasilnya ditampilkan di akhir program. Ini mungkin memakan waktu cukup lama. Jika Anda ingin melihat hasil yang dihasilkan, tambahkan Ddi akhir :

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