Неоднозначні римські чисельні магічні квадрати


10

У короля Стародавнього Риму виникають труднощі визначити, чи є магічний квадрат дійсним чи ні, оскільки магічний квадрат, який він перевіряє, не містить роздільників між числами. Він найняв інженера-програмного забезпечення, який допоможе йому визначити, чи є магічний квадрат дійсним чи ні.

Опис вводу

Введення надходить на аргументи STDIN або аргумент командного рядка. Ви не можете мати вхід попередньо ініціалізований у змінній (наприклад, "ця програма очікує введення змінної x"). Введіть у такому форматі:

<top>,<middle>,<bottom>

Кожен з <top>, <middle>і <bottom>це рядок , яка буде завжди містити тільки символи в верхньому регістрі I, Vі X. Він не буде містити пробілів або будь-яких інших символів. Кожен рядок представляє три римські цифри, внаслідок чого утворюється матриця чисел 3х3. Однак ці римські цифри можуть бути (але не обов'язково) неоднозначними . Дозвольте мені проілюструвати це прикладом. Розглянемо наступний приклад ряд із трьох римських цифр без пробілів між кожним числом:

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 значення , якщо якийсь - або з унікальних 3x3 матриць утворюють магічний квадрат, або:
  • Falsy значення , якщо жоден з унікальних 3x3 матриць не утворюють магічний квадрат.

Ціннісні і хибні значення повинні відповідати. Вони відокремлені комою.

Потрібно певне пояснення щодо того, що вважається унікальним. Поки матриця не має абсолютно однакових чисел у абсолютно тих же позиціях, що і раніше знайдена матриця, вона вважається унікальною. Це означає, що відображення тощо знайдених раніше матриць вважаються унікальними.

Приклад Входи та Виходи

У цих прикладах я використовую trueяк свою правдиву цінність і falseяк свою хибну цінність.

Вхід: VIIIIVI,IIIVVII,IVIXII Вихід: 24,true (Чарівний трикутник 8-1-6, 3-5-7, 4-9-2.)

Вхід: IIIXVIII,IVIII,VIIII Вихід:210,false

Екстри

  • Вам заборонено використовувати вбудовані функції перетворення римських чисел, якщо вибрана мова є такою.

"цар Стародавнього Риму" ... Імператор?
Цифрова травма

8
@DigitalTrauma Він встановлений у альтернативному всесвіті, де в Стародавньому Римі був цар, магічні квадрати та інженери-программісти. Або щось подібне ...
абсент

Також слід використовувати інтерпункт (·) замість коми ( en.wikipedia.org/wiki/Interpunct#Latin )
coredump

У мене є "24, правда" для першого, але "210, помилково" для другого прикладу. Я буду розслідувати.
coredump

1
@DigitalTrauma Рим мав царів приблизно до 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)).

Безумовно

% 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

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"
>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.