নিয়ন্ত্রণের বাইরে থাকা রাউন্ডিং ত্রুটি


14

পটভূমি

আপনাকে সম্প্রতি একটি ছোট অ্যাকাউন্টিং ফার্ম দ্বারা ভাড়া দেওয়া হয়েছে। অ্যাকাউন্টিংয়ের জগতটি আপনার কাছে কিছুটা বিদেশী, তাই আপনি সমস্ত পেশাদার নির্দেশিকা অনুসরণ করছেন কিনা তা আপনি নিশ্চিত নন। বিশেষত, আপনি কখনই জানেন না যে আপনার কখন এই সমস্ত সংখ্যাটি গোল করা উচিত, এবং কোন দিকে, তাই বেশিরভাগ সময় আপনি কেবল এটির ডানা বেঁধে রাখেন এবং সেরাটির জন্য আশা করেন।

ইনপুট

আপনার ইনপুটটি একটি একক স্ট্রিং যা একটি সাধারণ গণনা উপস্থাপন করে। এটা তোলে অক্ষর দ্বারা সীমায়িত নন-নেগেটিভ পূর্ণসংখ্যার কিছু সংখ্যা উপস্থিত রয়েছে +-*/। স্ট্রিংটি বাম থেকে ডানে পড়বে এবং সাধারণ নজির বিধিগুলি উপেক্ষা করা হবে, সুতরাং "23+1*3/4""23 দিয়ে শুরু করুন, 1 যুক্ত করুন, 3 দ্বারা গুণিত করুন এবং 4 দিয়ে ভাগ করুন", ফলাফলটি 18 হবে being ইনপুটটিতে এমন সংখ্যা থাকবে না যা দিয়ে শুরু হবে 0( 0নিজে বাদে ), না শূন্য দ্বারা বিভাজন।

আউটপুট

গণনার প্রতিটি পর্যায়ে আপনি ফলাফলটিকে উপরে বা নীচের নিকটতম পূর্ণসংখ্যায় নিয়ে যেতে পারেন বা এটি যেমন আছে তেমন রাখতে পারেন। অবশেষে, আপনি একটি পূর্ণসংখ্যার ফলাফল পেতে উপরে বা নীচে গোল করেন। আপনার আউটপুট হল পূর্ণসংখ্যার তালিকা যা এই জাতীয় গণনা থেকে বাছাই করা এবং নকল ছাড়াই ফলাফল হতে পারে।

বিধি

আপনি একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন। সর্বনিম্ন বাইট গণনা জয়, এবং মান লুফোলগুলি অনুমোদিত নয়।

পরীক্ষার কেস

"42" -> [42]
"2+0+4-0" -> [6]
"23+1*3/4" -> [18]
"5/2" -> [2,3]
"5/2+7/3*6-1" -> [17,18,19,23]
"23/2/2*30-170/3" -> [-7,-6,-2,-1,0,1,3,4]
"1/3*2*2*2*2*2*2" -> [0,16,20,21,22,24,32,64]
"1/3*9" -> [0,3,9]

প্রোগ্রামটিতে সমস্ত সম্ভাব্য ইনপুট (সংখ্যার আকার নির্বিশেষে), একটি সীমিত আকারের ইনপুট, বা কেবল পরীক্ষার ক্ষেত্রে কাজ করতে হবে?
orp

@orlp সমস্ত ইনপুট সংখ্যা এবং অন্তর্বর্তী ফলাফল নীচে হলে এটি কমপক্ষে কাজ করা উচিত, বলুন, নিখরচায় 10 মিলিয়ন। অ্যাকাউন্টিং ফার্ম ছোট, সর্বোপরি।
জাগারব

পরীক্ষার কেসটি নোট করুন, 1/3*9যদি আপনি ভাসমান পয়েন্ট নম্বর ব্যবহার করেন তবে ব্যর্থ হতে পারে।
ক্লাদিউ

