টি-এসকিউএল, 1974 - 50 = 1924 বাইট
আমি জানি যে এসকিউএল-এ গল্ফ করা বালি বেদী ছাড়া আর কিছুই না করে 18 টি গর্ত খেলার সমতুল্য, তবে আমি এইটির চ্যালেঞ্জকে সরিয়ে দিয়েছি এবং আমি মনে করি যে আমি পদ্ধতিগতভাবে কয়েকটি আকর্ষণীয় কাজ করতে পেরেছি।
এটি ইনপুট এবং আউটপুট উভয়ের জন্য ভিনকুলামকে সমর্থন করে। আমি এটি উপস্থাপনের জন্য ট্রিলিং টিলড ব্যবহারের কনভেনশন গ্রহণ করেছি, সুতরাং ভি 5000 5000, এক্স 100 10000 ইত্যাদি etc. এটি স্ট্যান্ডার্ড আধুনিক রোমান অঙ্কের ব্যবহার অনুসারে 399,999 অবধি আউটপুটগুলিও পরিচালনা করতে হবে। এর পরে, এটি আইএনটির সমর্থিত পরিসীমাটিতে যে কোনও কিছুর আংশিক অ-মানক রোমান এনকোডিং করবে।
কারণ এটি সমস্ত সংখ্যার গণিত, কোনও অ-পূর্ণসংখ্যার ফলাফলগুলি স্পষ্টতই বৃত্তাকারে হয়।
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
আমি এখনও WHIP লুপিংয়ের কিছু প্রতিস্থাপনের জন্য একটি সেট-ভিত্তিক সমাধানের সাথে ঝাঁকুনি দিচ্ছি যা বাইট গণনাটি হিট করতে পারে এবং idiomatic SQL এর আরও মার্জিত উদাহরণ হতে পারে। টেবিল এলিয়াসের ব্যবহার কম করে সর্বনিম্ন হ্রাস করে কিছু বাইটও অর্জন করতে হবে। তবে এটি মূলত এই ভাষায় বিজয়ী না হওয়ায় আমার ডন কুইক্সোটের পোশাকটি প্রদর্শন করতে আমি বেশিরভাগই এখানে আছি। :)
শীর্ষে @i নির্বাচন করুন ইনপুটটি পুনরাবৃত্তি করে:
I+V*IV+IX*MXLVII+X~C~DCCVI
এবং নির্বাচন শেষে ফিরে আসে:
SELECT (((((1+5)*4)+9)*1047)+90706) = 125257 = C~X~X~V~CCLVII
এবং আপনি নিজেই এই এসকিউএলফিডেলে এটি পরীক্ষা করতে পারেন
এবং আমি এটি কীভাবে কাজ করে তাতে কিছু মন্তব্য যুক্ত করতে ফিরে যাব, কেননা আপনি যদি শিক্ষাগত মূল্যবোধের জন্য এটি ব্যবহার না করে থাকেন তবে কেন স্পষ্টতই উত্তরটি পোস্ট করবেন?