অস্পষ্ট রোমান সংখ্যার যাদু স্কোয়ার


10

প্রাচীন রোমের রাজা কোনও যাদু চৌকোটি বৈধ কিনা তা নির্ধারণ করতে অসুবিধা হচ্ছে, কারণ তিনি যে যাদুঘরের স্কোয়ারটি পরীক্ষা করছেন তা সংখ্যার মধ্যে কোনও বিভাজনকারীকে অন্তর্ভুক্ত করে না। ম্যাজিক স্কোয়ারটি বৈধ কিনা তা নির্ধারণে সহায়তা করার জন্য তিনি একটি সফটওয়্যার ইঞ্জিনিয়ার নিয়োগ করেছেন।

ইনপুট বিবরণ

এসটিডিইএন বা কমান্ড লাইন আর্গুমেন্টে ইনপুট আসে। আপনার কোনও চলকটিতে প্রাক-আরম্ভিত ইনপুট থাকতে পারে না (যেমন "এই প্রোগ্রামটি একটি ভেরিয়েবলের ইনপুটটি প্রত্যাশা করে 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) এর মতো ক্রমগুলিও সম্ভব নয় not

আউটপুট বিবরণ

আউটপুট:

  • একটি পূর্ণসংখ্যা A, যেখানেA দ্বিপাক্ষিক ইনপুট থেকে তৈরি হওয়া অনন্য 3x3 ম্যাট্রিক্সের সংখ্যা এবং:
  • একজন truthy যদি মান কোন অনন্য 3x3 ম্যাটিক্স সমূহের একটি যাদু বর্গক্ষেত্র গঠন, বা:
  • কোনও অনন্য 3x3 ম্যাট্রিক্স কোনও ম্যাজিক স্কোয়ার তৈরি না করে একটি মিথ্যা মান ।

সত্যবাদী এবং মিথ্যা মানগুলি অবশ্যই সামঞ্জস্যপূর্ণ হতে হবে। তারা কমা দ্বারা পৃথক করা হয়।

যা অনন্য হিসাবে গণ্য করা হয় তার কিছু ব্যাখ্যা প্রয়োজন। যতক্ষণ ম্যাট্রিক্সের পূর্ববর্তী পাওয়া ম্যাট্রিক্সের ঠিক ঠিক একই পজিশনে একই সংখ্যা না থাকে, ততক্ষণ এটি অনন্য হিসাবে গণ্য হবে। এর অর্থ হ'ল আগে পাওয়া ম্যাট্রিক্সগুলির প্রতিচ্ছবি ইত্যাদি অনন্য হিসাবে গণনা করা হয়।

উদাহরণ ইনপুট এবং আউটপুট

এই উদাহরণগুলিতে, আমি trueআমার সত্যবাদী মান হিসাবে এবং ব্যবহার করিfalse

ইনপুট: VIIIIVI,IIIVVII,IVIXII আউটপুট:24,true (যাদু ত্রিভুজ 8-1-6, 3-5-7, 4-9-2।)

ইনপুট: IIIXVIII,IVIII,VIIII আউটপুট:210,false

অতিরিক্ত

  • আপনার নির্বাচিত ভাষার একটি থাকলে ইনবিল্ট রোমান অঙ্কের রূপান্তর ফাংশন ব্যবহার করার অনুমতি নেই।

"প্রাচীন রোমের রাজা" ... সম্রাট?
ডিজিটাল ট্রমা

8
@ ডিজিটালট্রামা এটি একটি বিকল্প মহাবিশ্বে সেট হয়েছে যেখানে প্রাচীন রোমের রাজা, যাদু চৌকো এবং সফটওয়্যার ইঞ্জিনিয়ার ছিল। অথবা এরকম কিছু একটা ...
সোমরস

এছাড়াও, আপনি একটি interpunct (·) একটি কমা (পরিবর্তে ব্যবহার করা উচিত en.wikipedia.org/wiki/Interpunct#Latin )
coredump

আমি প্রথমটির জন্য "24, সত্য", তবে দ্বিতীয় উদাহরণের জন্য "210, মিথ্যা" " আমি তদন্ত করব।
coredump

1
@ ডিজিটাল ট্রুমা রোমে প্রায় 509 বিবিসি অবধি রাজা ছিল।
জন বি

উত্তর:


4

পার্ল, 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

পাইথন, 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

হাস্কেল, 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এসটিডিআইএন থেকে ইনপুট পড়ে, স্ট্রিংগুলির তালিকায় রূপান্তর করে (qপ্রতিস্থাপন করতে সাহায্য করে ,সঙ্গে \nকল) এবং p


1

আর, 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))

টেস্ট রান। এটি একবার আরজিইতে আটকানো ইনপুটটির জন্য অপেক্ষা করে।

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