टी-एसक्यूएल, 1974 - 50 = 1924 बाइट्स
मुझे पता है कि एसक्यूएल में गोल्फिंग एक रेत की कील के साथ 18 छेदों के साथ खेलने के बराबर है, लेकिन मैंने इस एक की चुनौती को दोहराया और मुझे लगता है कि मैं कुछ दिलचस्प तरीके से करने में कामयाब रहा।
यह इनपुट और आउटपुट दोनों के लिए विनकुलम का समर्थन करता है। मैंने इसका प्रतिनिधित्व करने के लिए एक अनुगामी टिल्ड का उपयोग करने के सम्मेलन को अपनाया, इसलिए 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
मैं अभी भी सेट-आधारित समाधान के साथ छेड़छाड़ कर रहा हूं, जिसमें से कुछ लूपिंग को बदलने के लिए है जो बाइट की संख्या को कम कर सकते हैं और मुहावरेदार एसक्यूएल का एक अधिक सुरुचिपूर्ण उदाहरण हो सकते हैं। वहाँ भी कुछ बाइट्स प्राप्त करने के लिए एक न्यूनतम करने के लिए टेबल उपनाम का उपयोग कम किया जा सकता है। लेकिन जैसा कि यह अनिवार्य रूप से इस भाषा में अप्राप्य है, मैं ज्यादातर अपने डॉन क्विक्सोट संगठन को दिखाने के लिए यहां हूं। :)
शीर्ष पर @i का चयन करें इनपुट दोहराता है:
I+V*IV+IX*MXLVII+X~C~DCCVI
और अंतिम रिटर्न पर चयन करें:
SELECT (((((1+5)*4)+9)*1047)+90706) = 125257 = C~X~X~V~CCLVII
और आप इसे इस SQLFiddle पर खुद का परीक्षण कर सकते हैं
और मैं यह कैसे काम करता है पर कुछ टिप्पणी जोड़ने के लिए वापस आ जाएगा, क्योंकि यदि आप शैक्षिक मूल्य पर इसका फायदा उठाने के लिए नहीं जा रहे हैं तो स्पष्ट रूप से खोने का जवाब क्यों दें?