T-SQL, 1974 년-50 = 1924 바이트
SQL에서 골프를 타는 것은 모래 쐐기만으로 18 홀을하는 것과 동등하다는 것을 알고 있습니다.
이것은 입력과 출력 모두에 대한 vinculum을 지원합니다. 나는 그것을 표시하기 위해 후행 물결표를 사용하는 규칙을 채택 했으므로 V ~ 5000, X ~ 10000 등입니다. 또한 표준 현대 로마 숫자 사용법에 따라 최대 399,999의 출력을 처리해야합니다. 그 후, 그것은 INT의 지원되는 범위에있는 부분의 비표준 로마 인코딩을 부분적으로 수행합니다.
모두 정수 수학이므로 정수가 아닌 결과는 내재적으로 반올림됩니다.
DECLARE @i VARCHAR(MAX)
SET @i='I+V*IV+IX*MXLVII+X~C~DCCVI'
SELECT @i
DECLARE @t TABLE(i INT IDENTITY,n VARCHAR(4),v INT)
DECLARE @u TABLE(n VARCHAR(50),v INT)
DECLARE @o TABLE(n INT IDENTITY,v CHAR(1))
DECLARE @r TABLE(n INT IDENTITY,v INT,r VARCHAR(MAX))
DECLARE @s TABLE(v INT,s VARCHAR(MAX))
DECLARE @p INT,@x VARCHAR(4000)='SELECT ',@j INT=1,@m INT,@y INT,@z VARCHAR(2),@q VARCHAR(50)='+-/*~]%'
INSERT @t(n,v) VALUES('i',1),('iv',4),('v',5),('ix',9),('x',10),('xl',50),('l',50),('xc',90),('c',100),('cd',400),('d',500),('cm',900),('m',1000),('mv~',4000),('v~',5000),('mx~',9000),('x~',10000),('x~l~',40000),('l~',50000),('x~c~',90000),('c~',100000)
INSERT @u VALUES('%i[^i'+@q,-2),('%v[^vi'+@q,-10),('%x[^xvi'+@q,-20),('%l[^lxvi'+@q,-100),('%c[^clxvi'+@q,-200),('%d[^dclxvi'+@q,-1000),('%mx~%',-2010),('%x~l~%',-20060),('%x~c~%',-20110)
WHILE PATINDEX('%[+-/*]%', @i)!=0
BEGIN
SET @p=PATINDEX('%[+-/*]%', @i)
INSERT @o(v) SELECT SUBSTRING(@i,@p,1)
INSERT @r(r) SELECT SUBSTRING(@i,1,@p-1)
SET @i=STUFF(@i,1,@p,'')
END
INSERT @r(r) SELECT @i
UPDATE r SET v=COALESCE(q.v,0) FROM @r r LEFT JOIN (SELECT r.r,SUM(u.v)v FROM @u u JOIN @r r ON r.r LIKE u.n GROUP BY r.r)q ON q.r=r.r
UPDATE r SET v=r.v+q.v FROM @r r JOIN (SELECT r.n,r.r,SUM((LEN(r.r)-LEN(REPLACE(r.r,t.n,REPLICATE(' ',LEN(t.n)-1))))*t.v) v FROM @r r JOIN @t t ON CHARINDEX(t.n,r.r) != 0 AND (LEN(t.n)=1 OR (LEN(t.n)=2 AND RIGHT(t.n,1)='~')) GROUP BY r.n,r.r) q ON q.r=r.r AND q.n = r.n
SELECT @m=MAX(n) FROM @o
SELECT @x=@x+REPLICATE('(',@m)+CAST(v AS VARCHAR) FROM @r WHERE n=1
WHILE @j<=@m
BEGIN
SELECT @x=@x+o.v+CAST(r.v AS VARCHAR)+')'
FROM @o o JOIN @r r ON r.n=o.n+1 WHERE o.n=@j
SET @j=@j+1
END
INSERT @s(v,s) EXEC(@x+',''''')
UPDATE @s SET s=s+CAST(v AS VARCHAR(MAX))+' = '
SET @j=21
WHILE @j>0
BEGIN
SELECT @y=v,@z=n FROM @t WHERE i = @j
WHILE @y<=(SELECT v FROM @s)
BEGIN
UPDATE @s SET v=v-@y,s=s+@z
END
SET @j=@j-1
END
SELECT @x+' = '+UPPER(s) FROM @s
바이트 수를 줄일 수 있고 관용적 인 SQL의 더 우아한 예가 될 수있는 WHILE 루핑을 대체하기 위해 세트 기반 솔루션을 계속 사용하고 있습니다. 테이블 별명 사용을 최소한으로 줄이면 얻을 수있는 바이트도 있습니다. 그러나이 언어에서는 본질적으로 이길 수 없기 때문에 나는 주로 돈키호테 의상을 과시하기 위해 여기에 있습니다. :)
상단의 SELECT @i는 입력을 반복합니다.
I+V*IV+IX*MXLVII+X~C~DCCVI
그리고 끝에있는 SELECT는 다음을 반환합니다.
SELECT (((((1+5)*4)+9)*1047)+90706) = 125257 = C~X~X~V~CCLVII
이 SQLFiddle 에서 직접 테스트 할 수 있습니다.
그리고 교육적 가치를 악용하지 않을 경우 왜 대답을 잃어 버리는가?