이는 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)»²}
답변
답변
배치, 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?
모두 일치 1
와 16
; 이 $
때문에 경기가 정확 강제로. 그러나 우리는를 출력하고 싶지 $
않으므로 확장명없이 파일 이름 만 출력합니다.
답변
자바 스크립트 (ES6), 68 66 바이트
편집 : JungHwan Min의 답변 에서 영감을 얻은 후 아래 솔루션을 업데이트했습니다 . 이제 ES6를 준수합니다.
형식의 입력을 받아 와일드이다.'1..4'
.
1e6으로 반복하고 제곱근을 뿌리는 대신 1e3과 제곱으로 반복합니다.
p=>[...Array(1e3)].map((_,n)=>''+n*n).filter(n=>n.match(`^${p}$`))
F=p=>[...Array(1e3)].map((_,n)=>''+n*n).filter(n=>n.match(`^${p}$`))
const update = () => {
console.clear();
console.log(F(input.value));
}
submit.onclick = update;
update();
<input id="input" type="text" value="9....9" style="width: 100%; box-sizing: border-box" /><button id="submit">submit</button>
자바 스크립트 (ES7), 71 69 바이트
p=>[...Array(1e6).keys()].filter(n=>n**.5%1?0:(''+n).match(`^${p}$`))
0에서 1e6까지의 숫자 배열을 만든 다음 정사각형이고 패턴과 일치하는 숫자로 필터링합니다.
항상 1e6까지 반복되므로 끔찍하게 느립니다.
F=p=>[...Array(1e6).keys()].filter(n=>n**.5%1?0:(''+n).match(`^${p}$`))
const update = () => {
console.clear();
console.log(F(input.value));
}
submit.onclick = update;
update();
<input id="input" type="text" value="9....9" style="width: 100%; box-sizing: border-box" /><button id="submit">submit</button>