@ ক্লাউডিউ ধন্যবাদ, আমি এটিকে চ্যালেঞ্জটিতে যুক্ত করেছি।
জাগারব

উত্তর:


4

জে, 84 বাইট

1 টি উপাদান তালিকা থেকে শুরু করে ক্রিয়াকলাপটি পরবর্তী এক্সপ্রেশনটি ব্যাখ্যা করে এবং এটির উপরে এবং নীচে বৃত্তাকার অনুলিপিগুলি যুক্ত করে তালিকার সমস্ত সম্ভাব্য মধ্যবর্তী নম্বরগুলিকে রাখে।

আরও গল্ফ এবং আগামীকাল ব্যাখ্যা যোগ করবে। এটি আরও গল্ফ করার সুস্পষ্ট উপায় খুঁজে পাচ্ছে না।

f=.3 :'/:~~.<.>((,>.,<.)@".@(":@],''x'',;@[))&.>/|.(>@{.;_2<\}.);:y rplc''/'';''%'''

সমস্ত পরীক্ষা পাস।

ব্যবহার:

   f '1/3*2*2*2*2*2*2'
0 16 20 21 22 24 32 64
   f '1/3*9'
0 3 9

এখানে চেষ্টা করুন।


আপনি কীভাবে তাদের সাথে ভাসমানের পরিবর্তে যুক্তিযুক্ত হিসাবে আচরণ করবেন - এটি কি জে তে অন্তর্নির্মিত? (এখানে জে নুব সম্পূর্ণ করুন)
ক্লাদিউ

@ ক্লাউডিউ প্রতিটি স্পষ্টে তালিকার শেষে চিঠিটি যুক্ত করে যথাযথ সংখ্যার (এই ক্ষেত্রে যুক্তিযুক্ত) জোর করি x
এলোমেলো

3

পাইথন 2, 220 টি অক্ষর

import re,sys,math as m,fractions as f
X=f.Fraction
M=map
F=['+']+re.split("(\D)",sys.argv[1])
r=[X(0)]
while F:U=[eval('f.'+`n`+F[0]+F[1])for n in r];r=M(X,U+M(m.floor,U)+M(m.ceil,U));F=F[2:]
print sorted(set(M(int,r)))

এটি সমস্ত সম্ভাব্য সংখ্যার একটি তালিকা রাখে এবং প্রতিটি পদক্ষেপে ডুপ্লিকেট থাকলেও তালিকার প্রতিটি সংখ্যার জন্য তিনটি সংখ্যা উত্পন্ন করে। এইভাবে রান-টাইম জটিলতা হ'ল এক্সপোনেনশিয়াল। তবে এটি এই ছোট উদাহরণগুলির জন্য তাত্ক্ষণিকভাবে কাজ করে works ডুপস শেষে সরানো হয়।

এটি fractions.Fractionভাসমান বিন্দু অনিরাপদ এড়িয়ে সঠিক বিভাগ করতে ব্যবহার করে।

নাটকীয়ভাবে পারফরম্যান্স বাড়ানোর জন্য 5 টি অক্ষর ( r=map(X,g)-> r=set(map(X,g))) যুক্ত করুন।


এর সাথে শুরু করার জন্য এখানে একটি সহজ গল্ফ: \Dঅ অঙ্কগুলির সাথে ম্যাচ করার জন্য একটি পূর্বনির্ধারিত চরিত্র শ্রেণি
স্পি 3000

@ অরলপ: এখনই স্থির! (আমার মনে হয় ..)
ক্লদিউ

@ ক্লাডিউ: এটি r"(\D)"বা হয় হওয়া উচিত "(\\D)"। আর যদি পাইথন 3 ব্যবহার করেন, আপনি ইন্ডেক্স মধ্যে প্রতিস্থাপন করতে পারেন Fতারকাচিহ্নিত নিয়োগ, যেমন সঙ্গে A,B,*F=F, ব্যবহার Aএবং Bপরিবর্তে F[0]এবং F[1], এবং পরিত্রাণ পেতে F=F[2:]
ম্যাক

