বিপরীত পোলিশ স্বরলিপি


41

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

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

প্রোগ্রামটিতে আপনাকে কোনও ধরণের "ইভাল" ব্যবহার করার অনুমতি নেই।

নম্বর এবং অপারেটর এক বা একাধিক স্পেস দ্বারা পৃথক করা হয় ।

আপনাকে অবশ্যই কমপক্ষে +, -, * এবং / অপারেটরদের সমর্থন করতে হবে।

আপনাকে নেতিবাচক সংখ্যায় (উদাহরণস্বরূপ, -4একই জিনিস নয় 0 4 -) এবং ভাসমান পয়েন্ট সংখ্যাগুলিতে সমর্থন যুক্ত করতে হবে।

আপনি ইনপুটটি বৈধ বলে ধরে নিতে পারেন এবং উপরের নিয়মগুলি অনুসরণ করেন


পরীক্ষার মামলা

ইনপুট:

-4 5 +

আউটপুট:

1

ইনপুট:

5 2 /

আউটপুট:

2.5

ইনপুট:

5 2.5 /

আউটপুট:

2

ইনপুট:

5 1 2 + 4 * 3 - +

আউটপুট:

14

ইনপুট:

4 2 5 * + 1 3 2 * + /

আউটপুট:

2

8
এটা একটা লজ্জা কোন Eval অনুমতি দেওয়া হয় এর অন্যথায় GolfScript সমাধান 1 টি অক্ষর হল: ~। :
ক্রিস জেস্টার-ইয়াং

5
এ কারণেই এটি অনুমোদিত নয় :- পি, স্ট্যাকওভারফ্লোতে এই প্রশ্নটি ডিসি সহ একটি 4 টি বর্ণের উত্তর পেয়েছে।

1
@ শিনকিরোউ: কোন evalসংখ্যাটি বিশ্লেষণ করতে আপনার প্রয়োজন ? বেশ ভাঙা মনে হচ্ছে। (। GolfScript এক ধরনের ভাষা, যতটা আমি সচেতন আছি আমার মনে হয় এটা খুব ভাঙ্গা হল।)
ক্রিস বিদূষক তরুণ

3
-4 0-4 -র সমান কী হয় না?
কিথ র্যান্ডাল

1
আমি মনে করি eval ঠিক হওয়া উচিত যদি এটি কেবল স্ট্রিংকে সংখ্যায় রূপান্তর করা হত। যেমন। অজগর eval(s)থেকে ভালfloat(s)
gnibbler

উত্তর:


15

রুবি - 95 77 টি অক্ষর

a=[]
gets.split.each{|b|a<<(b=~/\d/?b.to_f: (j,k=a.pop 2;j.send b,k))}
p a[0]

স্টিডিনে ইনপুট নেয়।

পরীক্ষার কোড

[
  "-4 5 +",
  "5 2 /",
  "5 2.5 /",
  "5 1 2 + 4 * 3 - +",
  "4 2 5 * + 1 3 2 * + /",
  "12 8 3 * 6 / - 2 + -20.5 "
].each do |test|
  puts "[#{test}] gives #{`echo '#{test}' | ruby golf-polish.rb`}"
end

দেয়

[-4 5 +] gives 1.0
[5 2 /] gives 2.5
[5 2.5 /] gives 2.0
[5 1 2 + 4 * 3 - +] gives 14.0
[4 2 5 * + 1 3 2 * + /] gives 2.0
[12 8 3 * 6 / - 2 + -20.5 ] gives 10.0

সি সংস্করণটির বিপরীতে এটি শেষ বৈধ ফলাফলটি প্রদান করে যদি মনে হয় যে ইনপুটটিতে অতিরিক্ত সংখ্যক সংযুক্ত থাকে।


1
আপনি প্রতিটি পরিবর্তে মানচিত্র ব্যবহার করে একটি চরিত্র শেভ করতে পারেন
অ্যাডিসন

10

পাইথন - 124 অক্ষর

s=[1,1]
for i in raw_input().split():b,a=map(float,s[:2]);s[:2]=[[a+b],[a-b],[a*b],[a/b],[i,b,a]]["+-*/".find(i)]
print s[0]

পাইথন - 133 অক্ষর

s=[1,1]
for i in raw_input().split():b,a=map(float,s[:2]);s={'+':[a+b],'-':[a-b],'*':[a*b],'/':[a/b]}.get(i,[i,b,a])+s[2:]
print s[0]

1
আমি স্ট্যাক ম্যানিপুলেশন পছন্দ।
আলেকজান্দ্রু

2
আপনার 0দ্বিতীয় অপারেন্ড হিসাবে থাকতে পারে না ...
জেবার্নার্ডো

2
[a/b]b and[a/b]এমনটি প্রতিস্থাপন করা উচিত যাতে আপনার দ্বিতীয় অপারেন্ড হিসাবে 0 থাকতে পারে।
flornquake

10

স্কিম, 162 অক্ষর

(স্পষ্টতার জন্য লাইন ব্রেকগুলি যুক্ত করা হয়েছে — সবগুলি areচ্ছিক))

(let l((s'()))(let((t(read)))(cond((number? t)(l`(,t,@s)))((assq t
`((+,+)(-,-)(*,*)(/,/)))=>(lambda(a)(l`(,((cadr a)(cadr s)(car s))
,@(cddr s)))))(else(car s)))))

