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


9

이는 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 일까지 최단 (유효한) (작업) 제출, 가장 빠른 제출 우승으로 동점.


1
나는 이것을 명확하게하기위한 좋은 출발 ?은 응답자가 선택 하도록 지정하는 것이라고 생각합니다 .
FryAmTheEggman

2
25에 대한 올바른 대답 ***만하지 않는가 *2*?
Neil

3
숫자에 선행 0이 없으면 길이가 일치하는 시퀀스 만 일치하면 더 깨끗할 것이라고 생각합니다.
xnor

@Neil 그것은 내 자신의 솔루션에 문제가 될 것입니다. 나는 xnor의 제안을 받아 들일 것이다.
HyperNeutrino

입력 은 ? 와 같은 문자 배열이 아닌 한 자리 정수의 배열 및 특수 문자 (예 : {4, "w", "w", 6}더 나은 {4, w, w, 6})입니다 {"4", "w", "w", "6"}.
Greg Martin

답변:



1

매스 매 티카, 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@@@ ...

인쇄하십시오.


이것은 모든 테스트 사례에서 작동하는 것으로 보입니다. 잘 했어.
HyperNeutrino

1

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가 있으면 작동하지 않습니다.


이것은 모든 입력에서 작동하는 것으로 보입니다. 잘 했어. 그러나 1 바이트 인수가 필요하기 때문에 이것을 24 바이트로 간주합니다. 그래도이 점수가 어떻게 작동하는지 잘 모르겠습니다.
HyperNeutrino

1
@AlexL. 인수는 출력 변수의 이름을 알려주기 위해서만 있습니다 (원한다면 다른 대문자를 사용할 수 있습니다). 이것은 술어 / 함수의 이름이 지정되었지만 호출 할 때 사용하는 바이트 수를 실제로 계산하지 않는 함수가있는 Prolog / languages의 답변과 유사합니다.
Fatalize

괜찮아. 인수가 필요하기 때문에 (24를 반환하면 true.) 24로 점수를 매길 지 확실하지 않지만 이전에 이것을 요구하는 언어는 사용하지 않았습니다. 점수를 매기는 방법을 결정하기 위해 몇 가지 참고 자료를 찾으려고 노력하지만 23으로 점수를 매기는 것이 합리적이므로 그 점을 유지하겠습니다.
HyperNeutrino

1

펄 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)»²}

규칙을 다시 설정했으며 와일드 카드 문자를 선택할 수 있습니다. 38 바이트로 점수를 매 깁니다.
HyperNeutrino

음, 어떻게 사용합니까? 나는 펄에 대해 아무것도 모른다.
HyperNeutrino

@ AlexL. : 감사합니다. 답변을 업데이트했습니다 (설명도 추가했습니다). 람다입니다. 직접 호출 (예 :) { ... }("9*9***")하거나 나중에 사용할 수 있도록 변수 / 기호에 할당 할 수 있습니다. Perl 6은 Perl과 다른 언어이므로 Perl 인터프리터에서는 작동하지 않습니다.
smls

예전 sudo apt-get install rakudo에는 Perl6 인터프리터를 사용했습니다 ... perl6터미널에 명령을 입력하면 Perl6 인터프리터 인 것부터 시작하지만 사용법을 모르겠습니다. 나는 그것이 람다라는 것을 알고 있지만 그것을 부르는 방법을 모른다.
HyperNeutrino

@AlexL .: "온라인으로 시도"링크를 추가하여로 실행할 수있는 전체 스크립트로 표시합니다 perl6 foo.p6. 같은 또한, 쉘 oneliner에서 테스트 할 수 있습니다perl6 -e 'say {grep /^<$_>$/,map * **2,^1e4}( "9.9..." )'
SMLS

1

루비, 54 바이트

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

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

i ** 2 대신 i * i를 사용하여 바이트를 절약 할 수 있습니다.
GB

두 번째 #줄의 나머지 부분을 주석으로 만들기 때문에 이것은 작동하지 않는 것 같습니다 .
HyperNeutrino

@ AlexL 아, 그것은 잘 작동합니다. repl.it/FJCV
밸류 잉크

