Hình vuông ma thuật số La Mã mơ hồ


10

Vị vua của La Mã cổ đại đang gặp khó khăn trong việc xác định xem một hình vuông ma thuật có hợp lệ hay không, bởi vì hình vuông ma thuật mà anh ta đang kiểm tra không bao gồm bất kỳ dấu phân cách nào giữa các con số. Anh ta đã thuê một kỹ sư phần mềm để giúp anh ta xác định xem một hình vuông ma thuật có hợp lệ hay không.

Mô tả đầu vào

Đầu vào xuất hiện trên STDIN hoặc đối số dòng lệnh. Bạn không thể có đầu vào được khởi tạo trước trong một biến (ví dụ: "chương trình này mong đợi đầu vào trong một biến x"). Đầu vào có định dạng sau:

<top>,<middle>,<bottom>

Mỗi <top>, <middle><bottom>là một chuỗi chỉ bao giờ sẽ chứa các ký tự chữ hoa I, VX. Nó sẽ không chứa khoảng trắng hoặc bất kỳ ký tự nào khác. Mỗi chuỗi đại diện cho ba chữ số La Mã, do đó dẫn đến một ma trận số 3x3. Tuy nhiên, những chữ số La Mã này có thể (nhưng không nhất thiết) là mơ hồ . Cho phép tôi minh họa điều này với một ví dụ. Hãy xem xét hàng ví dụ sau gồm ba chữ số La Mã, không có khoảng trắng giữa mỗi số:

IVIIIIX

Bởi vì không có khoảng trắng giữa các chữ cái, có hai khả năng cho các số ở đây:

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

Khi bạn cho rằng cả ba hàng của ma trận đều có thể không rõ ràng, có khả năng sẽ có nhiều ma trận 3x3 khác nhau từ một đầu vào.

Lưu ý rằng các chuỗi như 1, 7, 1, 9 ( I VII I IX) là không thể vì mỗi hàng sẽ luôn đại diện cho ba chữ số La Mã. Cũng lưu ý rằng các chữ số La Mã phải hợp lệ, do đó các chuỗi như 1, 7, 8 ( I VII IIX) cũng không thể thực hiện được.

Mô tả đầu ra

Đầu ra:

  • Một số nguyên A, trong đó Asố lượng ma trận 3x3 duy nhất có thể được hình thành từ đầu vào không rõ ràng và:
  • Một truthy giá trị nếu bất kỳ của các ma trận 3x3 độc đáo tạo thành một hình vuông ma thuật, hoặc:
  • Một falsy giá trị nếu không có các ma trận 3x3 độc đáo tạo thành một hình vuông ma thuật.

Các giá trị trung thực và giả mạo phải nhất quán. Chúng được phân tách bằng dấu phẩy.

Một số giải thích được yêu cầu về những gì được tính là duy nhất. Miễn là một ma trận không có chính xác các số giống nhau ở các vị trí chính xác giống như ma trận được tìm thấy trước đó, thì nó được tính là duy nhất. Điều này có nghĩa là các phản xạ, vv của các ma trận được tìm thấy trước đây được tính là duy nhất.

Ví dụ đầu vào và đầu ra

Trong các ví dụ này, tôi sử dụng truelàm giá trị trung thực và giá trị giả falsecủa mình.

Đầu vào: VIIIIVI,IIIVVII,IVIXII Đầu ra: 24,true (Tam giác ma thuật là 8-1-6, 3-5-7, 4-9-2.)

Đầu vào: IIIXVIII,IVIII,VIIII Đầu ra:210,false

Ngoài ra

  • Bạn không được phép sử dụng các hàm chuyển đổi Số La Mã sẵn có nếu ngôn ngữ bạn chọn có ngôn ngữ.

"Vua của La Mã cổ đại" ... Hoàng đế?
Chấn thương kỹ thuật số

8
@DigitalTrauma Nó được đặt trong một vũ trụ thay thế nơi La Mã cổ đại có một vị vua, hình vuông ma thuật và kỹ sư phần mềm. Hoặc một cái gì đó tương tự ...
absinthe

Ngoài ra, bạn nên sử dụng một dấu chấm câu (·) thay vì dấu phẩy ( en.wikipedia.org/wiki/Interpunc#Latin )
coredump

Tôi có "24, đúng" cho ví dụ thứ nhất, nhưng "210, sai" cho ví dụ thứ hai. Tôi sẽ điều tra.
coredump

1
@DigitalTrauma Rome có các vị vua cho đến khoảng 509BC.
Jon B

Câu trả lời:


4

Perl, 219 237

Ngắt dòng thêm cho rõ ràng.

#!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"

Kiểm tra tôi .


4

Prolog - 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)).

Ung dung

% 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)).

Tất nhiên, pcũng có thể được định nghĩa là:

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

Trong trường hợp đó, môi trường sẽ nói 'Có' hoặc 'Không' sau khi viết số ô vuông.

Thí dụ

Sử dụng nhật thực .

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

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

Kết quả ví dụ cho cái thứ hai được dán ở đây .


2

Python, ký tự 438

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])

Mã đầu tiên xây dựng Nmột ánh xạ từ chuỗi số La Mã đến giá trị của nó cho tất cả các số có thể chúng ta có thể cần. Chia mỗi dòng thành ba theo mọi cách có thể và kiểm tra xem bộ ba kết quả nào có ánh xạ N. Cuối cùng anythấy nếu bất kỳ sự kết hợp là một hình vuông ma thuật.


2

Haskell, 451 429 423 byte

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

Sử dụng:

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

Khoảng 70 byte chỉ để có được định dạng đầu vào và đầu ra đúng.

Hàm rchuyển đổi một số La Mã (được cung cấp dưới dạng một chuỗi) thành một số nguyên (nếu đó không phải là số La Mã hợp lệ 0được trả về). schia một chuỗi các chữ số La Mã thành 3 chuỗi con và giữ các bộ ba đó với các số La Mã hợp lệ và chuyển đổi chúng qua rcác số nguyên. ekiểm tra xem tất cả các số nguyên của danh sách ba phần tử có bằng nhau không. plấy ba chuỗi chữ số La Mã, chia chúng sthành các danh sách số nguyên, kết hợp một số nguyên của mỗi danh sách thành bộ ba và giữ cho các số có tổng bằng nhau theo mọi hướng. ftính toán số lượng ma trận hợp lệ và kiểm tra nếu ptrả về danh sách trống (không có giải pháp hợp lệ) hay không (tồn tại giải pháp hợp lệ). Hàm chính iđọc đầu vào từ STDIN, chuyển đổi nó thành một danh sách các chuỗi (qgiúp bằng cách thay thế ,bằng \n) và các cuộc gọi p.


1

R, 489 474 464

Điều này đã lớn hơn nhiều so với tôi muốn, nhưng tôi nghi ngờ tôi có thể đánh nó xuống một chút.

Nó sử dụng một phương pháp vũ phu, bằng cách tính toán tất cả các kết hợp Số La Mã có thể và các chữ số tương ứng của chúng.

Khi đã xong, nó so sánh đầu vào với danh sách Số La Mã và lấy các chữ số có thể.

Từ đó, nó đi qua từng ma trận số và kiểm tra hình vuông ma thuật, cuối cùng xuất ra kết quả.

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))

Chạy thử nghiệm. Nó chờ đợi đầu vào một khi được dán vào 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"
>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.