সম্পূর্ণরূপে বিন্যাসিত (অবরুদ্ধ) সংস্করণ:

(let loop ((stack '()))
  (let ((token (read)))
    (cond ((number? token) (loop `(,token ,@stack)))
          ((assq token `((+ ,+) (- ,-) (* ,*) (/ ,/)))
           => (lambda (ass) (loop `(,((cadr ass) (cadr stack) (car stack))
                                    ,@(cddr stack)))))
          (else (car stack)))))

নির্বাচিত ভাষ্য

`(,foo ,@bar)যেমনটি (cons foo bar)(যেমন, এটি (কার্যকরভাবে ) fooপ্রিপেন্ড করা সহ একটি নতুন তালিকার প্রত্যাবর্তন করে bar) এর মত, যদি আপনি সমস্ত জায়গাগুলি সঙ্কুচিত করেন তবে এটির একটি অক্ষর ছোট হয়।

সুতরাং, আপনি পুনরাবৃত্তির ধারাগুলি পড়তে পারেন (loop (cons token stack))এবং (loop (cons ((cadr ass) (cadr stack) (car stack)) (cddr stack)))যদি এটি আপনার চোখে সহজ।

`((+ ,+) (- ,-) (* ,*) (/ ,/))প্রক্রিয়াটির সাথে সংযুক্ত প্রতীক এবং একইভাবে অন্যান্য অপারেটরগুলির সাথে একটি সমিতি তালিকা তৈরি করে । সুতরাং এটি একটি সাধারণ প্রতীক দেখার টেবিল (খালি শব্দ প্রতীক হিসাবে রয়েছে, যার কারণে আর কোনও প্রক্রিয়া প্রয়োজন হয় না)। সমিতির তালিকাগুলিতে ও (এন) অনুসন্ধান রয়েছে এবং এটি কেবল সংক্ষিপ্ত তালিকার জন্য উপযুক্ত, যেমনটি এখানে রয়েছে the :-P+ +(read)token

Techn এটি প্রযুক্তিগতভাবে সঠিক নয়, তবে, লিসিপহীন প্রোগ্রামারদের ক্ষেত্রে এটি সঠিকভাবে যথেষ্ট ধারণা পেয়েছে idea


আপনি কি এটি পড়তে পারেন? সিরিয়াসলি?

1
@ এম 28: অসম্পূর্ণ সংস্করণ, হ্যাঁ। আমি আধা নিয়মিত ভিত্তিতে (বাস্তব, গুরুতর প্রোগ্রামগুলির জন্য) স্কিমে প্রোগ্রাম করি।
ক্রিস জেস্টার-ইয়াং

দুর্ভাগ্যক্রমে, স্কিম একটি ভার্চুয়াল ভাষা এবং ভালভাবে গল্ফ করা কুখ্যাত। সুতরাং কিছু পার্ল জমা দিয়ে এটিকে পরাজিত করে আমি অবাক হব না।
ক্রিস জেস্টার-ইয়াং

7
গল্ফ সংস্করণে আমি চারটি স্মাইলি পছন্দ করি।
টমসডিং

2
lambda (ass) পরিবর্তনশীল নাম পছন্দ করার জন্য +1: পি
ডাউনগোট

7

সি - 424 প্রয়োজনীয় চরিত্র

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define O(X) g=o();g=o() X g;u(g);break;
char*p=NULL,*b;size_t a,n=0;float g,s[99];float o(){return s[--n];};
void u(float v){s[n++]=v;};int main(){getdelim(&p,&a,EOF,stdin);for(;;){
b=strsep(&p," \n\t");if(3>p-b){if(*b>='0'&&*b<='9')goto n;switch(*b){case 0:
case EOF:printf("%f\n",o());return 0;case'+':O(+)case'-':O(-)case'*':O(*)
case'/':O(/)}}else n:u(atof(b));}}

ধরে নিই যে getdelimstdio.h এ অন্তর্ভুক্ত করার জন্য আপনার কাছে একটি নতুন পর্যাপ্ত libc রয়েছে । পদ্ধতির সোজা এগিয়ে, পুরো ইনপুটটি একটি বাফারে পড়ে, তারপরে আমরা strsepপ্রতিটিটির বর্গ নির্ধারণের জন্য দৈর্ঘ্য এবং প্রাথমিক অক্ষরটি টোকনাইজ করি এবং ব্যবহার করি। খারাপ ইনপুট বিরুদ্ধে কোনও সুরক্ষা নেই। এটিকে "+ - * / + - ..." খাওয়ান এবং এটি ত্রুটিগুলি সীমাবদ্ধ না করা অবধি স্ট্যাকের "নীচে" মেমরিটিকে খুশি করে পপ করবে। সমস্ত অপারেটরকে ফ্লোট হিসাবে ব্যাখ্যা করা হয় atofযার দ্বারা শূন্য মানের অর্থ যদি তারা সংখ্যার মতো না দেখায়।

পাঠযোগ্য এবং মন্তব্য করা হয়েছে:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *p=NULL,*b;
size_t a,n=0;
float g,s[99];
float o(){        /* pOp */
  //printf("\tpoping '%f'\n",s[n-1]);
  return s[--n];
};
void u(float v){  /* pUsh */
  //printf("\tpushing '%f'\n",v);
  s[n++]=v;
};
int main(){
  getdelim(&p,&a,EOF,stdin); /* get all the input */
  for(;;){
    b=strsep(&p," \n\t"); /* now *b though *(p-1) is a token and p
                 points at the rest of the input */
    if(3>p-b){
      if (*b>='0'&&*b<='9') goto n;
      //printf("Got 1 char token '%c'\n",*b);
      switch (*b) {
      case 0:
      case EOF: printf("%f\n",o()); return 0;
      case '+': g=o(); g=o()+g; u(g); break;
      case '-': g=o(); g=o()-g; u(g); break;
      case '*': g=o(); g=o()*g; u(g); break;
      case '/': g=o(); g=o()/g; u(g); break;
    /* all other cases viciously ignored */
      } 
    } else { n:
      //printf("Got token '%s' (%f)\n",b,atof(b));
      u(atof(b));
    }
  }
}

ভ্যালিডেশন:

 $ gcc -c99 rpn_golf.c 
 $ wc rpn_golf.c
  9  34 433 rpn_golf.c
 $ echo -4 5 + | ./a.out
1.000000
 $ echo 5 2 / | ./a.out
2.500000
 $ echo 5 2.5 / | ./a.out
2.000000

হেহ! এর সাথে কিছু উদ্ধৃত করতে *হবে ...

 $ echo "5 1 2 + 4 * 3 - +" | ./a.out
14.000000
 $ echo "4 2 5 * + 1 3 2 * + /" | ./a.out
2.000000

এবং আমার নিজের পরীক্ষার কেস

 $ echo "12 8 3 * 6 / - 2 + -20.5 " | ./a.out
-20.500000

আপনি caseম্যাক্রো প্রতিস্থাপন করে কিছু অক্ষর সুরক্ষিত করতে পারেন ।
FUZxxl

7

হাস্কেল (155)

f#(a:b:c)=b`f`a:c
(s:_)![]=print s
s!("+":v)=(+)#s!v
s!("-":v)=(-)#s!v
s!("*":v)=(*)#s!v
s!("/":v)=(/)#s!v
s!(n:v)=(read n:s)!v
main=getLine>>=([]!).words

আপনি "(গুলি: _)! [] = এস" থেকে "(গুলি: _) পরিবর্তন করে 9 টি অক্ষর মুছে ফেলতে পারেন! [] = মুদ্রণ" এবং "মেইন = getLine >> = putStrLn.show। ([])! !।) প্রধান = getLine >> = ([]) শব্দের "" থেকে ".words
Fors

এবং তারপরে আরও এক-লাইন কেস-স্টেটমেন্ট ব্যবহার করে আরও কয়েকটি অক্ষর মুছে ফেলুন।
Fors

s!(n:v)=case n of{"+"->(+)#s;"-"->(-)#s;"*"->(*)#s;"/"->(/)#s;_->(read n:s)}!v14 অক্ষর সংরক্ষণ করা হবে।
Fors

7

ম্যাটল্যাব - 158 , 147

C=strsplit(input('','s'));D=str2double(C);q=[];for i=1:numel(D),if isnan(D(i)),f=str2func(C{i});q=[f(q(2),q(1)) q(3:end)];else q=[D(i) q];end,end,q

(ইনপুট ব্যবহারকারী ইনপুট থেকে পড়া হয়, আউটপুট মুদ্রিত হয়)।


নীচে কোডটি পূর্বনির্ধারিত এবং মন্তব্য করা হয়েছে, এটি বর্ণিত পোস্টফিক্স অ্যালগরিদমকে কার্যকরভাবে প্রয়োগ করে (এক্সপ্রেশনগুলি বৈধ কিনা এই ধারণাটি সহ):

C = strsplit(input('','s'));         % prompt user for input and split string by spaces
D = str2double(C);                   % convert to numbers, non-numeric are set to NaN
q = [];                              % initialize stack (array)
for i=1:numel(D)                     % for each value
    if isnan(D(i))                   % if it is an operator
        f = str2func(C{i});          % convert op to a function
        q = [f(q(2),q(1)) q(3:end)]; % pop top two values, apply op and push result
    else
        q = [D(i) q];                % else push value on stack
    end
end
q                                    % show result

বোনাস:

উপরের কোড, আমরা অনুমান অপারেটার সবসময় বাইনারি হয় ( +, -, *, /)। nargin(f)অপারেন্ড / ফাংশনটি প্রয়োজনীয় আর্গুমেন্টগুলি নির্ধারণ করে এবং স্ট্যাক থেকে যথাযথ মানগুলি যথাযথভাবে পপ করতে আমরা এটি ব্যবহার করে সাধারণ করতে পারি :

f = str2func(C{i});
n = nargin(f);
args = num2cell(q(n:-1:1));
q = [f(args{:}) q(n+1:end)];

এইভাবে আমরা মত প্রকাশের মূল্যায়ন করতে পারি:

str = '6 5 1 2 mean_of_three 1 + 4 * +'

mean_of_threeতিনটি ইনপুট সহ একটি ব্যবহারকারী-সংজ্ঞায়িত ফাংশন কোথায় :

function d = mean_of_three(a,b,c)
    d = (a+b+c)/3;
end

6

পার্ল (134)

@a=split/\s/,<>;/\d/?push@s,$_:($x=pop@s,$y=pop@s,push@s,('+'eq$_?$x+$y:'-'eq$_?$y-$x:'*'eq$_?$x*$y:'/'eq$_?$y/$x:0))for@a;print pop@s

পরের বার, আমি পুনরাবৃত্তির regexp জিনিস ব্যবহার করতে যাচ্ছি।

Ungolfed:

@a = split /\s/, <>;
for (@a) {
    /\d/
  ? (push @s, $_)
  : ( $x = pop @s,
      $y = pop @s,
      push @s , ( '+' eq $_ ? $x + $y
                : '-' eq $_ ? $y - $x
                : '*' eq $_ ? $x * $y
                : '/' eq $_ ? $y / $x
                : 0 )
      )
}
print(pop @s);

আমি যদিও এফ # আমার একমাত্র স্বপ্নের প্রোগ্রামিং ভাষা ...


আমার একটি খাটো পার্ল 5 বাস্তবায়ন রয়েছে।
ডলম্যান

6

উইন্ডোজ পাওয়ারশেল, 152 181 192

পঠনযোগ্য আকারে, কারণ এখন এটি কেবল দুটি লাইনের সাথে তাদের ভেঙে যাওয়ার কোনও সম্ভাবনা নেই:

$s=@()
switch -r(-split$input){
  '\+'        {$s[1]+=$s[0]}
  '-'         {$s[1]-=$s[0]}
  '\*'        {$s[1]*=$s[0]}
  '/'         {$s[1]/=$s[0]}
  '-?[\d.]+'  {$s=0,+$_+$s}
  '.'         {$s=$s[1..($s.count)]}}
$s

2010-01-30 11:07 (192) - প্রথম প্রচেষ্টা।

2010-01-30 11:09 (170) - ফাংশনটিকে স্ক্রিপ্টব্লকে পরিণত করে স্কোপ সমস্যাগুলি সমাধান করে। কেবলমাত্র প্রতিটি অনুরোধ দুটি বাইট দীর্ঘায়িত করে।

2010-01-30 11:19 (188) - সুযোগ সমস্যাটি সমাধান করেনি, পরীক্ষার কেসটি কেবল এটি মুখোশ করেছে। চূড়ান্ত আউটপুট থেকে সূচকটি সরানো হয়েছে এবং একটি অতিরিক্ত অতিরিক্ত লাইন ব্রেক সরিয়ে ফেলেছে। এবং ডাবল পরিবর্তন float

2010-01-30 11:19 (181) - এমনকি আমার নিজের পরামর্শ মনে করতে পারে না। একটি সংখ্যার প্রকারে কাস্টিং একক চরে করা যেতে পারে।

2010-01-30 11:39 (152) - এর মধ্যে রিজেক্স ম্যাচ ব্যবহার করে দুর্দান্তভাবে হ্রাস পেয়েছে switch। এটি পপ করার জন্য স্ট্যাক অ্যাক্সেস সহ পুরো স্কোপ সমস্যাগুলি সম্পূর্ণরূপে সমাধান করে।



4

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

import os,operator as o
S=[]
for i in os.read(0,99).split():
 try:S=[float(i)]+S
 except:S=[{'+':o.add,'-':o.sub,'/':o.div,'*':o.mul}[i](S[1],S[0])]+S[2:]
print S[0]

ব্যবহার raw_input()কোড একাধিক লাইনে বিভক্ত নয়।
JPvdMerwe

তারপর আপনি চেষ্টা করে দেখতে পারেন: from operator import*এবং প্রতিস্থাপন o.divসঙ্গে div
JPvdMerwe 30'11

4

পাইথন 3, 119 বাইট

s=[]
for x in input().split():
 try:s+=float(x),
 except:o='-*+'.find(x);*s,a,b=s;s+=(a+b*~-o,a*b**o)[o%2],
print(s[0])

ইনপুট: 5 1 1 - -7 0 * + - 2 /

আউটপুট: 2.5

(আপনি সম্পাদনার ইতিহাসে একটি 128-অক্ষরের পাইথন 2 সংস্করণ খুঁজে পেতে পারেন))


খুব চতুর :) আপনার পছন্দ মতো /স্ট্রিংয়ের কী দরকার নেই ।
ড্যানিয়েল লুবারভ 19


@ এরিকথ আউটগলফার যা ZeroDivisionErrorদ্বিতীয় অপারেন্ড 0 (উদাঃ 5 0 +) এর সাথে বিরতি দেয় ।
flornquake

ord(x) - 42পদ্ধতিটি ব্যবহার করে আপনি 1 টি অক্ষর সংরক্ষণ করতে পারেন ।
ফ্রেডেরিক 99

@ frederick99 আমি কিভাবে দেখতে পাচ্ছি না।
21

3

জাভাস্ক্রিপ্ট (157)

এই কোডটি ধরে নেয় এই দুটি ফাংশন রয়েছে: রিডলাইন এবং মুদ্রণ

a=readLine().split(/ +/g);s=[];for(i in a){v=a[i];if(isNaN(+v)){f=s.pop();p=s.pop();s.push([p+f,p-f,p*f,p/f]['+-*/'.indexOf(v)])}else{s.push(+v)}}print(s[0])

আপনি যদি prompt()পরিবর্তে readLine()(এবং সম্ভবত মেলে alert()পরিবর্তে ) ব্যবহার করেন তবে সংক্ষিপ্ত। print()prompt()
nyuszika7h

3

পার্ল, 128

এটি অন্যান্য পার্ল উত্তরের পাশে আসলেই প্রতিযোগিতামূলক নয়, তবে একটি পৃথক (সাবপটিমাল) পাথ অন্বেষণ করে।

perl -plE '@_=split" ";$_=$_[$i],/\d||
do{($a,$b)=splice@_,$i-=2,2;$_[$i--]=
"+"eq$_?$a+$b:"-"eq$_?$a-$b:"*"eq$_?
$a*$b:$a/$b;}while++$i<@_'

সরল perl -e ''প্রার্থনার চেয়ে পৃথক হিসাবে গণনা করা অক্ষর ।


2

পাইথন, ১1১ টি অক্ষর:

from operator import*;s=[];i=raw_input().split(' ')
q="*+-/";o=[mul,add,0,sub,0,div]
for c in i:
 if c in q:s=[o[ord(c)-42](*s[1::-1])]+s 
 else:s=[float(c)]+s
print(s[0])

2

পিএইচপি, 439 265 263 262 244 240 টি অক্ষর

<? $c=fgets(STDIN);$a=array_values(array_filter(explode(" ",$c)));$s[]=0;foreach($a as$b){if(floatval($b)){$s[]=$b;continue;}$d=array_pop($s);$e=array_pop($s);$s[]=$b=="+"?$e+$d:($b=="-"?$e-$d:($b=="*"?$e*$d:($b=="/"?$e/$d:"")));}echo$s[1];

এই কোডটি স্টিডিনের সাথে কাজ করা উচিত, যদিও এটি স্টিডিনের সাথে পরীক্ষা করা হয়নি।

এটি সমস্ত ক্ষেত্রে পরীক্ষা করা হয়েছে, শেষেরটির জন্য আউটপুট (এবং কোড) এখানে রয়েছে:
http://codepad.viper-7.com/fGbnv6

অবহেলিত, 314 330 326 টি অক্ষর

<?php
$c = fgets(STDIN);
$a = array_values(array_filter(explode(" ", $c)));
$s[] = 0;
foreach($a as $b){
    if(floatval($b)){
        $s[] = $b;
        continue;
    }
    $d = array_pop($s);
    $e = array_pop($s);
    $s[] = $b == "+" ? $e + $d : ($b == "-" ? $e - $d : ($b == "*" ? $e * $d : ($b == "/" ? $e / $d :"")));
}
echo $s[1];

টাস্কের বিবরণ থেকে উদ্ধৃতি: languages ​​প্রোগ্রামিং ভাষাগুলির জন্য যেগুলি ইনপুট / আউটপুট গ্রহণের জন্য ফাংশন রাখে না, আপনি রিডলাইন / মুদ্রণের মতো ফাংশন ধরে নিতে পারেন «- সম্ভবত পিএইচপি এর কাজ করার জন্য ফাংশন রয়েছে , সুতরাং অনুমানটি ভুল।
জোয়

এটি স্টিডিন ব্যবহার করতে আপডেট করেছে এবং এটি আরও কিছুটা গল্ফ করেছে।
কেভিন ব্রাউন

2

ফ্লেক্স - 157

%{
float b[100],*s=b;
#define O(o) s--;*(s-1)=*(s-1)o*s;
%}
%%
-?[0-9.]+ *s++=strtof(yytext,0);
\+ O(+)
- O(-)
\* O(*)
\/ O(/)
\n printf("%g\n",*--s);
.
%%

আপনি যদি পরিচিত না হন তবে সংকলন করুন flex rpn.l && gcc -lfl lex.yy.c


2

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

আমরা বাদ দিলে 124 টি অক্ষর হবে b and(যা পাইথনের কয়েকটি উত্তর অনুপস্থিত)। এবং এটি অন্তর্ভুক্ত 42!

s=[]
for x in raw_input().split():
 try:s=[float(x)]+s
 except:b,a=s[:2];s[:2]=[[a*b,a+b,0,a-b,0,b and a/b][ord(x)-42]]
print s[0]

সত্যিই দুর্দান্ত উত্তর। তবে আমি 130 টি অক্ষর গণনা করি। ;)
ফ্লোরকোভ

@ ফ্লোরকোইক আপনি ঠিক বলেছেন, সংশোধনের জন্য ধন্যবাদ।
ড্যানিয়েল লুবারভ

2

পাইথন 3, 126 132 অক্ষর

s=[2,2]
for c in input().split():
    a,b=s[:2]
    try:s[:2]=[[a+b,b-a,a*b,a and b/a]["+-*/".index(c)]]
    except:s=[float(c)]+s
print(s[0])

ইতিমধ্যে আরও ভাল সমাধান রয়েছে তবে এখন আমি এটি লিখেছিলাম (পূর্ববর্তী সাবমিশনগুলি না পড়েই অবশ্যই - যদিও আমাকে স্বীকার করতে হবে যে আমার কোড দেখে মনে হচ্ছে আমি সেগুলি এক সাথে কপি করেছি), আমি এটি ভাগ করতে চেয়েছিলাম, খুব।


b/aএর সাথে প্রতিস্থাপন করা উচিত a and b/a, অন্যথায় দ্বিতীয় অপারেন্ড 0 (উদাঃ 4 0 -) হলে এই সমাধানটি কাজ করবে না ।
flornquake

@ ফ্লর্নকোয়েক এটি তার জন্য স্থির করেছে।
mbomb007

2

সি 99 জিসিসি 235

এটি আমার জন্য (সতর্কতা সহ) কাজ করে:

#include <stdlib.h>
#define O(x):--d;s[d]=s[d]x s[d+1];break;
float s[99];main(c,v)char**v;{for(int i=1,d=0;i<c;i++)switch(!v[i][1]?*v[i]:' '){case'+'O(+)case'-'O(-)case'*'O(*)case'/'O(/)default:s[++d]=atof(v[i]);}printf("%f\n",s[1]);}

তবে আপনি যদি এটি মিংডও 32 দিয়ে সংকলন করে থাকেন তবে আপনাকে গ্লোববিং বন্ধ করতে হবে ( https://www.cygwin.com/ml/cygwin/1999-11/msg00052.html দেখুন ) এর মতো সংকলন করে:

gcc -std=c99 x.c C:\Applications\mingw32\i686-w64-mingw32\lib\CRT_noglob.o

আপনি যদি না করেন * তবে স্বয়ংক্রিয়ভাবে মিংডব্লিউ 32 সিআরটি দ্বারা প্রসারিত হবে।

কেউ কীভাবে break;case'*':s[--d]*=s[d+1];ম্যাক্রোতে পরিণত করতে জানেন যা চরিত্রটিকে + প্যারামিটার হিসাবে গ্রহণ করে কেননা তখন চারটি কেসই হবেO(+)O(-)O(*)O(/)

H:\Desktop>gcc -std=c99 x.c C:\Applications\mingw32\i686-w64-mingw32\lib\CRT_noglob.o
x.c:3:13: warning: return type defaults to 'int'
 float s[99];main(c,v)char**v;{for(int i=1,d=0;i<c;i++)switch(!v[i][1]?*v[i]:' '){case'+'O(+)case'-'O(-)case'*'O(*)case'/'O(/)default:s[++d]=atof(v[i]);}printf("%f\n",s[1]);}
x.c: In function 'main':
x.c:3:13: warning: type of 'c' defaults to 'int'
x.c:3:1: warning: implicit declaration of function 'atof' [-Wimplicit-function-declaration]
 float s[99];main(c,v)char**v;{for(int i=1,d=0;i<c;i++)switch(!v[i][1]?*v[i]:' '){case'+'O(+)case'-'O(-)case'*'O(*)case'/'O(/)default:s[++d]=atof(v[i]);}printf("%f\n",s[1]);}
x.c:3:1: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration]
x.c:3:153: warning: incompatible implicit declaration of built-in function 'printf'
 float s[99];main(c,v)char**v;{for(int i=1,d=0;i<c;i++)switch(!v[i][1]?*v[i]:' '){case'+'O(+)case'-'O(-)case'*'O(*)case'/'O(/)default:s[++d]=atof(v[i]);}printf("%f\n",s[1]);}
H:\Desktop>a -4 5 +
1.000000
H:\Desktop>a 5 2 /
2.500000
H:\Desktop>a 5 2.5 /
2.000000
H:\Desktop>a 5 1 2 + 4 * 3 - +
14.000000
H:\Desktop>a 4 2 5 * + 1 3 2 * + /
2.000000

2

সি, 232 229 বাইট

পুনরাবৃত্তি সঙ্গে মজা।

#include <stdlib.h>
#define b *p>47|*(p+1)>47
char*p;float a(float m){float n=strtof(p,&p);b?n=a(n):0;for(;*++p==32;);m=*p%43?*p%45?*p%42?m/n:m*n:m-n:m+n;return*++p&&b?a(m):m;}main(c,v)char**v;{printf("%f\n",a(strtof(v[1],&p)));}

Ungolfed:

#include <stdlib.h>

/* Detect if next char in buffer is a number */
#define b *p > 47 | *(p+1) > 47

char*p; /* the buffer */

float a(float m)
{
    float n = strtof(p, &p); /* parse the next number */

    /* if the next thing is another number, recursively evaluate */
    b ? n = a(n) : 0;

    for(;*++p==32;); /* skip spaces */

    /* Perform the arithmetic operation */
    m = *p%'+' ? *p%'-' ? *p%'*' ? m/n : m*n : m-n : m+n;

    /* If there's more stuff, recursively parse that, otherwise return the current computed value */
    return *++p && b ? a(m) : m;
}

int main(int c, char **v)
{
    printf("%f\n", a(strtof(v[1], &p)));
}

পরীক্ষার কেস:

$ ./a.out "-4 5 +"
1.000000
$ ./a.out "5 2 /"
2.500000
$ ./a.out "5 2.5 /"
2.000000
$ ./a.out "5 1 2 + 4 * 3 - +"
14.000000
$ ./a.out "4 2 5 * + 1 3 2 * + /"
2.000000

2

জাভাস্ক্রিপ্ট ES7, 119 বাইট

আমি অ্যারে বোঝার সাথে একটি বাগ পাচ্ছি তাই আমি ব্যবহার করেছি .map

(s,t=[])=>(s.split` `.map(i=>+i?t.unshift(+i):t.unshift((r=t.pop(),o=t.pop(),[r+o,r-o,r*o,r/o]['+-*/'.indexOf(i)]))),t)

এটি অনলাইনে ইএসফিডেলে চেষ্টা করুন


কোন ES7 দোভাষী পাওয়া যায়?
কনপুর ও'ব্রায়েন

@ CᴏɴᴏʀO'Bʀɪᴇɴ এ ফায়ারফক্সে কাজ করা উচিত। আপনি babeljs.io/repl
Downgoat

আচ্ছা বুঝলাম. ^ _ ^ ধন্যবাদ!
কনর ও'ব্রায়েন

1

পিএইচপি - 259 টি অক্ষর

$n=explode(" ",$_POST["i"]);$s=array();for($i=0;$i<count($n);$s=$d-->0?array_merge($s,!$p?array($b,$a,$c):array($p)):$s){if($c=$n[$i++]){$d=1;$a=array_pop($s);$b=array_pop($s);$p=$c=="+"?$b+$a:($c=="-"?$b-$a:($c=="*"?$b*$a:($c=="/"?$b/$a:false)));}}echo$s[2];

POST ভেরিয়েবল ইনপুট ধরে নিচ্ছি i


2
মূল বিবরণ থেকে উদ্ধৃত »প্রোগ্রামিং ভাষাগুলির জন্য যেগুলি ইনপুট / আউটপুট প্রাপ্ত করার জন্য ফাংশন রাখে না, আপনি রিডলাইন / মুদ্রণের মতো ফাংশন ধরে নিতে পারেন« পিএইচপি স্ট্রিমগুলির মাধ্যমে স্টিডিন পাওয়ার একটি উপায় রয়েছে।
কেভিন ব্রাউন

1

সি # - 392 টি অক্ষর

namespace System.Collections.Generic{class P{static void Main(){var i=Console.ReadLine().Split(' ');var k=new Stack<float>();float o;foreach(var s in i)switch (s){case "+":k.Push(k.Pop()+k.Pop());break;case "-":o=k.Pop();k.Push(k.Pop()-o);break;case "*":k.Push(k.Pop()*k.Pop());break;case "/":o=k.Pop();k.Push(k.Pop()/o);break;default:k.Push(float.Parse(s));break;}Console.Write(k.Pop());}}}

তবে, যদি স্ট্যান্ডার্ড ইনপুটের পরিবর্তে যুক্তিগুলি ব্যবহার করা যায় তবে আমরা এটিকে এনে নামিয়ে আনতে পারি

সি # - 366 টি অক্ষর

namespace System.Collections.Generic{class P{static void Main(string[] i){var k=new Stack<float>();float o;foreach(var s in i)switch (s){case "+":k.Push(k.Pop()+k.Pop());break;case "-":o=k.Pop();k.Push(k.Pop()-o);break;case "*":k.Push(k.Pop()*k.Pop());break;case "/":o=k.Pop();k.Push(k.Pop()/o);break;default:k.Push(float.Parse(s));break;}Console.Write(k.Pop());}}}

আপনি সামান্য অপ্টিমাইজেশনের সাহায্যে 23 টি অক্ষর সংরক্ষণ করতে পারেন: 1. নেমস্পেসের কৌশলটি সরিয়ে দিন, দুটি ধরণের প্রয়োজন যা স্পষ্টভাবে যোগ্যতা অর্জন করুন। আপনি "নেমস্পেস" কীওয়ার্ড এবং সংশ্লিষ্ট ব্র্যাকেটগুলি সংরক্ষণ করুন। ২. স্ট্রিং [] এবং i, কেস কীওয়ার্ড এবং লেবেল, স্যুইচ এবং এর প্যারেন্সের মধ্যে ফাঁকা স্থানগুলি সরিয়ে ফেলুন। ৩. ফ্লোট ও থেকে মুক্তি পান এবং বিয়োগের জন্য সঠিক ফলাফল (যেমন।-কে.পপ () + কে.পপ () এবং 1 / কে.পপ () * কে.পপ () ভাগ করার জন্য গণিতটি ব্যবহার করুন ।
মাইকপ

1

স্কালা 412 376 349 335 312:

object P extends App{
def p(t:List[String],u:List[Double]):Double={
def a=u drop 2
t match{
case Nil=>u.head
case x::y=>x match{
case"+"=>p(y,u(1)+u(0)::a)
case"-"=>p(y,u(1)-u(0)::a)
case"*"=>p(y,u(1)*u(0)::a)
case"/"=>p(y,u(1)/u(0)::a)
case d=>p(y,d.toDouble::u)}}}
println(p((readLine()split " ").toList,Nil))}

1

পাইথন - 206

import sys;i=sys.argv[1].split();s=[];a=s.append;b=s.pop
for t in i:
 if t=="+":a(b()+b())
 elif t=="-":m=b();a(b()-m)
 elif t=="*":a(b()*b())
 elif t=="/":m=b();a(b()/m)
 else:a(float(t))
print(b())

অবরুদ্ধ সংস্করণ:

# RPN

import sys

input = sys.argv[1].split()
stack = []

# Eval postfix notation
for tkn in input:
    if tkn == "+":
        stack.append(stack.pop() + stack.pop())
    elif tkn == "-":
        tmp = stack.pop()
        stack.append(stack.pop() - tmp)
    elif tkn == "*":
        stack.append(stack.pop() * stack.pop())
    elif tkn == "/":
        tmp = stack.pop()
        stack.append(stack.pop()/tmp)
    else:
        stack.append(float(tkn))

print(stack.pop())

কমান্ড-লাইন আর্গুমেন্ট থেকে ইনপুট; স্ট্যান্ডার্ড আউটপুট উপর আউটপুট।


1

ইসমাস্ক্রিপ্ট ((১৩১)

মাত্র কয়েক সেকেন্ডের মধ্যে একসাথে টাইপ করা হয়েছে, যাতে এটি সম্ভবত আরও গল্ফ করা যেতে পারে বা আরও ভাল আরও কাছে যেতে পারে। আমি আগামীকাল এটি আবার দেখতে যেতে পারে:

f=s=>(p=[],s.split(/\s+/).forEach(t=>+t==t?p.push(t):(b=+p.pop(),a=+p.pop(),p.push(t=='+'?a+b:t=='-'?a-b:t=='*'?a*b:a/b))),p.pop())

1

সি # - 323 284 241

class P{static void Main(string[] i){int x=0;var a=new float[i.Length];foreach(var s in i){var o="+-*/".IndexOf(s);if(o>-1){float y=a[--x],z=a[--x];a[x++]=o>3?z/y:o>2?z*y:o>1?z-y:y+z;}else a[x++]=float.Parse(s);}System.Console.Write(a[0]);}}

সম্পাদনা করুন: অ্যারের সাথে স্ট্যাকটি প্রতিস্থাপন করা উপায় ছোট orter

সম্পাদনা 2: আইএনএসগুলি একটি বার্ষিক প্রকাশের সাথে প্রতিস্থাপন করেছে


string[] i=> string[]i
জাকারি

1

পাইথন 2

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

পুনরাবৃত্তি ব্যবহার করে, 146

def f(s):
 try:x=s.pop();r=float(x)
 except:b,s=f(s);a,s=f(s);r=[a+b,a-b,a*b,b and a/b]['+-*'.find(x)]
 return r,s
print f(raw_input().split())[0]

তালিকা ম্যানিপুলেশন ব্যবহার করে, 149

s=raw_input().split()
i=0
while s[1:]:
 o='+-*/'.find(s[i])
 if~o:i-=2;a,b=map(float,s[i:i+2]);s[i:i+3]=[[a+b,a-b,a*b,b and a/b][o]]
 i+=1
print s[0]

ব্যবহার reduce(), 145

print reduce(lambda s,x:x in'+-*/'and[(lambda b,a:[a+b,a-b,a*b,b and a/b])(*s[:2])['+-*'.find(x)]]+s[2:]or[float(x)]+s,raw_input().split(),[])[0]

1

মতলব, 228

F='+-/*';f={@plus,@minus,@rdivide,@times};t=strsplit(input('','s'),' ');i=str2double(t);j=~isnan(i);t(j)=num2cell(i(j));while numel(t)>1
n=find(cellfun(@(x)isstr(x),t),1);t{n}=bsxfun(f{t{n}==F},t{n-2:n-1});t(n-2:n-1)=[];end
t{1}

Ungolfed:

F = '+-/*'; %// possible operators
f = {@plus,@minus,@rdivide,@times}; %// to be used with bsxfun
t = strsplit(input('','s'),' '); %// input string and split by one or multiple spaces
i = str2double(t); %// convert each split string to number
j =~ isnan(i); %// these were operators, not numbers ...
t(j) = num2cell(i(j)); %// ... so restore them
while numel(t)>1
    n = find(cellfun(@(x)isstr(x),t),1); %// find left-most operator
    t{n} = bsxfun(f{t{n}==F}, t{n-2:n-1}); %// apply it to preceding numbers and replace
    t(n-2:n-1)=[]; %// remove used numbers
end
t{1} %// display result

আপনি সমস্ত কিছু এক লাইনে রেখে আরও 2 টি বাইট সংরক্ষণ করতে পারেন (বা একটি পাঠ্য সম্পাদক ব্যবহার করুন যা কেবলমাত্র নতুন লাইনের জন্য একটি অক্ষর ব্যবহার করে)
হকি

@ হকি আমি যখন কেবল নতুন লাইন ব্যবহার করি তখন লাইনটি না ভাঙার জন্য একটি প্রয়োজন হয় ;। সুতরাং আমি মনে করি বাইট গণনাটি একই
লুইস মেন্ডো

ঠিক নয়, বেশিরভাগ উইন্ডো পাঠ্য সম্পাদকরা cr+lfএকটি নতুন লাইনের জন্য ব্যবহার করেন যা 2 টি অক্ষর। আমার নোটপ্যাড ++ আপনার 3 লাইনের সংস্করণে 230 টি অক্ষর গণনা করেছে, তবে আমি যদি 128 অক্ষরটি এক লাইনে আটকে থাকি (2 * 2 = 4 টি অক্ষর 2 টি নতুন লাইন থেকে সরানো, এবং দুটি যোগ করা ;)। নিজে চেষ্টা করে দেখুন;)
হকি

@ হকি আপনি ঠিক বলেছেন প্রকৃতপক্ষে, আমি যদি মোটেরেফ.আইন.বিটি / কাউন্টারে তিন লাইনের সংস্করণটি পেস্ট করি (যা আমি টেক্সট বাইট গণনা করার জন্য ব্যবহার করি) এটি 228 দেয় of এবং অবশ্যই এটি আমি সমস্ত কিছু একক মধ্যে রাখার থেকে পেয়েছি লাইন। আমি জানি না আমি কোথা থেকে 230 নম্বর পেয়েছি। ধন্যবাদ! সংশোধন করা হয়েছে
লুইস মেন্ডো 14

1

কে 5, 70 বাইট

`0:*{$[-9=@*x;((*(+;-;*;%)@"+-*/"?y).-2#x;x,.y)@47<y;(.x;.y)]}/" "\0:`

আমি কখনই কে 5 প্রকাশিত হয়েছিল তা নিশ্চিত নই, সুতরাং এটি গণনাও করতে পারে না। তবুও দুর্দান্ত!

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