Roman昧的罗马数字魔方


10

古罗马国王在确定魔方是否有效时遇到困难,因为他正在检查的魔方在数字之间不包含任何分隔符。他聘请了一名软件工程师来帮助他确定魔术方块是否有效。

输入说明

输入来自STDIN或命令行参数。您不能在变量中预先初始化输入(例如,“此程序需要在变量中输入x”)。输入采用以下格式:

<top>,<middle>,<bottom>

每个的<top><middle>以及<bottom>是只会包含大写字符的字符串IVX。它将不包含空格或任何其他字符。每个字符串代表三个罗马数字,从而形成一个3x3的数字矩阵。但是,这些罗马数字可能(但不一定)是不明确的。请允许我用一个例子来说明。考虑以下三个罗马数字示例行,每个数字之间没有空格:

IVIIIIX

因为字母之间没有空格,所以这里的数字有两个可能:

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

当您认为矩阵的所有三行都可能模棱两可时,单个输入就有可能存在许多不同的3x3矩阵。

请注意,诸如1、7、1、9(I VII I IX)之类的序列是不可能的,因为每一行将始终代表三个罗马数字。另请注意,罗马数字必须有效,因此,诸如1、7、8(I VII IIX)之类的序列也是不可能的。

输出说明

输出:

  • 一个整数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

附加功能

  • 如果您选择的语言具有内置罗马数字转换功能,则不允许使用该功能。

“古罗马之王” ……皇帝?
Digital Trauma'3

8
@DigitalTrauma它被设置在一个替代的宇宙中,古罗马有一个国王,魔方和软件工程师。还是类似的东西……
苦艾酒

此外,你应该使用一个间隔号(·)而不是逗号(en.wikipedia.org/wiki/Interpunct#Latin
核心转储

我的第一个示例为“ 24,true”,而第二个示例为“ 210,false”。我会调查
coredump

1
@DigitalTrauma罗马直到509BC才有了国王。
Jon B

Answers:


4

Perl,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

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

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

第二个示例结果粘贴在此处


2

Python,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,这是从罗马数字字符串到我们可能需要的所有可能数字的值的映射。以各种可能的方式将每行分成三部分,并检查产生的三元组中的哪一个都具有映射N。决赛any看是否有任何组合是魔方。


2

Haskell中,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"
>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.