정규식 골프 : 이탈리아 대 미국의 지역


23

xkcd 만화에서 영감을 얻은 메타 정규식 골프 문제 가 이미 있습니다.

저작권 2013 랜달 먼로

그러나이 정규식 골프도 재미있어 보입니다! 미국의 상태와 이탈리아의 지역을 구별하고 싶습니다. 왜? 나는 두 나라의 시민이며 항상 이것에 문제가 있습니다 * .

이탈리아의 지역은

Abruzzo, Valle d'Aosta, Puglia, Basilicata, Calabria, Campania, Emilia-Romagna, Friuli-Venezia Giulia, Lazio, Liguria, Lombardia, Marche, Molise, Piemonte, Sardegna, Sicilia, Trentino-Alto Adige/Südtirol, Toscana, Umbria, Veneto

미국의 주들은

Alabama, Alaska, Arizona, Arkansas, California, Colorado, Connecticut, Delaware, Florida, Georgia, Hawaii, Idaho, Illinois, Indiana, Iowa, Kansas, Kentucky, Louisiana, Maine, Maryland, Massachusetts, Michigan, Minnesota, Mississippi, Missouri, Montana, Nebraska, Nevada, New Hampshire, New Jersey, New Mexico, New York, North Carolina, North Dakota, Ohio, Oklahoma, Oregon, Pennsylvania, Rhode Island, South Carolina, South Dakota, Tennessee, Texas, Utah, Vermont, Virginia, Washington, West Virginia, Wisconsin, Wyoming

당신의 임무는 정규식으로 이러한 목록을 구별하는 프로그램을 작성하는 것입니다. 이것은 새로운 게임이므로 여기

규칙

  • 일치하는 단일 정규식을 사용하여 목록을 구별해야합니다.
  • 당신의 점수는 정규 표현식의 길이이며, 작을수록 좋습니다.

명확하게 : 모든 작업은 정규 표현식으로 수행해야합니다. 정규 표현식으로도 수행되지만 필터링, 교체, 아무것도하지 않습니다. 즉, 입력을 정규식으로 직접 전달해야하며 코드의 이후 부분에서는 이진 응답 (일치 / 일치 없음) 만 사용할 수 있습니다. 입력은 일치하는 표현식 이외의 것으로 검사하거나 변경해서는 안됩니다. 예외 : Ruby와 비슷한 줄 바꿈을 먹는 것이 chomp좋습니다.

단일 항목을해야 여러분의 프로그램은 (선택적으로 다음 \n또는 EOF표준 입력에서 두 목록에서 쉽게 일을하게 된 경우), 그 목록의 이름을 stdout에 인쇄 할 수 있습니다. 이 경우 목록의 이름은 ItalyUSA입니다.

코드를 테스트하려면 두 목록을 모두 실행하십시오. 목록에없는 문자열에 대해서는 동작이 정의되지 않을 수 있습니다.

채점 문제

이 작업은 언어별로 수행해야 할 수도 있습니다. 펄에서

m/foobarbaz/

일치하는 정규식입니다. 그러나 파이썬에서는

import re
re.compile('foobarbaz')

같은 일을합니다. 우리는 파이썬에 대한 따옴표를 세지 않을 것이므로 Perl 에서 m/and final /을 세지 않는다고 말합니다 . 두 언어 모두 위의 점수는 9 점입니다.

Abhijit가 제기 한 점을 명확히하기 위해 일치하는 표현식의 실제 길이는 동적으로 생성하더라도 점수입니다. 예를 들어, 마법의 표현을 발견하는 경우 m,

n="foo(bar|baz)"
m=n+n

12 점을보고해서는 안됩니다 m. 길이는 24입니다. 그리고 더 명확하게 말하면, 생성 된 정규식은 입력에 의존 할 수 없습니다. 정규식으로 전달하기 전에 입력을 읽습니다.

세션 예

input> Calabria
Italy
input> New Hampshire
USA
input> Washington
USA
input> Puglia
Italy

* 사실, 그것은 거짓말입니다. 나는 이것에 전혀 문제가 없었습니다.


"정규 표현식으로도 수행되는 경우에도"필터링 없음, 교체 없음, 없음 없음 "의 의미를 설명 할 수 있습니까? 명확히하기 위해 필터링, 주 / 지역 목록 교체 또는 포커스가 더 넓습니까?
Abhijit

@Abhijit 님이 수정했습니다. 더 명확합니까?
boothby

3
@ Eliseod'Annunzio : DC는 국가 가 아닙니다
Kyle Kanos

1
"목록에없는 문자열에 대해서는 동작이 정의되지 않을 수 있습니다." 이 규칙은 깨졌습니다 : USA그러한 문자열의 경우 하나를 반환 할 수 있으므로 이탈리아 지역을 확인하고 USA그렇지 않으면 반환해야 합니다.
o0 '.

1
@boothby, 아니, 그것은 단순한 논리입니다 : 그것은 기본적으로 이탈리아 지역과 일치하는 정규 표현식 만 요구하지만, 너무 복잡한 방식으로 불필요하게 표현되었습니다. 전체 실제 질문은 질문에 미국 상태에 대한 점은 완전히이 버그 덕분에 관련이 없습니다. 이것은 또한 질문을 훨씬 덜 흥미롭게 만듭니다.
o0 '.

답변:


10

펄- 51 36 바이트 (정규식의 경우)

print<>=~/.A|ise|net|te|z.o|[cp]a|[lr]ia|r[cd]/?"Italy
":"USA
"

특별한 것은 없지만 다른 51 바이트 솔루션과 다르기 때문에 게시 할 수도 있습니다.

또는 이미 짧은 솔루션을 15 바이트 줄입니다. 지금 당장 이긴다고 생각합니다.


7

펄, 40 자

이것을 다른 방향에서 접근하는 것, 즉 미국 주와 일치하는 것 :

[DNIOWy]|ss|M.n|^A.*a|or|[aguh]i|[sth]\b

정규 표현식의 유일한 Perl / PCRE 관련 기능은 \b단어 경계 앵커 $입니다. "South Carolina"와 일치시키기 위해 문자열 끝 앵커 대신 사용 했습니다.

테스트를위한 Perl one-liner의 정규 표현식은 다음과 같습니다.

perl -nE 'say /[DNIOWy]|ss|M.n|^A.*a|or|[aguh]i|[sth]\b/ ? "USA" : "Italy"'

이것은보다 골프적인 테스트 하네스입니다. perl -pe '$ _ = / re /? "USA \ n": "Italy \ n"'
Pseudonym

3
@ 가명 : meh. 점수에 포함되지 않는 한 읽을 수있게 유지할 수 있습니다.
Ilmari Karonen


3

펄-51

(<STDIN> =~ m/'|-|ru|pu|at|pa|az|gu|mb|rc|ie|rd|ci|os|abr|mol|ven/)?printf("Italy\n"):printf("USA\n");

3

자바 스크립트 42

alert(/at|gn|mp|sc|-|'|((zi?|t)o|[hts]e|[lrd]ia)$/g.test(prompt())?"Italy":"USA")

미국리스트에서 KWXY를 제거하면 많은 미국이 사라져서 처음에는 이것을 미국 측에서 해결하려고했지만 ... 이탈리아는 17 명의 좋은 캐릭터를 얻었습니다.

팻 화살표 표기법을 사용하면 이것을 리턴 변수를 가진 간단한 함수로 줄일 수 있습니다.

r=s=>/at|gn|mp|sc|-|'|((zi?|t)o|[hts]e|[lrd]ia)$/g.test(s)?"Italy":"USA"

> r("South Dakota") // USA
> r("Puglia") // Italy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.