모호한 로마 숫자 마법 광장


10

고대 로마의 왕은 마법의 광장이 유효한지 아닌지를 결정하는 데 어려움을 겪고 있습니다. 그가 확인하는 마법의 광장에는 숫자 사이에 구분 기호가 없기 때문입니다. 그는 매직 스퀘어가 유효한지 여부를 판단하는 데 도움이되는 소프트웨어 엔지니어를 고용했습니다.

입력 설명

입력은 STDIN 또는 명령 행 인수에서 제공됩니다. 변수에 입력을 미리 초기화 할 수 없습니다 (예 : "이 프로그램은 변수에 입력을 기대합니다 x"). 입력 형식은 다음과 같습니다.

<top>,<middle>,<bottom>

각각 <top>, <middle>그리고 <bottom>오직 대문자 문자를 포함하는 문자열 I, V그리고는 X. 공백이나 다른 문자는 포함하지 않습니다. 각 문자열은 3 개의 로마 숫자를 나타내므로 3x3의 숫자 행렬이됩니다. 그러나 이러한 로마 숫자는 모호 할 수도 있지만 반드시 그런 것은 아닙니다 . 이것을 예로 들어 설명해 드리겠습니다. 각 숫자 사이에 공백이없는 세 개의 로마 숫자로 구성된 다음 행을 고려하십시오.

IVIIIIX

문자 사이에 공백이 없기 때문에 숫자에 두 가지 가능성이 있습니다.

  • 1, 8, 9 ( I VIII IX)
  • 4, 3, 9 ( IV III IX)

행렬의 세 행이 모두 모호 할 수 있다고 생각할 때 단일 입력과 다른 3x3 행렬이 많이있을 가능성이 있습니다.

I VII I IX각 행이 항상 3 개의 로마 숫자를 나타내므로 1, 7, 1, 9 ( ) 와 같은 시퀀스 는 불가능합니다. 또한 로마 숫자는 유효해야하므로 1, 7, 8 ( I VII IIX) 과 같은 시퀀스 도 불가능합니다.

출력 설명

산출:

  • integer A. 여기서 A모호한 입력으로 구성 할 수있는 고유 한 3x3 행렬의 수는 다음과 같습니다.
  • truthy의 값 경우 어떤 고유 한 3 × 3 행렬은 마법의 광장을 형성하거나 :
  • falsy 값 경우 아무도 고유의 3 × 3 행렬은 마법의 사각형을 형성하지 않는다.

진실되고 거짓된 가치는 일관되어야합니다. 쉼표로 구분됩니다.

고유 한 것으로 간주되는 것에 대한 설명이 필요합니다. 행렬이 이전에 찾은 행렬과 정확히 같은 위치에 정확히 같은 숫자가없는 한 고유 한 것으로 계산됩니다. 즉, 이전에 찾은 행렬의 반사 등이 고유 한 것으로 계산됩니다.

입력 및 출력 예

이 예에서 나는 true진실한 가치와 허위 가치로 사용 false합니다.

입력 : VIIIIVI,IIIVVII,IVIXII 출력 : 24,true (마법의 삼각형은 8-1-6, 3-5-7, 4-9-2입니다.)

입력 : IIIXVIII,IVIII,VIIII 출력 :210,false

엑스트라

  • 선택한 언어에 언어가 있으면 내장 로마 숫자 변환 기능을 사용할 수 없습니다.

"고대 로마의 왕" ... 황제?
디지털 외상

8
@DigitalTrauma 고대 로마에 왕, 마술 광장, 소프트웨어 엔지니어가 있던 다른 우주에 세워졌습니다. 아니면 그런 식으로 ...
압생트