@ ম্যাক: "\D"যাইহোক কাজ শেষ এবং এটি আরও খাটো। এটি কোনও বৈধ অব্যাহতি ক্রম নয় তাই পাইথনে কেবলমাত্র \ এবং Dভার্ভ্যাটিম অন্তর্ভুক্ত । পাইথন 3 টিপটি ভাল, আমি এটি যাচাই করব, যদিও আমাকে ব্যাকটিকগুলি প্রতিস্থাপন করতে হবে repr()এবং ফলাফলটিকে mapএকটি তালিকায় পরিণত করতে হবে । তারকাচিহ্নিত অ্যাসাইনমেন্ট এমন কিছু যা আমি আশা করি পাইথন 2 হ'ল ..
ক্লাদিউ

2

পাইথন, 421 370 354 বাইট

দুঃখিত, আমার সাথে সহ্য করুন। আমি অজগর থেকে সত্যই নতুন (আমি কেবল ফ্রেঞ্চিওসনকে সমর্থন করে এমন একটি ভাষা খুঁজছিলাম) এবং কোডটি সংক্ষিপ্ত করার জন্য যে কয়েকটি কৌশল আমি জানতাম সেগুলি ব্যবহার করেছিলাম তবে এটি এখনও প্রায় এক দৈত্য বিবেচনা করে দেখা যাচ্ছে যে প্রায় অর্ধেক আকারের একটি অজগর সমাধান রয়েছে। আমি অনেক কিছু শিখেছি এবং ভেবেছি এটি যেভাবেই জমা দেব =)

@ কিরবিফ্যান6464 এবং @ জগারবকে নতুন সংস্করণ ধন্যবাদ

from fractions import*
from math import*
import re,operator as z
s=input()
N=re.split(r'[\*\/\-\+]',s)
O=re.split(r'[0-9]+',s)[1:-1]
d={'+':z.add,'-':z.sub,'*':z.mul,'/':z.truediv}
l=[int(N[0])]#list of inters up to now
for i in range(len(O)): #iterate over all operations
    n=set()
    for f in l:
        f=d[O[i]](f,Fraction(int(N[i+1])))
        n.update([floor(f),ceil(f),f])
    l=n
print(set(map(floor,n)))

পুরাতন রুপ

from fractions import Fraction as F
from math import floor,ceil
import re
s=input()
N=re.split(r'[\*\/\-\+]',s)   #Numbers
O=re.split(r'[0-9]+',s)[1:-1] #Operators
l=[int(N[0])]
for i in range(len(O)): #Iterate over all operators
    n=set()
    for f in l:           #Iterate over all possible numbers
        g=F(int(N[i+1]))
        o=O[i]
        if o=='/':
            f/=g
        elif o=='*':
            f*=g
        elif o=='-':
            f-=g
        else:
            f+=g
        n.add(floor(f))  #Add all possible numbers to a new set 
        n.add(ceil(f))   # the 'set' structure prevents from having multiple copies
        n.add(f)         # which is a really nice feature
    l=n                #repeat
print(set([floor(k) for k in n])) #also remove the unrounded ones

একটি জিনিসের জন্য, আপনি কয়েকটি স্থান ইনডেন্টগুলি ট্যাবগুলির সাথে প্রতিস্থাপন করতে পারেন (এটি সাধারণত সফল হয় তবে কোড গল্ফে ভাল কাজ করে: একটি ট্যাব == 1 অক্ষর)। আপনি বেশ কয়েকটি ifগুলি ( d={'+': operator.add, '-': operator.sub, ...}; d[op](a, b)) এর পরিবর্তে একটি ডিকও ব্যবহার করতে পারেন । এছাড়াও, [floor(k) for k in n]সংক্ষিপ্ত করা যেতে পারে map(floor, n), এবং n.addকলগুলি হতে পারে n.extend([floor(f), ceil(f), f])
kirbyfan64sos

