와일드 카드 시퀀스와 일치하는 모든 사각형 [닫기] 삼년 전에

이는 2016 ARML 경쟁 팀 문제 # 6의 일부에서 영감을 받았습니다.

도전은 다음과 같습니다.

일련의 숫자와 다른 문자 인 “와일드 카드 시퀀스”가 제공됩니다. 문자열은 다음 의사 코드로이 와일드 카드 시퀀스와 일치합니다.

w = wildcard
s = string
# s matches w iff
for all 0 >= i > wildcard.length, w[i] == '?' or s[i] == w[i]

어디 ‘?’ 당신이 선택한 캐릭터입니다.

정규식의 측면에서, 단지 상상할 '?''.'.

문제는 십진수 문자열 표현이이 와일드 카드 시퀀스와 일치하는 모든 제곱 수 (요구 사항은 최대 1 백만)를 찾는 것입니다. “와일드 카드 문자”는 숫자가 아닌 한 원하는 ASCII 문자 일 수 있습니다.

예를 들어, 4096일치 4**6하고 4*9*있지만 4114중 하나와 일치하지 않습니다.

입력

입력은 정규식과 일치하는 시퀀스로 제공됩니다 [0-9?]+. ASCII, 문자열, 문자 배열 또는 문자의 바이트 배열 일 수 있습니다.

산출

출력은 완벽한 정사각형이며 와일드 카드 시퀀스와 일치하는 원하는 숫자로 구분 된 목록 / 세트 / 배열입니다.

유효한 입력의 예 :

1234567*90
1234567?90
1234567u90
['1', '2', '3', '4', '5', '6', '7', '*', '9', '0']
[49, 50, 51, 52, 53, 54, 55, 42, 57, 48]
[1, 2, 3, 4, 5, 6, 7, '*', 9, 0]

유효한 출력의 예 :

[1, 4, 9]
1 4 9
1, 4, 9
1-4-9

기타

명세서

  • 특정 범위의 사각형 목록을 찾기 위해 내장을 사용할 수 없습니다
  • 표준 허점 적용
  • 최대 1,000,000 (1 백만)까지 처리 할 수 ​​있어야합니다.
  • 입력과 함께 제공되면 1******인쇄하는 것이 올바른 것입니다 [1000000]. 인쇄하는 것도 맞습니다[1000000, 1002001, 1004004, 1006009, 1008016, 1010025, ...]
  • 와일드 카드 시퀀스는 와일드 카드 문자로 시작하지 않습니다. 즉, 항상 같은 길이의 문자열과 일치합니다.

테스트 사례

4**6  ->  [4096, 4356]
1**1  ->  [1521, 1681]
1**  ->  [100, 121, 144, 169, 196]
9****9  ->  [908209, 915849, 927369, 935089, 946729, 954529, 966289, 974169, 986049, 994009]
9*9***  ->  [919681, 929296]
1**0*  ->  [10000, 10201, 10404, 10609, 12100, 14400, 16900, 19600]
9***4  ->  [91204, 94864, 97344]

승리

2 월 14 일까지 최단 (유효한) (작업) 제출, 가장 빠른 제출 우승으로 동점.



답변

05AB1E , 22 바이트

아마도 개선의 여지가 충분할 것입니다.
숫자가 아닌 문자는 와일드 카드로 사용할 수 있습니다.

3°LnvyS¹)ø€Æ0QPyg¹gQ&—

온라인으로 사용해보십시오!

추가 골프 후 올 설명.


답변

매스 매 티카, 44 바이트

Print@@@IntegerDigits[Range@1*^3^2]~Cases~#&

입력은 _와일드 카드로 (따옴표없이) 숫자 목록입니다 . 예 :{4, _, _, 6}

설명

Range@1*^3

목록 생성 {1, 2, 3, ... , 1000}

... ^2

제곱하십시오. (1에서 1,000,000까지의 모든 사각형 목록)

IntegerDigits[ ... ]

