ตัวเลขทั้งหมดที่พอดีกับสตริง


12

เขียนโปรแกรมหรือฟังก์ชั่นที่รับจำนวนเต็มบวก N เอาท์พุทรายการตัวเลขทศนิยมที่แตกต่างทั้งหมดที่สามารถเขียนด้วยตัวอักษร N ตัวโดยใช้ตัวเลข ( 0123456789), จุดทศนิยม ( .) และเครื่องหมายลบ ( -)

ยกตัวอย่างเช่นตัวเลขบางอย่างที่จะอยู่ใน N = 4 แสดงรายการมี1337, 3.14, .999, -789, และ-2.7-.09

ตัวเลขที่มีการที่จะเขียนในทางที่ปกติแต่ในระยะสั้นรูปแบบที่เป็นไปได้ หมายความว่า:

  • จุดทศนิยมควรถูกรวมไว้ด้วยถ้าตัวเลขนั้นไม่ใช่จำนวนเต็ม

    • เช่น45.0และ45.ควรเขียนเป็นแบบธรรมดา45
    • -45.00 ควรเขียนเป็น -45
  • ไม่ควรมีศูนย์นำหน้าทางซ้ายของจุดทศนิยม

    • 03และ003ควรเขียนเป็น3แต่30และ300ดีตามที่
    • 0.3และ00.3ควรเขียนอย่างยุติธรรม.3
    • -03 ควรเขียนเป็น -3
    • -0.3 ควรเขียนเป็น -.3
  • ไม่ควรมีเลขศูนย์ต่อท้ายทางด้านขวาของจุดทศนิยม

    • .50และ.500ควรเขียนเป็น.5
    • 900.090 ควรเขียนเป็น 900.09
  • ข้อยกเว้นของกฎสองข้อสุดท้ายคือศูนย์ตัวเองซึ่งควรเขียนเป็นแบบธรรมดา0เสมอ

  • +ไม่ควรใช้สัญญาณบวก ( ) เพราะจะทำให้หมายเลขยาวขึ้นโดยไม่จำเป็น

โปรดทราบว่า-ไม่ควรใช้เครื่องหมายลบ ( ) เป็นเครื่องหมายลบ ควรปรากฏเป็นอักขระตัวแรกของตัวเลขที่น้อยกว่าศูนย์

การจัดรูปแบบ

ลำดับของรายการเอาท์พุทตัวเลขไม่สำคัญ มันอาจจะเป็นจากน้อยไปมากหรือมากไปน้อย มันเป็นเรื่องสำคัญที่ทุกส่วนของตัวเลขที่แตกต่างกันที่สามารถเขียนตัวอักษร N ที่มีอยู่

รายการสามารถจัดรูปแบบด้วยวิธีที่เหมาะสมใช้ช่องว่างการขึ้นบรรทัดใหม่เครื่องหมายจุลภาคหรืออาจเป็นอย่างอื่นระหว่างตัวเลขตราบใดที่สิ่งต่าง ๆ มีความสอดคล้องกัน วงเล็บปีกกาที่นำหน้าและต่อท้าย (หรือคล้ายกัน) นั้นโอเค แต่สิ่งต่าง ๆ เช่นเครื่องหมายคำพูดรอบ ๆ ตัวเลขนั้นไม่ใช่ (นั่นคือไม่ควรรวมสตริงและ ints / 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เป็นผลลัพธ์ที่ถูกต้อง?
Doorknob

@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

@Doorknob ไม่สิ่งที่ Mego พูดและ "[ศูนย์] ควรเขียนเป็นธรรมดา0เสมอ"
งานอดิเรกของ Calvin

คำตอบ:


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*$"ซึ่งมี regexes ผลลัพธ์ใด ๆ จะต้องไม่ตรงกัน

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

คำอธิบาย Regex:

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

1
ไม่ใช่กอล์ฟ แต่ฉันคิดว่าคุณสามารถนำ*Qสิ่งที่เปลี่ยนแปลงไปทำก่อนหน้านี้ได้+ดังนั้นมันจะมีผลกับตัวเลขเท่านั้นซึ่งควรปรับปรุงประสิทธิภาพให้ดีขึ้นเล็กน้อย มันอาจช่วยให้บันทึกไบต์ใน regex?
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 คำตอบ

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 ไบต์

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.