또한 쉼표 대신 인터 펑트 (·)를 사용해야합니다 ( en.wikipedia.org/wiki/Interpunct#Latin )
coredump

첫 번째는 "24, true"이지만 두 번째 예는 "210, false"입니다. 조사하겠습니다.
coredump 2016 년

1
@DigitalTrauma 로마는 약 509BC까지 왕이있었습니다.
Jon B

답변:


4

펄, 219237

명확성을 위해 줄 바꿈이 추가되었습니다.

#!perl -p
%x=(I,1,IV,4,V,5,IX,9,X,10);
$a="(X{0,3}(?:V?I{1,3}|I?V|IX)|X{1,3})"x3;
m*^$a,$a,$a$(?{
  @z=map"$$_",0..9;
  $r|=!grep$x-$_,map{$x=eval s/./ $z[$&]/gr=~s/IX|IV|\S/+$x{$&}/gr}123,456,789,147,258,369,159,357;
  ++$-
})^*;
$_="$-,$r"

나를 테스트 하십시오 .


4

프롤로그-686

:-lib(util),lib(sd). r(S,R):-string_list(S,L),g(L,R). g(L,[N1,N2,N3]):-append(L1,X,L),append(L2,L3,X),n(L1,N1),n(L2,N2),n(L3,N3). n([73,86],4). n([73,88],9). n([73,73,73],3). n([73,73],2). n([73],1). n([86],5). n([86|N],D):-n(N,E),E<4,D is E+5. n([88|N],D):-n(N,E),D is E+10. n([88],10). m(M,[X1,X2,X3,Y1,Y2,Y3,Z1,Z2,Z3]):-split_string(M,",","",[X,Y,Z]),r(X,[X1,X2,X3]),r(Y,[Y1,Y2,Y3]),r(Z,[Z1,Z2,Z3]). a(L):-alldifferent(L),L=[X1,X2,X3,Y1,Y2,Y3,Z1,Z2,Z3],l(X1,X2,X3,T),l(Y1,Y2,Y3,T),l(Z1,Z2,Z3,T),l(X1,Y1,Z1,T),l(X2,Y2,Z2,T),l(X3,Y3,Z3,T). l(A,B,C,T):-T is A+B+C. p:-read_line(S),findall(L,m(S,L),A),length(A,C),findall(L,(member(L,A),a(L)),B),(B=[_|_]->R=true;R=false),writeln((C,R)).

언 골프

% I : 73
% V : 86
% X : 88
:-lib(util).
:-lib(sd).
r(S,R) :- string_list(S,L), g(L,R).
g(L,[N1,N2,N3]):-
    append(L1,X,L),
    append(L2,L3,X),
    n(L1,N1),n(L2,N2),n(L3,N3).
n([73,86],4).
n([73,88],9).
n([73,73,73],3).
n([73,73],2).
n([73],1).
n([86],5).
n([86|N],D):-n(N,E),E<4,D is E+5.
n([88|N],D):-n(N,E), D is E+10.
n([88],10).
m(M,[X1,X2,X3,Y1,Y2,Y3,Z1,Z2,Z3]) :-
    split_string(M,",","",[X,Y,Z]),
    r(X,[X1,X2,X3]),
    r(Y,[Y1,Y2,Y3]),
    r(Z,[Z1,Z2,Z3]).
a(L) :-
    alldifferent(L),
    L=[X1,X2,X3,Y1,Y2,Y3,Z1,Z2,Z3],
    l(X1,X2,X3,T),
    l(Y1,Y2,Y3,T),
    l(Z1,Z2,Z3,T),
    l(X1,Y1,Z1,T),
    l(X2,Y2,Z2,T),
    l(X3,Y3,Z3,T).
l(A,B,C,T):-T is A+B+C.
p :- read_line(S),
     findall(L,m(S,L),A),
     length(A,C),
     findall(L,(member(L,A),a(L)),B),
     (B=[_|_]->R=true;R=false),
     writeln((C,R)).

물론 p다음과 같이 정의 할 수도 있습니다.

p :- read_line(S),
     findall(L,m(S,L),A),
     length(A,C),
     findall(L,(member(L,A),a(L)),B),
     writeln(C),
     B=[_|_].

이 경우 제곱 수를 쓴 후 환경에 '예'또는 '아니요'라고 표시됩니다.

이클립스 사용하기 .

[eclipse 105]: p.
 VIIIIVI,IIIVVII,IVIXII
24, true

[eclipse 106]: p.
 IIIXVIII,IVIII,VIIII
210, false

두 번째 결과의 예제는 여기붙여 넣습니다 .


2

파이썬, 442 자

R=range
L=len
S=sum
N={}
for i in R(40):
 r="";j=i
 while j>9:r+="X";j-=10
 if j>8:r+="IX";j-=9
 if j>4:r+="V";j-=5
 if j>3:r+="IV";j-=4
 N[r+"III"[:j]]=i
a,b,c=map(lambda x:sum([[Z]*all(Z)for i in R(L(x))for j in R(L(x))for Z in[map(N.get,(x[:i],x[i:j],x[j:]))]],[]),raw_input().split(","))
print L(a)*L(b)*L(c),any(S(x)==S(y)==S(z)==S(q[::3])==S(q[1::3])==S(q[2::3])==S(q[::4])==S(q[2:-1:2])for x in a for y in b for z in c for q in[x+y+z])

코드는 먼저 N로마 숫자 문자열에서 필요한 모든 숫자에 대한 값으로 매핑됩니다. 가능한 모든 방법으로 각 라인을 3 개로 분할하고 결과 트리플 중 어느 것이에 매핑되어 있는지 확인합니다 N. 결승 any은 어떤 조합이 마법의 광장인지 확인합니다.


2

하스켈, 451 429 423 바이트

import Data.List
(#)=splitAt
(%)=map
w=length
r"X"=10
r('X':a)=10+r a
r a=case elemIndex a["I","II","III","IV","V","VI","VII","VIII","IX"]of Just i->i+1;_->0
s l=[r%[a,b,c]|x<-[2..w l],y<-[1..x],let(d,c)=x#l;(a,b)=y#d,r a*r b*r c>0]
e[a,b,c]=a==b&&a==c
p[l,m,n]=[1|a<-l,b<-m,c<-n,e$sum%[a,b,c],e$sum%(transpose[a,b,c])]
f i=(show$product$w%(s%i))++","++(show$0<(w$p$s%i))
q ','='\n'
q a=a
i=getLine>>=putStrLn.f.lines.map q

용법:

*Main> i                           -- repl prompt, call i
VIIIIVI,IIIVVII,IVIXII             -- input via STDIN    
24,True                            -- output
*Main> i
IIIXVIII,IVIII,VIIII
210,False

입력 및 출력 형식을 올바르게 얻기 위해 약 70 바이트.

이 함수 r는 로마 숫자 (문자열로 제공됨)를 정수로 변환합니다 (유효한 로마 숫자 0가 아닌 경우 반환 됨). s로마 숫자 문자열을 3 개의 하위 문자열로 나누고 유효한 로마 숫자로 해당 트리플을 유지 한 다음 r정수 를 통해 변환합니다 . e세 요소 목록의 모든 정수가 같은지 확인합니다. p로만 자릿수의 세 문자열을 가져 와서 s정수 목록으로 나누고 , 각 목록의 정수 하나를 트리플로 결합하고 모든 방향으로 같은 합을 가진 것을 유지합니다. f유효한 행렬 수를 계산하고 p빈 목록 (유효한 솔루션 없음)을 반환 하는지 (유효한 솔루션이 있는지) 확인합니다. 기본 함수 i는 STDIN에서 입력을 읽고이를 문자열 목록으로 변환합니다 (q대체하여 도움 ,과 함께 \n)를 호출합니다 p.


1

R, 489 474 464

이것은 내가 원했던 것보다 훨씬 더 커졌지 만 골프를 조금 할 수있을 것 같습니다.

가능한 모든 로마 숫자 조합과 해당 숫자를 계산하여 무차별 대입법을 사용합니다.

완료되면 입력을 로마 숫자 목록과 비교하고 가능한 숫자를 얻습니다.

거기에서 각 숫자 행렬을 통과하고 마법의 정사각형을 테스트하여 결과를 출력합니다.

s=strsplit;e=expand.grid;P=paste0;d=do.call;i=readline();i=s(i,',');n=1:39;r=c(t(outer(c('','X','XX','XXX'),c('I','II','III','IV','V','VI','VII','VIII','IX','X'),P)))[n];p=d(P,e(r,r,r));n=d(paste,e(n,n,n));m=lapply(i[[1]],function(x)which(p==x));C=e(s(n[m[[1]]],' '),s(n[m[[2]]],' '),s(n[m[[3]]],' '));E=F;N=nrow(C);for(n in 1:N){T=matrix(strtoi(unlist(C[n,])),nr=3);E=E||length(unique(c(rowSums(T),colSums(T),sum(diag(T)),sum(diag(T[3:1,])))))==1};P(N,',',any(E))

시운전. RGui에 붙여 넣은 입력을 기다립니다.

> e=expand.grid;l=length;s=strsplit;P=paste0;i=readline();i=s(i,',');n=1:39;r=c(t(outer(c('','X','XX','XXX'),c('I','II','III','IV','V','VI','VII','VIII','IX','X'),P)))[-40];p=do.call(P,e(r,r,r));n=do.call(paste,e(n,n,n));m=lapply(i[[1]],function(x)which(p==x));C=e(s(n[m[[1]]],' '),s(n[m[[2]]],' '),s(n[m[[3]]],' '));E=c();N=nrow(C);for(n in 1:N){T=matrix(as.integer(unlist(C[n,])),nr=3);E=c(E,length(unique(c(rowSums(T),colSums(T),sum(diag(T)),sum(diag(T[3:1,])))))==1)};paste(N,',',any(E))
VIIIIVI,IIIVVII,IVIXII
[1] "24 , TRUE"
> e=expand.grid;l=length;s=strsplit;P=paste0;i=readline();i=s(i,',');n=1:39;r=c(t(outer(c('','X','XX','XXX'),c('I','II','III','IV','V','VI','VII','VIII','IX','X'),P)))[-40];p=do.call(P,e(r,r,r));n=do.call(paste,e(n,n,n));m=lapply(i[[1]],function(x)which(p==x));C=e(s(n[m[[1]]],' '),s(n[m[[2]]],' '),s(n[m[[3]]],' '));E=c();N=nrow(C);for(n in 1:N){T=matrix(as.integer(unlist(C[n,])),nr=3);E=c(E,length(unique(c(rowSums(T),colSums(T),sum(diag(T)),sum(diag(T[3:1,])))))==1)};paste(N,',',any(E))
IIIXVIII,IVIII,VIIII
[1] "210 , FALSE"
>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.