এসএএস ম্যাক্রো ভেরিয়েবলগুলি সমাধান করুন


13

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

এসএএস ম্যাক্রো ভাষায়, ম্যাক্রো ভেরিয়েবলগুলি %letকীওয়ার্ড ব্যবহার করে সংজ্ঞায়িত করা হয় এবং লগের সাথে মুদ্রণ করা হয় %put। বিবৃতি সেমিকোলন দিয়ে শেষ হয়। এখানে কিছু উদাহরন:

%let x = 5;
%let cool_beans =Cool beans;
%let what123=46.lel"{)-++;

ম্যাক্রো ভেরিয়েবলের নামগুলি সংবেদনশীল এবং নিয়মিত প্রকাশের সাথে সর্বদা মেলে /[a-z_][a-z0-9_]*/i। এই চ্যালেঞ্জের উদ্দেশ্যে, আমরা নিম্নলিখিতগুলি বলব:

  • ম্যাক্রো ভেরিয়েবল শুধুমাত্র মুদ্রণযোগ্য ASCII অক্ষর সম্পূর্ণভাবে গঠিত মান ধরে রাখতে পারেন ব্যতীত ; , &আর%
  • মানগুলিতে কোনও শীর্ষস্থানীয় বা পিছনে স্থান নেই
  • মানগুলি 255 টির বেশি অক্ষরের বেশি হবে না
  • মানগুলি খালি থাকতে পারে
  • মানগুলিতে বন্ধনী এবং উদ্ধৃতিগুলি তুলনামূলকভাবে মেলে না
  • আগে ও পরে স্থান যে কোন পরিমাণ থাকতে পারে =এ %letবিবৃতি এবং এই স্থান উপেক্ষা করা উচিত নয়
  • টার্মিনাল সামনে স্থান কোন পরিমাণ থাকতে পারে ;এ %letবিবৃতি এবং এই স্থান একভাবে উপেক্ষা করা উচিত নয়

যখন কোনও ম্যাক্রো ভেরিয়েবল বলা হয়, আমরা বলি যে এটির মানটির "সমাধান হয়"। ম্যাক্রো ভেরিয়েবলগুলি প্রিপেন্ডিংয়ের মাধ্যমে সমাধান করা হয় &। এখানে একটি al চ্ছিক পিছনে রয়েছে .যা সনাক্তকারীটির শেষ বোঝায়। উদাহরণ স্বরূপ,

%put The value of x is &X..;

লিখেছেন The value of x is 5.লগইন করুন। নোট করুন যে দুটি পিরিয়ড প্রয়োজনীয় কারণ একটি একক পিরিয়ড গ্রাস হয়ে যাবে &X.এবং এর সমাধান করবে 5। এছাড়াও মনে রাখবেন যে আমরা xছোট হাতের অক্ষরে সংজ্ঞায়িত হলেও , ম্যাক্রো ভেরিয়েবলের নামগুলি সংবেদনশীল না হওয়ার কারণ &Xহিসাবে একই &x।

এখানে এটি কৃপণ হয়ে যায়। &ভেরিয়েবলগুলি সমাধান করতে একাধিক গুলি একসাথে স্ট্রং করা যেতে পারে এবং &একই সময়ে নীড়ের সমাধানের একই স্তরে s উদাহরণ স্বরূপ,

%let i = 1;
%let coolbeans1 = broseph;
%let broseph = 5;

%put &&coolbeans&i;  /* Prints broseph */
%put &&&coolbeans&i; /* Prints 5 */

&প্রথম অন্তর্নিহিত সংকল্পটি এবং সমাধানটি বাহ্যিকভাবে অব্যাহত থাকে। পরিবর্তনশীল নামের মিলটি লোভজনকভাবে সম্পন্ন হয়। দ্বিতীয় %putবিবৃতিতে, প্রসেসর নিম্নলিখিত পদক্ষেপগুলি তৈরি করে:

  1. &iসমাধান করে 1, এবং অন্তর্নিহিত নেতৃস্থানীয় &গ্রাস হয়ে যায়, আমাদের সরবরাহ করে&&coolbeans1
  2. &coolbeans1সমাধান করে broseph, আমাদের দিচ্ছে&broseph
  3. &brosephসমাধান করে 5।

যদি সেখানে চলমান .গুলি .থাকে তবে একাধিক &গুলি থাকলেও কেবলমাত্র একটি একক রেজোলিউশনে গ্রাস করা হয় ।

কার্য

%letনিউলাইনগুলি এবং একটি একক %putবিবৃতি দ্বারা পৃথক করা 1 এবং 10 এর মধ্যে বিবৃতি দেওয়া, বিবৃতিটির মুদ্রণ করুন বা প্রত্যাবর্তন করুন %put। ইনপুট যে কোনও মানকভাবে গ্রহণ করা যেতে পারে।

আপনি ধরে নিতে পারেন যে ইনপুটটি সর্বদা বৈধ থাকবে এবং %letবিবৃতিগুলি %putবিবৃতিতে এগিয়ে যাবে। পরিবর্তনশীল যেগুলি সংজ্ঞায়িত হয় পরবর্তী %letবিবৃতিগুলিতে পুনরায় সংজ্ঞায়িত করা হবে না ।

যদি সত্যই এসএএসে চালানো হয় তবে ভেরিয়েবলগুলির সাথে সমাধানের কোন সমস্যা থাকবে না যা ভেরিয়েবলের অস্তিত্ব নেই এবং সমস্ত কিছু সিন্থেটিকভাবে সঠিক হবে উপরোক্ত বর্ণিত হিসাবে।