각 사각형을 자릿수 목록으로 나눕니다.

... ~Cases~#

입력에 의해 지정된 패턴과 일치하는 것을 찾으십시오.

Print@@@ ...

인쇄하십시오.


답변

Brachylog , 23 바이트

@e:{@$|,}a#0:{c.~^#I,}f

온라인으로 사용해보십시오!

설명

@e                        Split into a list of characters
  :{@$|,}a                Replace each digit char by the corresponding digit, and each things
                            that are ot digits into variables
          #0              All elements of the resulting list must be digits
            :{       }f   Output is the result of finding all...
              c.            ...concatenations of those digits which...
               .~^#I,       ...result in a number which is the square of an integer #I

다른 입력 형식, 13 바이트

입력으로 유효한 것으로 간주하는 내용에 따라 다음을 수행 할 수 있습니다.

#0:{c.~^#I,}f

온라인으로 사용해보십시오!

이것은 기본적으로 위 답변의 두 번째 부분이며 와일드 카드가있는 숫자와 변수가 포함 된 입력 목록입니다.

Brachylog에는 26 개의 변수 이름 (대문자) 만 있기 때문에 이것이 유효한 것으로 간주하지 않으므로 26 개 이상의 wilcard가 있으면 작동하지 않습니다.


답변

펄 6 , 30 26 바이트

-4 바이트를위한 @ b2gills에 감사합니다!

{grep /^<$_>$/,map * **2,^1e4}

{grep /^<$_>$/,(^1e4)»²}

입력을 정규식으로 사용할 수 있도록 점을 와일드 카드 문자로 사용합니다.

{                            }   # a lambda
                         ^1e4    # range from 0 to 9999
               map * **2,        # square each value
 grep /      /,                  # filter numbers that match this regex:
        <$_>                     #   lambda argument eval'ed as sub-regex
       ^    $                    #   anchor to beginning and end

온라인으로 사용해보십시오 .

작업 설명의 이전 개정에서 제안한대로 별표를 와일드 카드로 허용하는 변형은 42 바이트입니다.

{grep /^<{.trans("*"=>".")}>$/,(^1e4)»²}


답변

루비, 54 바이트

문자열 인수를 취하는 함수입니다. 온라인으로 사용해보십시오.

->s{(0..1e3).map{|i|"#{i**2}"[/^#{s.tr ?*,?.}$/]}-[p]}


답변

배치, 109 바이트

@for /l %%i in (0,1,999)do @set/aj=%%i*%%i&call copy nul %%j%%.%%j%%$>nul
@for %%s in (%1.%1$)do @echo %%~ns

?와일드 카드로 사용합니다 . 1000 개의 파일을 생성하여 작동합니다. 파일 이름은 제곱 수이고 파일 확장자는 $접미사 가있는 제곱 수입니다 . 뒤에 배치의 패턴 매칭 수가 있기 때문입니다 ?옵션으로의, 그래서 1?모두 일치 116; 이 $때문에 경기가 정확 강제로. 그러나 우리는를 출력하고 싶지 $않으므로 확장명없이 파일 이름 만 출력합니다.


답변

자바 스크립트 (ES6), 68 66 바이트

편집 : JungHwan Min의 답변 에서 영감을 얻은 후 아래 솔루션을 업데이트했습니다 . 이제 ES6를 준수합니다.

형식의 입력을 받아 와일드이다.'1..4'.

1e6으로 반복하고 제곱근을 뿌리는 대신 1e3과 제곱으로 반복합니다.

p=>[...Array(1e3)].map((_,n)=>''+n*n).filter(n=>n.match(`^${p}$`))

자바 스크립트 (ES7), 71 69 바이트

p=>[...Array(1e6).keys()].filter(n=>n**.5%1?0:(''+n).match(`^${p}$`))

0에서 1e6까지의 숫자 배열을 만든 다음 정사각형이고 패턴과 일치하는 숫자로 필터링합니다.

항상 1e6까지 반복되므로 끔찍하게 느립니다.