Belirsiz Romen Rakamıyla Sihirli Kareler


10

Antik Roma Kralı, sihirli bir karenin geçerli olup olmadığını belirlemekte zorluk çekiyor, çünkü kontrol ettiği sihirli kare sayılar arasında herhangi bir ayırıcı içermiyor. Sihirli bir karenin geçerli olup olmadığını belirlemesine yardımcı olması için bir yazılım mühendisi tuttu.

Giriş Açıklaması

Giriş STDIN veya komut satırı argümanlarında gelir. Girişin bir değişkende önceden başlatılmasını sağlayamazsınız (örn. "Bu program bir değişkende girişi bekler x"). Girdi şu biçimde:

<top>,<middle>,<bottom>

Her <top>, <middle>ve <bottom>sadece hiç küçük karakterlere içerecek bir dizedir I, Vve X. Boşluk veya başka karakterler içermez. Her dize üç Romen rakamını temsil eder, böylece 3x3'lük bir sayı matrisi elde edilir. Bununla birlikte, bu Romen rakamları (ancak zorunlu olarak değil) belirsiz olabilir . Bunu bir örnekle açıklamama izin verin. Her sayı arasında boşluk olmadan üç Romen rakamından oluşan aşağıdaki örnek satırı göz önünde bulundurun:

IVIIIIX

Harfler arasında boşluk olmadığından, buradaki rakamlarda iki olasılık vardır:

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

Matrisin her üç satırının da amaca uygun olabileceğini düşündüğünüzde, tek bir girişten çok sayıda farklı 3x3 matris olma potansiyeli vardır.

1, 7, 1, 9 ( I VII I IX) gibi dizilerin mümkün olmadığını unutmayın, çünkü her satır her zaman üç Romen rakamını temsil edecektir. Ayrıca Romen rakamlarının geçerli olması gerektiğine dikkat edin, bu nedenle 1, 7, 8 ( I VII IIX) gibi diziler de mümkün değildir.

Çıktı Açıklaması

Çıktı:

  • Tamsayı A; burada A, ambiyatif girdiden oluşturulabilecek benzersiz 3x3 matris sayısı ve:
  • Bir truthy değeri ise herhangi eşsiz 3x3 matrislerin sihirli kare oluşturacak veya:
  • Bir falsy değer eğer hiçbiri eşsiz 3x3 matrislerin sihirli kare oluştururlar.

Doğruluk ve yanlış değerler tutarlı olmalıdır. Virgülle ayrılırlar.

Benzersiz sayılanlar hakkında bazı açıklamalar yapılması gerekir. Bir matris, daha önce bulunan bir matrisle tam olarak aynı pozisyonlarda tam olarak aynı sayılara sahip olmadığı sürece, benzersiz olarak sayılır. Bu, daha önce bulunan matrislerin yansımalarının vb. Benzersiz olarak sayıldığı anlamına gelir.

Örnek Girişler ve Çıkışlar

Bu örneklerde doğru truedeğerim ve falseyanlış değerim olarak kullanıyorum.

Giriş: VIIIIVI,IIIVVII,IVIXII Çıkış: 24,true (Sihirli üçgen 8-1-6, 3-5-7, 4-9-2'dir.)

Giriş: IIIXVIII,IVIII,VIIII Çıkış:210,false

Ekstralar

  • Seçtiğiniz dilde varsa dahili Romen Rakamı dönüştürme işlevlerini kullanamazsınız.

"Antik Roma Kralı" ... İmparator mu?
Dijital Travma

8
@DigitalTrauma Antik Roma'nın bir kralı, sihirli kareleri ve yazılım mühendislerinin bulunduğu alternatif bir evrende geçiyor. Veya bunun gibi bir şey ...
Abs

Ayrıca, virgül yerine bir interpunct (·) kullanmalısınız ( en.wikipedia.org/wiki/Interpunct#Latin )
coredump

İlk örnek için "24, true", ikinci örnek için "210, false" var. Ben araştıracağım.
coredump

1
@DigitalTrauma Roma, yaklaşık 509 yılına kadar krallara sahipti.
Jon B

Yanıtlar:


4

Perl, 219 237

Netlik için satır sonları eklendi.

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

Test et beni .


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

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

Elbette pşu şekilde de tanımlanabilir:

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

Bu durumda, ortam, kare sayısını yazdıktan sonra 'Evet' veya 'Hayır' diyecektir.

Misal

Tutulmayı kullanma .

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

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

İkincisi için örnek sonuçlar buraya yapıştırılır .


2

Python, 442 karakter

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

Kod önce Nromen rakamı dizesinden ihtiyacımız olan tüm olası sayılar için değerine bir eşleme olan oluşturur . Her satırı mümkün olan her şekilde üçe böler ve sonuçta ortaya çıkan üçlünün hepsinde eşleme olup olmadığını kontrol eder N. Final any, herhangi bir kombinasyonun sihirli bir kare olup olmadığını görür.


2

Haskell'in 451 429 423 bayt

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

Kullanımı:

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

Giriş ve çıkış formatını doğru elde etmek için yaklaşık 70 bayt.

İşlev r, bir roman numarasını (dize olarak verilir) bir tamsayıya dönüştürür (geçerli bir roman numarası 0döndürülmezse). sbir dizi roman rakamı 3 alt dizeye böler ve bu üçlüyü geçerli roman numaraları ile tutar ve bunları rtamsayılara dönüştürür . eüç eleman listesinin tüm tam sayılarının eşit olup olmadığını kontrol eder. pRoma basamaklı üç dizge alır, bunları stamsayılar listesine böler , her listenin bir tamsayısını üçe birleştirir ve her yöne eşit toplamları tutar. fgeçerli matris sayısını hesaplar ve pboş listeyi (geçerli çözüm yok) döndürüp döndürmediğini (geçerli çözüm olduğunu) kontrol eder. Ana işlev i, girişi STDIN'den okur, dizeler listesine dönüştürür (q,ile değiştirerek yardımcı olur \n) p.


1

R, 489 474 464

Bu istediğimden çok daha büyüktü, ama sanırım biraz golf oynayabilirim.

Olası tüm Romen Rakamları kombinasyonlarını ve karşılık gelen rakamlarını hesaplayarak kaba kuvvet yöntemi kullanır.

Bu yapıldığında, girişi Romen Rakamları listesiyle karşılaştırır ve olası rakamları alır.

Oradan her sayı matrisinden geçer ve sihirli kareyi test eder, sonunda sonucu çıkarır.

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

Test sürüşü. RGui'ye yapıştırıldıktan sonra girişi bekler.

> 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"
>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.