উদাহরণ

  1. ইনপুট:

    %let dude=stuff;
    %let stuff=bEaNs;
    %put &&dude..;
    

    আউটপুট:

    bEaNs.
    
  2. ইনপুট:

    %let __6 = 6__;
    %put __6&__6;
    

    আউটপুট:

    __66__
    
  3. ইনপুট:

    %let i=1;
    %let hOt1Dog = BUNS;
    %put &&HoT&i.Dog are FUNS&i!");
    

    আউটপুট:

    BUNS are FUNS1!")
    
  4. ইনপুট:

    %let x = {*':TT7d;
    %put SAS is weird.;
    

    আউটপুট:

    SAS is weird.
    
  5. ইনপুট:

    %let var1   =  Hm?;
    %let var11 = var1;
    %let UNUSED = ;
    %put &&var11.....;
    

    আউটপুট:

    Hm?....
    

    মনে রাখবেন যে, &&var11ম্যাচ var11যেহেতু নামের ম্যাচিং লোভী হয়। যদি একটি থাকে ., অর্থাত্ &&var1.1, তাহলে var1মিলবে এবং অতিরিক্ত 1 কোনও নামের অংশ হবে না।

এটি কোড গল্ফ, তাই বাইটের মধ্যে সংক্ষিপ্ত সমাধানটি জিতে!


পরীক্ষার কেস 1 থেকে আউটপুটটির সময়কাল কীভাবে হয়? না করা উচিত &stuff.সময়ের সরাবেন?
— GamrCorps

@ গ্যামার কর্পস আমার উল্লেখ করা উচিত: কেবলমাত্র একটি একক সময়কাল রেজোলিউশনে গ্রাস করা হয় in
— অ্যালেক্স এ

@ GamrCorps নির্দিষ্ট করার জন্য সম্পাদিত এবং এটি একটি পরীক্ষার কেস হিসাবে যুক্ত করেছে।
— অ্যালেক্স এ

তাহলে &&&&&&&&&a......................কি কেবল একটি সময়সীমা অপসারণ করা হবে?
— গ্যামারকর্পস

@ গ্যামারকর্পস হ্যাঁ
— অ্যালেক্স এ

উত্তর:


1

পাইথন 3 , 354 341 336 বাইট

import re
S=re.sub
def f(x):
	r=x.splitlines();C=r[-1].strip('%put ');D=0
	while D!=C:
		D=C
		for a in sorted([l.strip('%let ').replace(" ","").split(';')[0].split('=')for l in r[:-1]],key=lambda y:-len(y[0])):
			s=1
			while s:C,s=re.subn('&'+a[0]+'(\.?)',a[1]+'😍\\1',S('😍+\.([^\.])','\\1',C),0,re.I)
	return S('😍+\.?','',C)

এটি অনলাইন চেষ্টা করুন!

সম্পাদনা করুন: কিছু সহজ সংক্ষিপ্তকরণ

সম্পাদনা করুন: [:: - 1] (5 বাইট) এর পরিবর্তে বিলে ((...) দ্বারা সাজানোর বিপরীতে, জোনাথন ফ্রেচকে ধন্যবাদ!

Ungolfed

import re
S=re.sub # new name for the function re.sub()
def f(x):
    r=x.splitlines() # input string to list of rows
    C=r[-1].strip('%put ') # get the string to put (from the last row)
    D=0
    while(D!=C): # iterate until the result does not change
        D=C
        for a in                                                                                                                    : # iterate over the list of variables
                 sorted(                                                                          ,key=lambda y:len(y[0]),reverse=1) # sort list for greediness by decreasing var.name lengths
                        [l.strip('%let ') # cut the 'let' keyword
                                         .replace(" ","") # erase spaces
                                                         .split(';')[0] # cut parts after ';'
                                                                       .split('=') # create [variable_name,value] list
                                                                                  for l in r[:-1]] # for each row but last
            s=1
            while(s): # iterate until the result does not change
                C,s=re.subn( # substitute
                            '&'+a[0]+'(\.?)', # &varname. or &varname
                                                 a[1]+'😍\\1', # to value😍. or value😍
                                                              S('😍+\.([^\.])','\\1',C), # in the string we can get from C erasing (😍's)(.) sequences if the next char is not .
                                                                                        0,re.I) # substituting is case insensitive
    return S('😍+\.?','',C) # erase smileys and one .

আমি পাইথন টিপস পৃষ্ঠায় অনেক কিছু নেওয়ার পরামর্শ দেব । নন-যৌগিক স্টেটমেন্ট কনটেনটেশন ( ;), প্রথম বন্ধনী হ্রাস ( if(...)-> if ...) এবং তালিকা ক্রিয়াকলাপ ( ,reverse=1-> [::-1]) এর মতো তুচ্ছ অপ্টিমাইজেশন সহজেই কিছু বাইট সংরক্ষণ করতে পারে।
— জোনাথন ফ্রেচ

ধন্যবাদ! আমি এটি আগে পড়েছি, তবে এটি অনেক দিন আগে ছিল এবং আমি কিছু কৌশল ভুলে গিয়েছিলাম।
— mmmntag

আপনি স্বাগত জানাই। len(y[0]))[::-1]হতে পারে -len(y[0]))।
— জোনাথন ফ্রেচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.