বাহ আপনাকে অনেক ধন্যবাদ, আমি এগুলি চেষ্টা করে বাস্তবায়ন করব! আমি অলরেডি ইনডেন্টগুলিকে ট্যাব হিসাবে গণনা করেছি তবে তাদের এখানে স্থানগুলিতে রূপান্তর করতে হয়েছিল।
flawr

আপনি কেবল একক স্পেস ব্যবহার করতে পারেন; তাদের কাজ করা উচিত।
kirbyfan64sos

যতদূর আমি দেখতে পাচ্ছি, আপনি Fকেবল একবার ব্যবহার করুন , যাতে আপনি from fractions import*কিছু বাইটগুলি করতে এবং সংরক্ষণ করতে পারেন । একই সাথে math। আশেপাশের জায়গাগুলি সরান =, এগুলি অপ্রয়োজনীয়। এছাড়াও, আপনার sহার্ড-কোডিংয়ের পরিবর্তে ইনপুট বরাদ্দ করা উচিত ।
জাগারব

@ ফ্লোয়ার প্রতিটি alচ্ছিক স্থান সরান। এছাড়াও, আপনাকে যে কোনও ইনপুট গ্রহণ করতে সক্ষম হতে হবে । s=input()পরিবর্তে ব্যবহার করুন s = "1/3*9", আপনার মন্তব্য ইত্যাদি মুছে ফেলুন
mbomb007

1

গণিত, 134

Union@Flatten@{Floor@#,Ceiling@#}&@ToExpression@StringReplace[#,x:("+"|"-"|"*"|"/"~~NumberString):>"//{Floor@#,#,Ceiling@#}"~~x~~"&"]&

0

ম্যাটল্যাব, ২৮৩ টি চর

function[u]=w(s)
s=[' ' strsplit(regexprep(s,'\D',' $& '))];s=reshape(s,[2,size(s,2)/2]);o=s(1,:);d=cellfun(@str2num,s(2,:));a=d(1);for n=2:size(o,2)switch o{n}case'+';a=a+d(n);case'-'a=a-d(n);case'/'a=a/d(n);case'*'a=a*d(n);end;a=[ceil(a);a;floor(a)];end;u=unique(a(mod(a,1)==0))end

Ungolfed:

function [u] = WingitRound(i)
    i=[' ' strsplit(regexprep(i,'\D',' $& '))];
    i=reshape(i,[2,size(i,2)/2]);

    o=i(1,:);
    n=cellfun(@str2num,i(2,:));

    a=n(1);

    for n=2:size(o,2)
        switch o{n}
            case '+'
                a = a + n(n);
            case '-'
                a = a - n(n);
            case '/'
                a = a / n(n);
            case '*'
                a = a * n(n);
        end
        a = [ceil(a);a;floor(a)];
    end

    u=unique(a(mod(a,1)==0)));
end

এটি লেখার সময়, আমি বুঝতে পেরেছিলাম যে এটি করার একটি আরও ছোট উপায় আছে, যা আমি এটি লেখা শেষ করে যুক্ত করব।


0

ভিবিএ, 347 বাইট

Function OoCRE(inp As String)
ct = 0
i = 1
Do While i < Len(inp)
c = Mid(inp, i, 1)
If Not IsNumeric(c) Then
ct = ct + 1
If ct = 2 Then
inp = Round(Application.Evaluate(Left(inp, i - 1))) & Right(inp, Len(inp) - (i - 1))
i = InStr(1, inp, c)
ct = 1
End If
End If
OoCRE = Round(Application.Evaluate(inp))
i = i + 1
Loop
End Function

1
এখানে প্রচুর গল্ফিং করা দরকার, মূলত অতিশয় সাদা স্থান সরিয়ে এবং ছোট ছোট নামগুলি বেছে নিন
বিড়াল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.