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


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.