오케이 좋아, 루비를 테스트하는 방법을 몰랐어. 사과드립니다. 이것은 모든 입력에서 작동하는 것으로 보입니다. 잘 했어!
HyperNeutrino

0

배치, 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; 이 $때문에 경기가 정확 강제로. 그러나 우리는를 출력하고 싶지 $않으므로 확장명없이 파일 이름 만 출력합니다.


0

자바 스크립트 (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까지 반복되므로 끔찍하게 느립니다.


나는 **그것이 나를주는 것이기 때문에 효과 가 없다고 생각 합니다 "SyntaxError: expected expression, got '*'".
HyperNeutrino

@AlexL. 규칙이 변경된 것 같습니다. 이전 규칙에서는 와일드 카드 문자를 선택할 수 있다고 제안했습니다.
George Reith

당신은 최대 지원해야 1e6...
HyperNeutrino

또한 규칙을 다시 변경했습니다. 문제는 규칙과 관련이 없으며 **운영자가 존재하지 않기 때문 입니다. 적어도 내 시스템에는 없습니다.
HyperNeutrino

@AlexL. 아 죄송합니다 당신이 입력을 의미 생각합니다 **. 예 ES7입니다. 여기서 제목을 업데이트하겠습니다. 현재 지원되는 브라우저 목록이 있습니다. developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
George Reith

0

펄, 42 45 38 바이트

편집 : Alex에 의한 설명, 우리는 마침표를 와일드 카드 문자로 사용하여 y / / 작업을 줄입니다.

perl -pe 's|.*|@{[grep/^$&$/,map$_*$_,1..1e3]}|'

편집 : 별표를 와일드 카드 문자로 사용하고 STDIN에서 와일드 카드 시퀀스를 기대하는 솔루션

perl -pe 'y/*/./;s|.*|@{[grep/^$&$/,map$_*$_,1..1e3]}|'

이것은 의심 할 여지없이 개선의 여지가 많이 남습니다. 그것은 매우 간단합니다. 와일드 카드 식은 마침표 와일드 카드 문자 (다른 것)와 함께 명령 행 인수로 예상됩니다.

say"@{[grep/^$ARGV[0]$/,map$_*$_,1..1e3]}"

이 질문은 와일드 카드가 별표로 표시되도록 지정합니다. 질문의 이전 개정에서 자신의 와일드 카드 문자를 선택할 수 있었습니까?
smls

1
@smls : 규칙 섹션에 없더라도 질문은 여전히 ​​자신의 와일드 카드를 선택하도록 지정합니다 . 와일드 카드로 사용 된 문자는 반드시 별표 일 필요는 없으며 선택한 ASCII 문자 일 수 있습니다. 분명히 숫자가 아닙니다.
Emigna 2012 년

네, 혼란 스러웠습니다. 나중에 와일드 카드 문자는 별표 여야합니다. 정규식으로 정의가 앞서고 있다고 생각합니다. 솔루션을 수정하겠습니다.
다니엘

1
흠, 실제로 @Emigna가 인용 한 문장은 우리 우리 자신의 와일드 카드 문자를 선택할 있다는 것을 분명히 알 있습니까?
smls

명확히하기 위해 와일드 카드 문자는 원하는대로 될 수 있습니다. 설명을 다시 할 때 실수로 규칙을 엉망으로 만들었습니다.
HyperNeutrino

0

파이썬 3-98 97 바이트

import re;print(re.findall(r"\b"+input()+r"\b",("\n".join([str(x*x) for x in range(1,1001)]))))

'4..6'과 같은 입력이 필요합니다.


import reand 를 사용하여 3 바이트를 절약 할 수 있습니다 re.findall. 과 최적화는 from...import *실제로이 경우에는 최적화되지 않습니다.
HyperNeutrino

input 1....을 제공하면 올바른 답변을 제공 1 4 9하며 16 25올바르지 않습니다. 프로그램을 수정하십시오.
HyperNeutrino

"\ n"에 가입하여 사례를 수정하십시오.
Carra

이 기능은 작동하지 않습니다 1....... 반환 []하지만 제공해야합니다 [1000000]. 이 range(0, 1001)대신 을 사용하여 0 바이트의 비용으로 수정할 수 있습니다 range(0, 1000).
HyperNeutrino

좋은 지적, 난 방금 설명에서 모든 테스트 사례를 확인했습니다 :)
Carra

