สแควร์เลขโรมันที่ไม่ชัดเจน


10

ราชาแห่งกรุงโรมโบราณกำลังมีปัญหาในการพิจารณาว่าตารางเวทย์มนตร์นั้นถูกต้องหรือไม่เพราะจตุรัสเวทย์มนตร์ที่เขาตรวจสอบนั้นไม่มีตัวแยกใด ๆ ระหว่างตัวเลข เขาได้ว่าจ้างวิศวกรซอฟต์แวร์เพื่อช่วยตรวจสอบว่าตารางเวทมนต์นั้นถูกต้องหรือไม่

ป้อนคำอธิบาย

อินพุตเข้ามาใน STDIN หรืออาร์กิวเมนต์บรรทัดคำสั่ง คุณไม่สามารถป้อนค่าเริ่มต้นล่วงหน้าในตัวแปรได้ (เช่น "โปรแกรมนี้คาดว่าอินพุตจะอยู่ในตัวแปรx") อินพุตอยู่ในรูปแบบต่อไปนี้:

<top>,<middle>,<bottom>

แต่ละ<top>, <middle>และ<bottom>เป็นสตริงที่จะเท่านั้นที่เคยมีตัวอักษรพิมพ์ใหญ่I, และV Xมันจะไม่มีช่องว่างหรือตัวละครอื่น ๆ แต่ละสตริงแสดงตัวเลขโรมันสามตัวดังนั้นจึงเป็นเมทริกซ์ขนาด 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ค่าถ้าใด ๆของ matrixes 3x3 ที่ไม่ซ้ำกันในรูปแบบตารางมายากลหรือ:
  • falsyค่าถ้าไม่มีของ matrixes 3x3 ที่ไม่ซ้ำกันในรูปแบบตารางมายากล

ค่าความจริงและเท็จจะต้องสอดคล้องกัน พวกเขาคั่นด้วยเครื่องหมายจุลภาค

ต้องการคำอธิบายบางอย่างเกี่ยวกับสิ่งที่นับว่าไม่เหมือนใคร ตราบใดที่เมทริกซ์ไม่ได้มีตัวเลขเท่ากันในตำแหน่งเดียวกันกับเมทริกซ์ที่พบก่อนหน้านี้มันจะนับว่าเป็นค่าที่ไม่ซ้ำ ซึ่งหมายความว่าการสะท้อนแสง ฯลฯ ของเมทริกซ์ที่พบก่อนหน้านี้จะนับว่าไม่เหมือนใคร

ตัวอย่างอินพุตและเอาต์พุต

ในตัวอย่างเหล่านี้ฉันใช้trueเป็นค่าความจริงของฉันและfalseเป็นค่าเท็จของฉัน

อินพุต: VIIIIVI,IIIVVII,IVIXII เอาต์พุต: 24,true (สามเหลี่ยมมายากลคือ 8-1-6, 3-5-7, 4-9-2)

อินพุต: IIIXVIII,IVIII,VIIII เอาต์พุต:210,false

พิเศษ

  • คุณไม่ได้รับอนุญาตให้ใช้ฟังก์ชันการแปลงตัวเลขโรมัน inbuilt หากภาษาที่คุณเลือกมีหนึ่ง

"ราชาแห่งกรุงโรมโบราณ" ... Emperor?
Digital Trauma

8
@DigitalTrauma มันตั้งอยู่ในจักรวาลสำรองที่กรุงโรมโบราณมีราชาสี่เหลี่ยมมายากลและวิศวกรซอฟต์แวร์ หรืออะไรทำนองนั้น ...
absinthe

นอกจากนี้คุณควรใช้เครื่องหมาย (·) แทนเครื่องหมายจุลภาค ( en.wikipedia.org/wiki/Interpunct#Latin )
coredump

ฉันมี "24, true" สำหรับตัวอย่างแรก แต่ "210, false" สำหรับตัวอย่างที่สอง ฉันจะตรวจสอบ
coredump

1
@DigitalTrauma Rome มีราชาจนกระทั่งประมาณ 509BC
Jon B

คำตอบ:


4

Perl, 219 237

เพิ่มตัวแบ่งบรรทัดเพื่อความชัดเจน

#!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)).

Ungolfed

% 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

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"
>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.