문자열에 맞는 모든 숫자


12

양의 정수 N을받는 프로그램이나 함수를 작성하십시오 . 숫자 ( 0123456789), 소수점 ( .) 및 음수 부호 ( -)를 사용하여 정확히 N 문자 로 쓸 수있는 모든 고유 한 10 진수 목록을 출력하십시오 .

예를 들어, N = 4 출력리스트 될 어떤 숫자는 1337, 3.14, .999, -789, -2.7, 및 -.09.

숫자는 일반적인 방식 으로 작성되지만 가능한 한 짧은 형식으로 작성됩니다 . 이것은 다음을 의미합니다.

  • 소수점이 숫자가 아닌 경우에만 포함되어야합니다.

    • 45.0, 45.평범하게 작성되어야한다45
    • -45.00 로 작성해야합니다 -45
  • 소수점 왼쪽에 선행 0이 없어야합니다.

    • 03003같은 작성해야 3하지만, 30그리고 300는 그대로 괜찮
    • 0.3그리고 00.3그냥 작성해야합니다.3
    • -03 로 작성해야합니다 -3
    • -0.3 로 작성해야합니다 -.3
  • 소수점 오른쪽에 후행 0이 없어야합니다.

    • .50.500같이 작성해야.5
    • 900.090 로 작성해야합니다 900.09
  • 마지막 두 규칙에 대한 예외는 제로 자체이며 항상 일반으로 작성0 해야합니다 .

  • 양수 부호 ( +)는 불필요하게 숫자를 길게하기 때문에 사용해서는 안됩니다.

또한 음수 부호 ( -)를 빼기 부호로 사용해서는 안됩니다. 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유효 출력 할 수?
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

@ 메고 예. 음수 0은 0과 구별됩니까?
Doorknob

@Doorknob 0이 0보다 작습니까?
Mego

@Doorknob 아니오. Mego의 말과 "[zero]는 항상 평범하게 쓰여 져야합니다 0".
Calvin 's Hobbies

답변:


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.