0

k-28 자

{s(&:)($:s:s*s:!1001)like x}

?와일드 카드 문자로 사용 합니다. 이 like함수는 ?와일드 카드로 사용 되며이 함수는 첫 1001 정사각형 (1M 포함)의 목록을 만들어 모두 문자열로 캐스트 한 다음 패턴과 일치하는 위치를 확인합니다.

    {s(&:)($:s:s*s:!1001)like x} "1??"
100 121 144 169 196

이 오류가 발생합니다 type error {s(&:)($:s:s*s:!1001)like x} "1" at execution instance 2 of ":".. 작동중인 테스트 스위트에 대한 링크를 제공하거나 문제가 있는지 확인할 수 있습니까?
HyperNeutrino

@AlexL. 그것은 KDB +의 K 모드에서 나를 위해 작동
C. Quilley

흠. 다른 통역사들과 함께 시험해 볼 것입니다.
HyperNeutrino

0

bash + 유닉스 유틸리티, 33 바이트

dc<<<'0[2^pv1+lax]dsax'|grep ^$1$

이것은 '.'를 사용합니다. 와일드 카드 문자로.

dc 프로그램은 제곱 수를 무한 루프로 인쇄합니다.

0     Push 0 on the stack.

[     Start a macro (called a).

2^    Square the number at the top of the stack.

p     Print the number at the top of the stack, followed by a newline.

v     Replace the number at the top of the stack (a square number) with its square root.

1+    Increment the number at the top of the stack.

lax   Run the macro again (looping).

]     End of the macro.

dsax  Store the macro in register a and run it.

dc 출력은 grep으로 파이프되어 필요한 패턴과 일치하는 사각형 만 인쇄합니다.

이것은 실제 Linux 또는 OS X 시스템에서 실행할 때 작동하지만 DC 프로그램은 영원히 재귀를 시도하기 때문에 TIO에서는 작동하지 않으며 TIO는 재귀를위한 스택 공간이 부족하거나 끝없는 파이프의 문제).


Linux Mint 17.3 Rosa로 이것을 실행하고 있으며 종료되지 않습니다. 나는 문제가 끝없는 dc명령에 있다고 생각합니다 .
HyperNeutrino

실제로 문제를 일으키는 버퍼링이라고 생각합니다. Linux 버전은 없지만 grep을 grep --line-buffered로 바꾸어보십시오 (각 줄이 잘릴 때 인쇄되도록). [물론, 그것은 많은 바이트를 추가합니다.]
Mitchell Spector

grep 인수를 추가했지만 차이가 없습니다. 의 --line-buffered양쪽 에을 넣어 보았지만 어느 쪽도 ^$1$작동하지 않습니다.
HyperNeutrino

@AlexL. 시도해 주셔서 감사합니다. 차이점이 커널에 있는지 또는 내가 실행중인 bash 버전에 있는지 모르겠습니다. 다음과 같이 head를 사용하여 grep의 입력을 강제 종료하여 TIO에서 작동하도록했습니다. dc <<<< 0 [2 ^ pv1 + lax] dsax '| head -1 sed s/./0/g<<<$1| grep ^ $ 1 $ 길이를 사용합니다. 패턴을 테스트하여 숫자를 제한합니다 (4 자 패턴은 최대 9999 등 만 확인). TIO 링크는 다음과 같습니다. tio.run/nexus/…
Mitchell Spector

수정 해 주셔서 감사합니다. 현재 솔루션이 실제로 작동하지 않을 것이라고 생각합니다 (bash에 대한 지식이 많지 않지만) grep. 그러나 현재 가장 짧은 솔루션은 아니므로 점수 매기기 위해 33 바이트로 유지합니다. 모든 입력에서 작동하는 것처럼 보이므로 잘하셨습니다!
HyperNeutrino
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.