ওয়ার্ডম্যাথ ট্রান্সপ্লাইল করুন


25

আমরা সকলেই সেই অনলাইন "ম্যাথ্স হ্যাক্স" দেখেছি যা দেখতে এইরকম:

Think of a number, divide by 2, multiply by 0, add 8.

এবং, যাদু দ্বারা, সবাই 8 নম্বর দিয়ে শেষ!


ভাষা

আসুন একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ সংজ্ঞায়িত করুন যা উপরের পাঠ্যের সিনট্যাক্স ব্যবহার করে, "ওয়ার্ডম্যাথ" বলে। ওয়ার্ডম্যাথ স্ক্রিপ্টগুলি এই টেম্পলেটটি অনুসরণ করে:

Think of a number, <commandlist>.

যার মূল অর্থ: প্রাথমিক সংগ্রহকারীর হিসাবে একটি সংখ্যা (এসটিডিআইএন থেকে ইনপুট হিসাবে) নিন, এটিতে সমস্ত কমান্ড সম্পাদন করুন এবং ফলাফলটি আউটপুট করুন।

কমান্ডগুলি ডিলিমিটার ,(কমা + স্পেস) দ্বারা পৃথক করা হয় । বৈধ কমান্ডগুলি হ'ল (দ্রষ্টব্য যা #একটি অ-নেতিবাচক পূর্ণসংখ্যাকে উপস্থাপন করে :) :

  • add # / subtract # - সংযোজক থেকে মান যোগ / বিয়োগ করুন।
  • divide by #/ multiply by #- ফ্লোরডিভ / প্রদত্ত মান দ্বারা গুণ করে।
  • subtract from #- অনুরূপ subtract, কিন্তু acc = # - accপরিবর্তে নাacc = acc - #
  • repeat- আবার শেষ আদেশ করুন। এটি প্রথম কমান্ড হতে পারে না, তবে আপনাকে অবশ্যই একাধিকবার পুনরাবৃত্তি সমর্থন করতে হবে।

চ্যালেঞ্জ

আপনার টাস্ক একটি প্রোগ্রাম বা ফাংশন যা ইনপুট এবং এর মতো কোন বৈধ WordMath স্ক্রিপ্ট লাগে তৈরি করা transpiles একই ভাষায় আপনার কোডে হয় - একটি বৈধ পুরো প্রোগ্রাম সেটিকে।

উদাহরণস্বরূপ, যদি আমার কোডটি পাইথন 2 এ থাকে এবং স্ক্রিপ্টটি হয়:

Think of a number, subtract from 10, add 10, multiply by 2.

আউটপুটযুক্ত প্রোগ্রামটি হতে পারে:

a = input()
a = 10 - a
a += 10
a *= 2
print(a)

বা বিকল্পভাবে:

print(((10-input())+10)*2)

যতক্ষণ না এটি একটি সম্পূর্ণ প্রোগ্রাম যা ইনপুট নেয় STDINএবং প্রিন্ট করে STDOUT, বা ভাষার নিকটতম সমতুল্য।


বিধি

  • আপনার মূল প্রোগ্রামটি ধরে নিতে পারে যে ইনপুটটি সর্বদা একটি বৈধ ওয়ার্ডম্যাথ স্ক্রিপ্ট।
  • স্থানান্তরিত প্রোগ্রামগুলিকে 0 দ্বারা ভাগ করার মতো গাণিতিক ত্রুটিগুলি পরিচালনা করতে হবে না।
  • স্থানান্তরিত প্রোগ্রামগুলি ধরে নিতে পারে যে ইনপুটটি আপনার ভাষার মানক পূর্ণসংখ্যার ব্যাপ্তির মধ্যে বৈধ স্বাক্ষরিত পূর্ণসংখ্যার প্রতিনিধিত্ব করে।
  • এটি , তাই সংক্ষিপ্ততম সমাধান (বাইটে) জিতেছে।
  • আপনার আসল প্রোগ্রামের কেবলমাত্র বাইট গণনাটিই - আউটপুট কোডটি আপনি যতক্ষণ চাই দীর্ঘ হতে পারে!

উদাহরণ স্ক্রিপ্ট

উদাহরণ 1:

Think of a number. 

ইনপুট নিন, কিছুই করবেন না, এটি প্রদর্শন করুন: ওয়ার্ডম্যাথের বিড়াল প্রোগ্রাম।

উদাহরণ 2:

Think of a number, divide by 5, subtract from 9.

মনে রাখবেন যে "বিভাজন" তল বিভাগ, তাই এই প্রোগ্রামের জন্য 6 -> 8, এবং 29 -> 4

উদাহরণ 3:

Think of a number, add 5, add 10, multiply by 2, subtract 15, repeat, divide by 2.

বর্ধিত বিড়াল প্রোগ্রাম!

উদাহরণ 4:

Think of a number, subtract 1, repeat, repeat.

একটি সংখ্যা নেয় এবং 3 টি বিয়োগ করে।


আমাদের কি একটানা পুনরাবৃত্তি সমর্থন করতে হবে?
darrylyeo

1
ভাষাটি যখন ডিফল্ট টাইপ হয় / যদি এটি পূর্ণসংখ্যাকে সমর্থন করে না তখন আমরা কী ভাসা ব্যবহার করতে পারি?
রেইনার পি।

@RainerP। কেবলমাত্র ভাষাটি পূর্ণসংখ্যা / পূর্ণসংখ্যা বিভাগকে সমর্থন করে না
ফ্লিপট্যাক

1
এর প্রত্যাশিত ফলাফল কী -5/3? আমরা কি 0নেতিবাচক অনন্তের দিকে বা দিকে ঘুরছি?
মার্টিন এন্ডার

1
@ মার্টিনএন্ডারে আমি নেতিবাচক অনন্তের দিকে চেয়েছি কারণ এটি তল বিভাজন, তবে যদি আপনার ভাষা 0 এর দিকে পূর্ণসংখ্যা বিভাজন প্রয়োগ করে তবে তা খুব ভাল।
ফ্লিপট্যাক

উত্তর:


6

05 এ বি 1 ই , 59 56 54 52 বাইট

„, ¡¦vyDþs.AJá'bK"dmas""/*+-"‡„-f„s-.:«D'rQi®}©}J'rK

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

আমার মস্তিষ্ক তার পরে নরকের মতো ব্যথা করছে ... এটি 05AB1E কোডে নিম্নলিখিত ফলাফল রয়েছে:

  • Think of a Number অন্তর্নিহিত ইনপুট কারণে সরানো হয়েছে।
  • Subtract From #কভারেটস #s-(সোয়াপ aএবংb অপারেশন সম্পাদন)।
  • Subtract # রূপান্তর #-
  • Add # রূপান্তর #+
  • Multiply by # রূপান্তর #*
  • Divide by # রূপান্তর #/
  • Repeat সর্বশেষে যা রেজিস্টারে সঞ্চিত ছিল তা ধরে ফেলে এবং তাতে সম্মতি জানায়।

ব্যাখ্যা:

„, ¡                                                 # Split on ', '.
    ¦                                                # Remove the 'Think of a number'.
     vy                                        }     # Loop through chunks.
       Dþs                                           # Dupe, push only digits, swap.
          .AJá                                       # Acronymify without digits.
              'bK                                    # Remove the `b`.
                 "dmas""/*+-"‡                       # Replace letters with OPs.
                              „-f„s-.:               # Replace '-f' with 's-'.
                                      «              # Concat # with OP.
                                       D'rQ          # Dupe, push 1 if OP='r'.
                                           i®}       # If 'r', push last #OP.
                                              ©      # Store current OP.
                                                J'rK # Join, remove remaining r's.

উদাহরণ:

ইনপুট:

Think of a number, divide by 2, multiply by 10, add 8, subtract 6, subtract from 9, repeat, repeat, subtract 41.

আউটপুট:

2/10*8+6-9s-9s-9s-41-

10 এর ইনপুট দিয়ে সমাধান চেষ্টা করুন:

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

এটি গুগলে দেখুন:

গুগলে টাইপ করা একই সমীকরণের লিঙ্ক এখানে।


13

সি প্রিপ্রসেসর, 362 বাইট

আমি প্রায় সি প্রিপ্রসেসরটি কেবল এটির কাজ পেয়েছি, তবে পুনরাবৃত্তি আদেশটি কার্যকর করা খুব কঠিন হতে পারে। সুতরাং পরিবর্তে আমি প্রিপ্রসেসর ব্যবহার করে ইনপুটটিকে একটি অ্যারে রূপান্তরিত করলাম যা পরে কিছু অতিরিক্ত কোড দ্বারা ব্যাখ্যা করা হয়।

main(){int c[]={
#define Think 
#define of
#define a
#define number 0
#define add 1,
#define subtract 2,
#define from 0,3,
#define multiply 4,
#define divide 5,
#define by
#define repeat 6, 0
#include "input.wm"
,'$'};int _,l,v;scanf("%d", &_);for(int i=1;c[i]-'$';++i){c[i]!=6?l=c[i],v=c[++i]:++i;l==1?_+=v:l==2?_-=v:l==3?_=v-_:l==4?_*=v:_/=v;}printf("%d",_);}

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

যাইহোক, একবার আপনি যখন আপনার ওয়ার্ডম্যাথ উত্সটি ইনপুটগুলিতে ডাম্প করুন a


2
দ্রষ্টব্য: আপনি পুনরাবৃত্তিটি শেষ করলে দুর্ভাগ্যক্রমে কিছু সংকলকগুলির সাথে এটি ব্যর্থ হয়। এটি কারণ যে 0 এর পরে তারা একটি জায়গা টস করে এবং তারপরে একটি বিভ্রান্ত সময়সীমা দেখে এবং এটি দিয়ে কী করতে পারে তা জানে না।
লাম্বদাবেতা

চতুর, আমি মুগ্ধ
বিড়াল

7

রেটিনা, 170 বাইট

কারণ কে এটি দেখতে চাইবে না ?!

আমি একটি রেটিনা সমাধান দেখতে কতটা ভয়ঙ্কর হবে তা ভেবেছিলাম এবং আমি এটিকে দ্রুত তৈরি করার সিদ্ধান্ত নিয়েছি। এটি মাত্র এক ঘন্টা সময় নিয়েছে। যথারীতি, বাইট গণনাটি আইএসও 8859-1 এনকোডিং অনুমান করে।

S`, 
\.

T.*
.*¶$$*
\;+`(.*)¶rep.*(¶?)
$1¶$1$2
\d+
$*
.*f.* (1*)
1¶x¶$¶$1¶+`x1¶
m.* 
1¶
di.* (1*)
^¶$1 ¶^(1+) (\1)+1*$¶x$$#+¶1+ 1*¶x0¶x\d+¶$$*
s.* (1*)
^$1¶
a.* 
^¶
\z
¶1

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

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

ব্যাখ্যা:

S`,                 # Split input on ", " putting each command on its own line
\.                  # Remove the period

T.*                 # Think of a number -> .*\n$* (replaces input with unary)
.*¶$$*
\;+`(.*)¶rep.*(¶?)  # Loop, replacing "repeat" with the line before it
$1¶$1$2
\d+                 # Replace all numbers with their unary representation
$*
.*f.* (1*)          # Replace "subtract from " with a subtract from program
1¶x¶$¶$1¶+`x1¶
m.*                 # Replace "multiply by " with a multiply program
1¶
di.* (1*)           # Replace "divide by " by my integer division program
^¶$1 ¶^(1+) (\1)+1*$¶x$$#+¶1+ 1*¶x0¶x\d+¶$$*
s.* (1*)            # Replace "subtract " with a subtraction program
^$1¶
a.*                 # Replace "add " with an addition program
^¶
\z                  # At the end, add a stage to change unary into decimal
¶1

গণিত প্রোগ্রাম:

যোগ করুন

শুরুতে একের সংখ্যা যুক্ত করুন। 5 যোগ করুন:

^
1111

বিয়োগ:

শুরু থেকে যেকোন সংখ্যা সরান। বিয়োগ 5:

^11111

এর থেকে বিয়োগ:

1এর সাথে ইনপুট গুলি প্রতিস্থাপন করুন x। স্থির সংখ্যার পাশে রাখুন। বারবার সরান x1। 10 থেকে বিয়োগ:

1
x
$
1111111111
+`x1

গুন করা:

1তাদের একটি নির্দিষ্ট সংখ্যার সাথে প্রতিস্থাপন করুন। 3 দ্বারা গুণ করুন:

1
111

দ্বারা বিভক্ত করা:

এটি পূর্ণসংখ্যা বিভাগের জন্য আমার রেটিনা প্রোগ্রামটি ব্যবহার করে । 2 দ্বারা ভাগ করুন:

^                   # Place the fixed divisor before the dividend
11 
^(.+) (\1)+.*$      # Match the divisor, followed by each occurrence in the dividend.
x$#+                # Replace with the number of matches. Trailing ones are dropped
.+ .*               # If there are still two numbers, the result is zero
x0
x\d+                # Replace result (marked with an 'x') with unary
$*

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

@ মার্টিনএন্ডার আমি বিয়োগটি ঠিক করতে পারি যদি আপনি ব্যাখ্যা করেন যে এই সরলীকৃত প্রোগ্রামটি কেন আউটপুটে দুটি দেয়। retina.tryitonline.net/#code=JArCtjE&input=dGVzdAo
mbomb007

কারণ $স্ট্রিংয়ের একেবারে শেষে বা একটি পেছনের লাইনের আগে মিল রয়েছে line আপনি প্রয়োজন \zযদি আপনি কেবল প্রাক্তন চান।
মার্টিন ইন্ডার

4

GNU awk, 139 বাইট

BEGIN{RS="[,.]";c="{}{";ORS=";"}
/ad/{c="+="$2}
/c/{c="-="$2}
/om/{c="="$3"-$0"}
/l/{c="*="$3}
/v/{c="=int($0/"$3")"}
!NF{c="}1"}
$0="$0"c

আবাহন:

$> awk `awk -f wordmath <<< "Think of a number, add 1, repeat, repeat."` <<< 0
$> 3

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

$> awk -f wordmath <<< "Think of a number."  
$> $0{}{;$0}1;

$> awk -f wordmath <<< "Think of a number, divide by 5, subtract from 9."
$> $0{}{;$0=int($0/5);$0=9-$0;$0}1;

$> awk -f wordmath <<< "Think of a number, add 5, add 10, multiply by 2, subtract 15, repeat, divide by 2."
$> $0{}{;$0+=5;$0+=10;$0*=2;$0-=15;$0-=15;$0=int($0/2);$0}1;

4

হাস্কেল, 232 231 বাইট

অবশ্যই একটি ফাংশনাল প্রোগ্রামার একটি প্রোগ্রামকে প্রতিনিধিত্ব করে স্ট্রিংয়ের পরিবর্তে কোনও ফাংশন ফিরিয়ে দিতে পছন্দ করবে, তবে আমরা এখানে যাচ্ছি:

t l="main=getLine>>=print."++""%words l++"(0+).read"
x%((o:_):f:n:r)|o=='m'=h"*"n r|o=='d'=h"`div`"n r|f=="from"=h"(-)"n r
x%(s:n:r)|s=="add"=h"+"n r|s!!0=='s'=h s(' ':n)r
x%(_:r)=x%r++x
_%_=""
h s n r|x<-'(':s++init n++")."=x%r++x

মন্তব্যসমূহ: আমরা সর্বদা শূন্য যুক্ত করেই শুরু করি, অন্যথায় তুচ্ছ ওয়ার্ডম্যাথ প্রোগ্রামটি প্রতিস্থাপনটি যে ধরণের readব্যবহৃত হয় তা অনুমান করার জন্য পর্যাপ্ত তথ্য দেয় না । subtract from nহিসাবে বাস্তবায়িত হতে পারে (n-), তবে আমি ((-)n)আরও অভিন্নতার জন্য ব্যবহার করি । ক্ষেত্রে subtract nআমি কপি subtractইনপুট থেকে তাই আমি লিখতে হবে না, কিন্তু আমি শেষে অনুপস্থিত স্থান জন্য ক্ষতিপূরণ করা প্রয়োজন।repeatডিফল্ট অপারেশন হিসাবে ব্যবহৃত হয়; খালি প্রাথমিক পূর্ববর্তী ক্রিয়াকলাপের সাথে একত্রে এটি প্রথম চারটি শব্দের সহজে উপেক্ষা করার অনুমতি দেয়।

ব্যবহারের উদাহরণ:

*Main> t "Think of a number. "
"main=getLine>>=print.(0+).read" 

অন্যান্য উদাহরণ নিম্নলিখিত ফলাফল দেয়:

"main=getLine>>=print.((-)9).(`div`5).(0+).read"
"main=getLine>>=print.(`div`2).(subtract 15).(subtract 15).(*2).(+10).(+5).(0+).read"  
"main=getLine>>=print.(subtract 1).(subtract 1).(subtract 1).(0+).read"

কেবল কৌতূহল, আপনি স্ট্রিংয়ের পরিবর্তে ফাংশনটি কীভাবে তৈরি করবেন?
সাইয়েস

একটি কার্যনির্বাহী প্রোগ্রামিং ভাষায়, একটি ফাংশন তৈরি করা এবং রচনা করা কোনও স্ট্রিং তৈরি এবং সংযোজন করার চেয়ে বেশি অসুবিধা নয়। hএর মতো কিছু দেখতে h s n r|x<-s.read.init$n=x%r.xএবং প্রথম যুক্তির সাথে ডাকা যেতে পারে যেমন একটি ফাংশন h(+)n r(এবং flipসঠিক অপারেটর অর্ডার পেতে কিছুটা কোথাও হওয়া দরকার ), বেস কেস _%_=id। প্রধান ফাংশন সমস্ত বয়লারপ্লেট এড়াতে পারে এবং ঠিক হতে পারে t l=id%words l। - তরকারী করার জন্য ধন্যবাদ, এটি দোভাষী হিসাবে দেখা যেতে পারে, এবং এই ধারণাটি একটি সহজ এবং / অথবা আরও ছোট সমাধানের দিকে নিয়ে যেতে পারে।
খ্রিস্টান সিভর্স

4

পাইথন 2, 263 258 260 221 বাইট

এটি সম্ভবত এখনও আরও খাটো হতে পারে।

def r(s,o="",p=""):c=s.pop(0);c=[c,p]['re'in c];n=c.split()[-1];o=[[o+[['+-'['s'in c],'//']['v'in c],'*']['m'in c]+n,n+'-'+o]['f'in c],'input()']['T'in c];return s and r(s,"(%s)"%o,c)or o
lambda s:"print "+r(s.split(','))

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

আমি এর //পরিবর্তে ব্যবহার করি/ , কারণ শেষ নির্দেশনার .শেষে একটি থাকবে , যে কোনও সংখ্যক ফ্লোট তৈরি করে। সুতরাং বিভাগকে ধারাবাহিক রাখতে আমি পূর্ণসংখ্যা বিভাগ ব্যবহার করি।

পরীক্ষার ক্ষেত্রে ফলাফল:

print input()
print 9.-((input())//5)
print ((((((input())+5)+10)+10)-15)-15)//2.
print (((input())-1)-1)-1

যদি আপনি সেই বৃহত ব্লকটি নিম্নলিখিতটির ifজন্য পরিবর্তন oকরেন (যা আমি মনে করি যে কাজ করা উচিত): o=[[o+[['+-'['s'in c],'//']['v'in c],'*']['m'in c]+n,n+'-'+o]['f'in c],'input()']['T'in c]আপনি এটি 224 এ নামিয়ে আনতে পারেন
কেড

@ কেড হ্যাঁ, এটি এখনও সুগঠিত ছিল। থাকতে পারে না।
mbomb007

@ কিউস নো, ল্যাম্বডাকে ডেকে আনা খুব কার্যকর কাজটি সম্ভবত তার সাশ্রয়ের চেয়ে বেশি ব্যয় করতে পারে। এটি পরিশোধের জন্য কল প্রতি 4 বা 5 বাইট সঞ্চয় করতে হবে।
mbomb007

4

বেফুঞ্জ, 342 305 বাইট

>~$1 +:89+`#v_801p
  v_^#`+85~$<
1+>~:5+88+/3-!#v_$
v`"/":~p8p10+1<>>:"/"`!|
 "+"\5+8p4+:1+^:p11:g10<  >:"+"\2+8p:"*"\3+8p:
_$7%:01g\!#v_\2-7g\:1+:01v^p8+1\"5":p8\"5":g10
#8\"\"$#:0#<^v<p8p8\<g80p<>\#+$#12#p
-/+* >:#,_@  #^p8g10<
".@"<^"&"
10<v0<\g8-\g11:<:p1>#1+g11:p10+g
-:^>1g\-8p1-::#^_$8g^  >$$01g11g

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

আউটপুট

এটি উত্পন্ন কোডটি একটি &(ইনপুট মান) কমান্ড দিয়ে শুরু হয় এবং .(আউটপুট মান) এবং @(প্রস্থান) কমান্ডের সাহায্যে শেষ হয়। মধ্যে আমরা আকারে বিভিন্ন গণনার ইন আছে <number><operation>, যেখানে অপারেশন হতে পারে +(যোগ করুন), -(বিয়োগ), /(দ্বারা বিভক্ত করা), *(সংখ্যাবৃদ্ধি দ্বারা), এবং \-(থেকে বিয়োগ)।

সংখ্যা কারণ Befunge শুধুমাত্র পরিসর 0 9 সাংখ্যিক লিটারেল সমর্থন যাতে চাহিদা চেয়ে বড় কিছু নিজে গণনা করা থেকে নিজেকে একটু জটিল। যেহেতু আমরা ইতিমধ্যে অক্ষরে অক্ষরে সংখ্যাগুলি পড়ছি, তাই প্রতিটি সংখ্যা যেমন পড়ছে আমরা কেবল সংখ্যাটি তৈরি করি, উদাহরণস্বরূপ, 123 হয়ে যায় 155+*2+55+*3+, অর্থাত্(((1 * 10) + 2) * 10) + 3

উদাহরণ

Input:  Think of a number.
Output: &.@

Input:  Think of a number, divide by 5, subtract from 9.
Output: &5/9\-.@

Input:  Think of a number, add 5, add 10, multiply by 2, subtract 15, repeat, divide by 2.
Output: &5+155+*0++2*155+*5+-155+*5+-2/.@

Input:  Think of a number, subtract 1, repeat, repeat.
Output: &1-1-1-.@

ব্যাখ্যা

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

কমান্ডটি বিশ্লেষণ করতে, আমরা কোনও অঙ্ক বা বিভাজক না পৌঁছানো অবধি অক্ষর গণনা করে চলি। যদি এটি বিভাজক হয় তবে এটি অবশ্যই পুনরাবৃত্ত আদেশ হবে যা আমরা একটি বিশেষ কেস হিসাবে পরিচালনা করি। যদি এটি একটি অঙ্ক হয় তবে আমরা এটিকে আমাদের আউটপুট বাফারে যুক্ত করব এবং আরও সংখ্যার সন্ধান করা চালিয়ে যাব। প্রতিবার কোনও অঙ্ক আউটপুট হলে আমরা এটির সাথে উপরিবর্তিত করে 55+*(এখন পর্যন্ত মোট 10 টি গুণ করে) এবং এটি দিয়ে প্রত্যয়+ (মোটে যোগ করার জন্য । অঙ্কগুলি শেষ হয়ে গেলে আমরা কমান্ড অক্ষর যুক্ত করব।

কমান্ডটি কীভাবে নির্ধারিত হয়, আমরা প্রথম অঙ্কের মডুলো characters পর্যন্ত অক্ষরের সংখ্যা গণনা করি For যোগ করার জন্য এটি 4 হয় (নিম্নোক্ত স্থান সহ) এটি 3 বিয়োগের জন্য, এটি 3 দ্বারা বিভক্ত করার জন্য, এটি 5 দ্বারা গুণিত করার জন্য , এবং এটি থেকে বিয়োগের জন্য 0 থেকে বিয়োগফল জন্য কিছুটা অতিরিক্ত হ্যান্ডলিং দরকার কারণ এটি \-কমান্ড কম্বো প্রয়োজন, তবে অন্যরা কেবল তাদের মানটি একটি সারণীতে উপযুক্ত কমান্ড অক্ষরের সন্ধান করতে ব্যবহার করেন।

প্রতিটি কমান্ডের জন্য এই প্রক্রিয়াটি পুনরাবৃত্তি করা হয়, আটটি লাইনে পূর্বনির্মাণযুক্ত স্ট্রিংয়ে আউটপুট তৈরি করে প্রতিবার একটি অতিরিক্ত কমান্ড যুক্ত করা হয়, আমরা এটি সর্বদা সঠিকভাবে বন্ধ হয়ে যায় তা নিশ্চিত করার জন্য স্ট্রিংয়ের একটি ক্লোজিং উদ্ধৃতি যুক্ত করি। তারপরে যখন আমরা শেষ পর্যন্ত আমাদের ইনপুটটির শেষে পৌঁছে যাই তখন আমরা স্ট্রিংটিতে এটি চাপানোর জন্য এই স্ট্রিংটি কেবল "চালিত" করি, তারপরে এটি সমস্ত লেখার জন্য একটি স্ট্যান্ডার্ড আউটপুট ক্রম দিয়ে অনুসরণ করুন।


3

জাভাস্ক্রিপ্ট (ES6), 163 বাইট

w=>w.split`, `.map(l=>(o={a:'+',s:'-',m:'*',d:'/'}[a=l[0]])?p=(x=l.split` `.pop(),l[9]=='f'?x+`-n`:`n`+o+x+`|0`):a<'r'?'n=+prompt()':p).join`
n=`+`
console.log(n)`

এটি চেষ্টা করুন:

f=w=>w.split`, `.map(l=>(o={a:'+',s:'-',m:'*',d:'/'}[a=l[0]])?p=(x=l.split` `.pop(),l[9]=='f'?x+`-n`:`n`+o+x+`|0`):a<'r'?'n=+prompt()':p).join`
n=`+`
console.log(n)`

const program = f('Think of a number, add 5, add 10, multiply by 2, subtract 15, repeat, divide by 2.')
document.write('<pre>' + program + '</pre>' )

eval(program)

/*
Outputs:

n=+prompt()
n=n+5|0
n=n+10|0
n=n*2|0
n=n-15|0
n=n-15|0
n=n/2.|0
console.log(n)
*/


3

Vim 208 171 168 বাইট

@ Flp.Tkc অনুসারে পরপর একাধিক পুনরাবৃত্তি করার ক্ষমতা যুক্ত করা হয়েছে তবে যথেষ্ট বাইটগুলি গল্ফ করেছে যে আমি এখনও বাইট সংখ্যাটি হ্রাস করতে পারি।

:map s :s;\v
c4wcw="s, s\w* \w+ (\d+); *-1+\1);g
s, ([adms]).{-}(\d+); \1\2);g
qws(\S+), r\w+;\1 \1
@wq@ws.*;\=tr(submatch(0),'adms','+/*-')
qq])T=i(@qq@qx$xA

TryItOnline

ছাপানো অক্ষর:

:map s :s;\v
c4wcw^V^R=^V^R"^[s, s\w* \w+ (\d+); *-1+\1);g
s, ([adms]).{-}(\d+); \1\2);g
qws(\S+), r\w+;\1 \1
@wq@ws.*;\=tr(submatch(0),'adms','+/*-')
qq])T=i(^[@qq@qx$xA
^V^[^[

পরীক্ষার ক্ষেত্রে ফলাফল:

  1. cw^R=^R" ^[ TryItOnline
  2. cw^R=((^R" /5) *-1+9) ^[ TryItOnline
  3. cw^R=((((((^R" +5) +10) *2) -15) -15) /2) ^[ TryItOnline

এটি একাধিক পরপর পুনরাবৃত্তি করার জন্য কাজ করে না বলে মনে হচ্ছে।
ফ্লিপট্যাক

@ Flp.Tkc স্থির হয়েছে, আপনাকে ধন্যবাদ! আমি এর আগে খেয়াল করিনি।
nmjcman101

2

lex, 246 বাইট

%{
#define P printf
#define O P("n%s%d;",c,v);
int v;char*c;
%}
%%
T {P("%%%%\n.* {int n=atoi(yytext);");}
ad {c="+=";}
fr {c="=-n+";}
s {c="-=";}
v {c="/=";}
l {c="*=";}
re {O}
[0-9]+ {v=atoi(yytext);O}
\. P("printf(\"%%d\",n);}\n%%%%");
. ;
%%

সিটিতে লেক্স লক্ষ্যবস্তু, সুতরাং একটি সি সংকলক এটি কার্যকরযোগ্য কিছুতে এটি সংকলন করতে হবে। লেক্সার গ্রন্থাগার (ll ) এছাড়াও সংযুক্ত করা প্রয়োজন। এটি বাইট-পেনাল্টি যুক্ত করতে পারে তবে আমি নিশ্চিত না যে এটি কত বাইট রয়েছে।

প্রোগ্রামটি একটি লেক্স প্রোগ্রাম (প্রতি স্পেসিফিকেশন) আউটপুট করে যা ট্রান্সপ্লেরড ওয়ার্ডম্যাথ এক্সপ্রেশনকে মূল্যায়ন করে। এর মধ্যে %{এবং কোডটি কেবল %}"ট্রান্সপোর্টার" এর জন্য:

#define P printf              /* for brevity */
#define O P("n%s%d;",c,v)     /* expression builder, calls P = printf */
int v;char*c;                 /* v=most recent integer read */
                              /* c=the expression infix */

দুটি %%লাইনের মধ্যে রয়েছে রেজেক্স / ক্রিয়া অংশ। প্রথম নিয়মটি মিলবে T("চিন্তা করুন ...") যা উপস্থাপিকা তৈরি করে (লেক্স প্রোগ্রামগুলি অবশ্যই কমপক্ষে নিয়ম বিভাগটি অন্তর্ভুক্ত করে এবংyytext এটি শেষের সাথে মিলের পাঠ্য হবে, তাই নিয়মটি মূলত ব্যবহারকারীর ইনপুট সহ সঞ্চালককে বীজ করে )।

যে জন্য ব্যতীত সমস্ত ইনপুট প্রোগ্রাম পরিত্যাগ যা মিলেছে হয়, এবং অন্যান্য বিধি ( ad, frআপ থেকে re) যতটা সম্ভব সংক্ষিপ্ত একটি ম্যাচ অনন্য হওয়া দিয়ে wordmath অভিব্যক্তি ক্লজ হ্যান্ডেল। এর বেশিরভাগ ক্ষেত্রে এটি cএকটি এক্সপ্রেশন ইনফিক্সে সেট হয়, যা ডাকা nহওয়ার সাথে সাথে শেষ সংখ্যার পড়ার মাঝে সংমিশ্রিত Oহয় (উদাহরণস্বরূপ, "9 যোগ" পড়ার ফলে ইনফিক্সটি +=, ভিতে 9, এবং কলটি Oআউটপুট হবে n+=9;) । (একটি আকর্ষণীয় বিষয় হ'ল "8 থেকে বিয়োগ" উভয় sএবং frবিধি উভয়ই মিলে যাওয়ার কারণ হবে , তবে যেহেতু Oকেবলমাত্র সংখ্যায় বলা হয়, তাই সঠিক নিয়মn=-n+8; আউটপুট পাওয়ার একমাত্র অভিব্যক্তি)। re"পুনরাবৃত্তি" শুধু কলের জন্য নিয়মOআবার, যা সর্বশেষ তৈরি হওয়া এক্সপ্রেশনকে আউটপুট করে (এবং যেহেতু পরবর্তী ম্যাচগুলি ক্লোবার হবে yytext, "পুনরাবৃত্তি" সমর্থন করে কেন [0-9]+নিয়মে পূর্ণসংখ্যার রূপান্তর প্রয়োজন হয়েছিল)। অবশেষে, একটি সময়কালের ফলে প্রোগ্রামের ট্রেলারটি আউটপুট হয়ে যায়, যা কেবল সংযোজককে আউটপুট দেয় এবং %%আউটপুট লেক্স প্রোগ্রামের সমাপ্তি বোঝাতে জোড়াটি বন্ধ করে দেয় ।

দ্রষ্টব্য: মূল ট্রান্সপনার প্রোগ্রাম বা আউটপুট প্রোগ্রামটি শেষ হবে না। পাইপিং ইনপুট কাজ করবে বা ইওএফ সরবরাহ করবে (সিটিআরএল-ডি)। যদি প্রথম ইনপুট পরে সমাপ্তির প্রয়োজন হয়, প্রস্থান (গুলি) যুক্ত করা যেতে পারে।

বিল্ড / রান করতে:

Build the main program:
% lex -o wordmath.yy.c wordmath.l
% cc -o wordmath wordmath.yy.c -ll

Execute to create a specific transpiled program:
% echo "This is a number, add 8, subtract 5, repeat." | ./wordmath > program.l

Build the transpiled program:
% lex -o program.yy.c program.l
% cc -o program program.yy.c -ll

Execute the transpiled program (with input 3, called via a pipe or inline):
% echo 3 | ./program
1
% ./program
3
1
^D
%

পরীক্ষা 1:

%%
.* {int n=atoi(yytext);printf("%d",n);}
%%

পরীক্ষা 2:

%%
.* {int n=atoi(yytext);n/=5;n=-n+9;printf("%d",n);}
%%

পরীক্ষা 3:

%%
.* {int n=atoi(yytext);n+=5;n+=10;n*=2;n-=15;n-=15;n/=2;printf("%d",n);}
%%

পরীক্ষা 4:

%%
.* {int n=atoi(yytext);n-=1;n-=1;n-=1;printf("%d",n);}
%%

2

পাইথ, 69 67 বাইট

J\QVtcQ\,Iq@N1\r=NZ)=Jjd+@"+-/*"x"asdm"@N1.>,J-ecN)\.qh@cN)1\f=ZN)J

একটি প্রোগ্রাম যা একটি এর ইনপুট নেয় "quoted string"এবং ফলাফল মুদ্রণ করে।

পরীক্ষা স্যুট

কিভাবে এটা কাজ করে

পাইথের প্রিফিক্স অপারেটর রয়েছে তাই প্রাথমিক গাণিতিক ক্রিয়াকলাপগুলি ব্যবহার করে সঞ্চালিত হয় (operator)(operand1)(operand2), যখন প্রাক-প্রারম্ভিক পরিবর্তনশীল Qইনপুট দেয়। সুতরাং, স্ট্রিং দিয়ে শুরু করে একটি ট্রান্সপ্লেরড ওয়ার্ডম্যাথ প্রোগ্রাম তৈরি করা হয়েছে'Q' এবং প্রতিটি পর্যায়ে অপারেটরকে প্রিপেন্ড করে, এবং তারপরে প্রিন্টিং বা সংযোজনীয় হিসাবে সংযোজন করে তৈরি করা হয়।

J\QJস্ট্রিংয়ে স্থানান্তরিত প্রোগ্রাম স্ট্রিংটি সেট করুন'Q'

tcQ\, কমাতে ইনপুট বিভক্ত করুন এবং প্রথম উপাদানটি বাতিল করুন (যা 'Think of a number' )

V জন্য Nহয়:

  • Iq@N1\r চরিত্রটি যদি N[1]হয়'r' (পুনরাবৃত্তি):
    • =NZসেট Nকরুন Z(এর পূর্বের মান N, লুপের শেষে সেট)
  • x"asdm"@N1 এর সূচকটি N[1]সন্ধান করুন"asdm" (যোগ, বিয়োগ, ভাগ, গুণ)
  • @"+-/*""+-/*"প্রয়োজনীয় অপারেটর দিয়ে এর সাথে সূচক
  • ,J-eCN)\.দ্বি-এলিমেন্টের তালিকার সন্ধান করুন [J, -eCN)\.], যেখানে দ্বিতীয় উপাদানটি Nকোনও '.'অক্ষর মুছে ফেলা (অপারেন্ড) বিশ্বে স্পেসে বিভাজনের শেষ উপাদান element
  • qh@cN)1\f যদি Nহোয়াইটস্পেসে বিভাজনের দ্বিতীয় উপাদানটির প্রথম অক্ষর হয় 'f'(এর থেকে বিয়োগ):
    • .> দ্বি-উপাদান তালিকার উপাদানগুলি অদলবদল করুন
  • + অপারেটর এবং দ্বি-উপাদান তালিকাটিকে একটি তালিকায় মার্জ করুন
  • =JjdJস্পেসে যোগদান করেছেন তা সেট করুন
  • =ZN সেট ZকরুনN

J ছাপা J


ভাল উত্তর মানুষ ... 05AB1E এ চেষ্টা করার জন্য আমাকে অনুপ্রাণিত করেছিলেন, যা ... প্রত্যাশার চেয়ে ভয় দেখানো ছিল।
ম্যাজিক অক্টোপাস

2

বীচি , 58 বাইট

খুব খারাপ আমি এখনও সেই বিপরীত-বিয়োগ অপারেটরটি প্রয়োগ করি নি।

{p:a:sNa?ap['Y("-y+  y- y// y+ y* "^sa@?Y`\d`)|'qa@y]}Mq^k

প্রোগ্রামটি স্টিডিন থেকে ওয়ার্ডম্যাথ স্ক্রিপ্ট নেয় এবং পাইপ কোডটি স্টডআউট আউটপুট করে। কোড যা আউটপুট হয়, একইভাবে, স্টিডিন থেকে একটি সংখ্যা নেয় এবং ফলাফলকে স্টাডআউটে আউটপুট করে। এটি অনলাইন চেষ্টা করুন!

কৌশল

এই জাতীয় ইনপুট জন্য:

Think of a number, multiply by 3, add 1.

আমরা এভাবে আউটপুট চাই:

YqYy*3Yy+1

যা নিম্নলিখিত হিসাবে কাজ করে:

Yq    Yank a line of stdin into y
Yy*3  Compute y*3 and yank result into y
Yy+1  Compute y+1 and yank result into y
      Last expression is autoprinted

অবহেলিত + ব্যাখ্যা

{
 p : a : sNa ? a p
 [
  'Y
  ("-y+  y- y// y+ y* "^s a@?Y`\d`) | 'q
  a@y
 ]
} M q^k

প্রোগ্রামটির মূল কাঠামোটি হ'ল {...}Mq^k, যা বিভক্ত q(স্টাডিনের একটি লাইন) অন k(কমা-স্পেস) এবংM প্রতিটি উপাদানকে একটি ফাংশন সরবরাহ করে।

ফাংশনের অভ্যন্তরে, আমরা repeatকেস পরিচালনা করে শুরু করি । পিপে সবচেয়ে সংক্ষিপ্ত পরীক্ষা বলে মনে হচ্ছে sNa(কমান্ডের মধ্যে কোনও স্থান আছে)। যদি তা হয় তবে আমরা ব্যবহার করতে চাই a; যদি না হয় তবে ব্যবহার করুন pযা পূর্ববর্তী কমান্ড সংরক্ষণ করে। সেই মানটি আবারও aএবং বরাদ্দ করুনp পরবর্তী সময়েও ।

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

লক্ষ্য করুন যে add (4), subtract (9), divide by (10), multiply by (12) এবং subtract from (14) এর দৈর্ঘ্য সমস্ত আলাদা। আরও পর্যবেক্ষণ করুন যে mod মড নেওয়ার পরে এগুলি এখনও স্বতন্ত্র 7. সুতরাং, আমরা যথাযথ পিপ কোডে প্রতিটি ওয়ার্ডম্যাথ কমান্ড ম্যাপ করতে একটি সাত-উপাদান তালিকাতে (পাঁচটি কোড স্নিপেট এবং দুটি স্থানধারক সমন্বিত) এগুলি ব্যবহার করতে পারি ( সহজভাবে শেষ পর্যন্ত সংক্ষিপ্ত করা যেতে পারে):

  • 0: -y+( subtract from)
  • 1: স্থানধারক
  • 2: y-( subtract)
  • 3: y//( divide by)
  • 4: y+( add)
  • 5: y*( multiply by)
  • 6: স্থানধারক

সূচকের জন্য, আমরা কমান্ড প্রথম অঙ্ক সূচী পেতে Regex ব্যবহার করুন: a@?`\d`yভবিষ্যতে ব্যবহারের জন্য আমরা রেজেজকেও ইয়াঙ্ক করে দিয়েছি । চেহারা টেবিলটি স্ট্রিংটি বিভক্ত করে তৈরি করা "-y+ y- y// y+ y* "হয়েছেs (স্থান)।

আমাদের এখনও প্রথম এন্ট্রি পরিচালনা করতে হবে, যা কোডে অনুবাদ করা উচিত Yq। যেহেতু Think of a numberকোনও সংখ্যা থাকে না, তাই@? অপারেটর শূন্য করে দেয়। অনুসন্ধান সারণীতে সূচক হিসাবে নীল ব্যবহার করাও শূন্য করে। নিল মিথ্যা, তাই আমাদের এই ক্ষেত্রে অপারেশনের পরিবর্তে |'qব্যবহারের দরকার হয় q

ফিরে আসা তালিকার চূড়ান্ত উপাদানটি হ'ল নম্বর। আমরা এটি মাধ্যমেa@y এটির মাধ্যমে পেয়েছি (আমরা পূর্বে ইয়াঙ্কড করা ডিজিটের রেজেক্সের কমান্ডে সমস্ত মিল খুঁজে পেয়েছি)। এটি ডিজিটের একটি তালিকা ফেরত দেয়, তবে আবারও, এটি কোনও সমস্যা নয় কারণ আউটপুট দেওয়ার সময় সমস্ত তালিকা একচেটিয়া করা হবে। প্রথম এন্ট্রির জন্য, a@yকোনও অঙ্কের সাথে মেলে না এবং খালি তালিকা দেয়, যা আউটপুটে কিছু যোগ করে না।

উদাহরণ স্বরূপ

ইনপুট সহ

Think of a number, subtract from 20, add 2, repeat.

মানচিত্রের এক্সপ্রেশন তালিকা দেয়

[["Y";"q";[]]; ["Y";"-y+";[2;0]]; ["Y";"y+";[2]]; ["Y";"y+";[2]]]

যা, যখন সংক্ষিপ্ত, আউটপুট

YqY-y+20Yy+2Yy+2

2

পাইথন 2 , 154 153 146 বাইট

স্থির, এবং এমনকি প্রক্রিয়াটি বিভিন্ন বাইট সংরক্ষণ। ^ __ ^

for c in input()[9:-1].split(","):s=c.rfind(" ");p=o=s and"x="+"-x+ input() x- x// x+ x*".split()[s%7]+c[s:]*(c[0]<"a")or p;print o
print"print x"

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

আমার পাইপ উত্তর হিসাবে একই কৌশল উপর ভিত্তি করে । পাইথন-নির্দিষ্ট বৈশিষ্ট্য:

  • Think of এবং .বিভাজক আগে স্ট্রিং থেকে বন্ধটি সরানো হয় (input()[9:-1] ) । পিরিয়ডটি মূল লুপটিতে পরিচালনা করতে খুব জটিল ছিল। প্রথম নয়টি অক্ষর অপসারণ ভিন্ন কারণের জন্য সহায়তা করে (নীচে দেখুন)।
  • ডিজিটের জন্য রেজেক্স-অনুসন্ধান করে প্রতিটি কমান্ডের দৈর্ঘ্য পাওয়ার পরিবর্তে (পাইথনে ব্যয়বহুল import re), আমরা rfind(" ")কমান্ডের শেষ স্থানটি খুঁজে পেতে ব্যবহার করি । আমরা এটি পরীক্ষা করতে এটি ব্যবহার করতে পারিrepeat
  • পাইথনের পিপের সাইক্লিকাল ইনডেক্সিং নেই, সুতরাং আমাদের সূচি মোড 7 স্পষ্টতই নিতে হবে। অন্যদিকে, এর অর্থ হ'ল আমরা অনুসন্ধানের টেবিলের শেষ ডামি মানটি সরিয়ে ফেলতে পারি, যেহেতু সূচক মোড 7 কখনই 6 হয় না।
  • "কমান্ড" প্রথমবারের মাধ্যমে হয় a number, যেখানে স্থানটির সূচক হয় 1। এই সূচকটি সুবিধামতভাবে লুক টেবিলের অন্যান্য গর্ত পূরণ করে। মূল লুপের ইনপুট পর্যায়ে প্রক্রিয়াজাতকরণের সাথে অন্যান্য সমস্যাটি ছিল সেই +c[s:]অংশটি, যার ফলস্বরূপ x=input() number। এই সমস্যাটি সমাধান করার জন্য, আমরা স্ট্রিং-গুণ করি c[0]<"a": 1সমস্ত নিয়মিত কমান্ডের জন্য, যেখানে cকোনও স্পেস দিয়ে শুরু হয় 0তবে প্রাথমিকের জন্য a number

1

WinDbg, 449 388 বাইট

as, }@$t1
as. }0;?@$t0
asThink n10;ed8<<22;r$t0=dwo(8<<22);r$t1=0;.do{
aSa " "
asQ .printf";r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0
as/c add Q +"
aSby " "
as/c divide Q /"
asfrom 0;r$t0=-@$t0+
as/c multiply Q *"
aSnumber " "
aSof " "
asrepeat +1
as/c subtract Q -"
.for(r$t9=1;by(@$t0);r$t0=@$t0+1){j44!=by(@$t0) .printf"%c",by(@$t0);.if116!=by(@$t0-1){.printf" , "}};.printf"\b ."

পুনরাবৃত্ত কোডের জন্য ওরফে সংজ্ঞা দিয়ে -61 বাইটস

লাম্বদাবেতার ব্যবহার দ্বারা অনুপ্রাণিত #define। এই পদ্ধতির দ্বারা ওয়ার্ডম্যাথ সিনট্যাক্সটি সামান্য পরিবর্তিত হয় (, এবং. অন্যান্য শব্দের মতো স্পেস-সীমাবদ্ধ হওয়া আবশ্যক, এবং ,অনুসরণ করে নাrepeat ), এবং পরিবর্তিত ওয়ার্ডম্যাথ সিনট্যাক্সটি বৈধ উইনডিবিজি কোড হিসাবে এলিফ তৈরি করে। শেষ লাইনটি প্রশ্নটি যা জিজ্ঞাসা করে এবং ইনপুটটিকে পরিবর্তিত বাক্য বিন্যাসে রূপান্তর করে তা স্থানান্তর করে does

মেমোরি ঠিকানায় একটি স্ট্রিং সেট করে $t0এবং সেই ঠিকানায় সিউডো-রেজিস্টার সেট করে ইনপুট নেওয়া হয় । দ্রষ্টব্য: এটি ওভাররাইট করবেint0x2000000 , তাই আপনি যদি আপনার স্ট্রিং সেখানে শুরু, এটা আংশিকভাবে ওভাররাইট করা হবে। $t0ওভাররাইট করা হবে।

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

কিভাবে এটা কাজ করে:

* $t1 is used for repeating and $t0 is used to read the input and hold the accumulator
* Alias , to }@$t1 -- closing do-while loop and allowing repeat
as , }@$t1

* Alias . to }0;?@$t0 -- close do-while loop and evaluate $t0 (accumulator)
as . }0;?@$t0

* Alias Think to (note this is one line)
as Think n10;               * Set base 10
         ed 8<<22;          * Read ints to address 0x2000000. Enter nothing to exit input mode
         r$t0 = dwo(8<<22); * Set $t0 = first int
         r$t1=0;.do{        * Open do-while

* Alias a to nothing
aS a " "

* Alias add to (note one line):
as add ;                       * Close previous statement
       r$t1=1;.do{r$t1=@$t1-1; * Open do-while (once) loop
       r$t0=@$t0+              * Add number to $t0

* Alias by to nothing
aS by " "

* Alias divide to (note one line):
as divide ;                       * Close previous statement
          r$t1=1;.do{r$t1=@$t1-1; * Open do-while (once) loop
          r$t0=@$t0/              * Divide next number from $t0

* Alias from to (note one line):
as from 0;         * Preceding subtract statement subtracts 0
       r$t0=-@$t0+ * Subtract $t0 from next number

* Alias multiply to (note one line):
as multiply ;                       * Close previous statement
            r$t1=1;.do{r$t1=@$t1-1; * Open do-while (once) loop
            r$t0=@$t0*              * Multiply next number with $t0

* Alias number to nothing
aS number " "

* Alias of to nothing
aS of " "

* Alias repeat to +1 making do-while (once) loops into do-while (once)+1
as repeat +1

* Alias subtract to (note one line):
as subtract ;                       * Close previous statement
            r$t1=1;.do{r$t1=@$t1-1; * Open do-while (once) loop
            r$t0=@$t0-              * Subtract next number from $t0


.for (r$t9=1; by(@$t0); r$t0=@$t0+1) * Enumerate the string
{
    j 44!=by(@$t0)                   * If not comma
        .printf "%c",by(@$t0);       * Print the char
    * implicit else
        .if 116!=by(@$t0-1)          * Else if the previous char is not t
        {
          .printf " , "              * Print the comma with spaces around it
        }
};
.printf "\b ."                       * Replacing ending "." with " ."

নমুনা আউটপুট, একবার এই কোডটি চালানোর আগে স্ট্রিংয়ের প্রবেশ করায় (ফলস্বরূপ প্রোগ্রামটি ওয়ার্ডম্যাথের অনুরূপ):

0:000> r$t0=8<<22
0:000> eza8<<22"Think of a number, add 5, add 10, multiply by 2, subtract 15, repeat, divide by 2."
0:000> as, }@$t1
0:000> as. }0;?@$t0
0:000> asThink n10;ed8<<22;r$t0=dwo(8<<22);r$t1=0;.do{
0:000> aSa " "
0:000> asadd ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0+
0:000> aSby " "
0:000> asdivide ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0/
0:000> asfrom 0;r$t0=-@$t0+
0:000> asmultiply ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0*
0:000> aSnumber " "
0:000> aSof " "
0:000> asrepeat +1
0:000> assubtract ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0-
0:000> .for(r$t9=1;by(@$t0);r$t0=@$t0+1){j44!=by(@$t0) .printf"%c",by(@$t0);.if116!=by(@$t0-1){.printf" , "}};.printf"\b ."
Think of a number ,  add 5 ,  add 10 ,  multiply by 2 ,  subtract 15 ,  repeat divide by 2 }0;?@$t0

0:000> Think of a number ,  add 5 ,  add 10 ,  multiply by 2 ,  subtract 15 ,  repeat divide by 2 }0;?@$t0
base is 10
02000000 6e696854 18
18
02000004 666f206b 

Evaluate expression: 18 = 00000012

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

0:000> r$t0=8<<22
0:000> eza8<<22"Think of a number, add 5, add 10, multiply by 2, subtract 15, repeat, divide by 2."
0:000> as, }@$t1
0:000> as. }0;?@$t0
0:000> asThink n10;ed8<<22;r$t0=dwo(8<<22);r$t1=0;.do{
0:000> aSa " "
0:000> asadd ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0+
0:000> aSby " "
0:000> asdivide ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0/
0:000> asfrom 0;r$t0=-@$t0+
0:000> asmultiply ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0*
0:000> aSnumber " "
0:000> aSof " "
0:000> asrepeat +1
0:000> assubtract ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0-
0:000> .for(r$t9=1;by(@$t0);r$t0=@$t0+1){j44!=by(@$t0) .printf"%c",by(@$t0);.if116!=by(@$t0-1){.printf" , "}};.printf"\b ."
n10;ed8<<22;r$t0=dwo(8<<22);r$t1=0;.do{     number ,  ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0+ 5 ,  ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0+ 10 ,  ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0*   2 ,  ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0- 15 ,  repeat ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0/   2 }0;?@$t0

0:000> n10;ed8<<22;r$t0=dwo(8<<22);r$t1=0;.do{     number ,  ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0+ 5 ,  ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0+ 10 ,  ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0*   2 ,  ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0- 15 ,  repeat ;r$t1=1;.do{r$t1=@$t1-1;r$t0=@$t0/   2 }0;?@$t0
base is 10
02000000 3b30316e 26
26
02000004 3c386465 

Evaluate expression: 26 = 0000001a

সামান্য পরিবর্তিত ওয়ার্ডম্যাথ সিনট্যাক্সটি ব্যবহার করে আরও কিছু নমুনা আউটপুট:

0:000> Think of a number , add 1 , repeat repeat repeat divide by 3 .
base is 10
02000000 0000001a 3
3
02000004 3c386465 

Evaluate expression: 2 = 00000002


0:000> Think of a number , divide by 5 , subtract from 9 .
base is 10
02000000 00000003 29
29
02000004 3c386465 

Evaluate expression: 4 = 00000004

0

স্কালা, 338 বাইট

এটি আদর্শে নিজে চেষ্টা করুন

s=>{val n=(_:String)filter(_.isDigit)toInt;(Seq("").tail/:s.split(",").tail)((a,&)=> &match{case&if&contains "v"=>a:+"x/="+n(&)
case&if&contains "d"=>a:+"x+="+n(&)
case&if&contains "y"=>a:+"x*="+n(&)
case&if&contains "f"=>a:+"x="+n(&)+"-x"
case&if&contains "s"=>a:+"x-="+n(&)
case p=>a:+a.last})mkString("var x=readInt;",";",";print(x)")}

ব্যাখ্যা:

// define a function with a parameter s
s => {
    // define a function with a String parameter to extract a number from a string
    val n =
        // filter out the chars that arent't digits
        (_: String) filter (_.isDigit)
        // and parse the number
        toInt;
    // take the tail of a list with an empty string,
    // which is the empty list of type Seq[String].
    // This is the start value for the fold...
    (Seq("").tail /:
        // ... of the tail of the sentence splitted at commas
        s.split(",").tail
    ) (
        // This is the function for the fold.
        // a is the accumulator (the list), and the current element is called &
        (a, &) => & match {
            // if & contains a "v", append "x/=" + n(&) to a.
            case & if & contains "v" => a :+ "x/=" + n(&)
            // the other cases are similar
            case & if & contains "d" => a :+ "x+=" + n(&)
            case & if & contains "y" => a :+ "x*=" + n(&)
            case & if & contains "f" => a :+ "x=" + n(&) + "-x"
            case & if & contains "s" => a :+ "x-=" + n(&)
            // for the repeat, apppend the last value of a to a
            case p                   => a :+ a.last
        }
     )
     // make a string out of the parts by joining them with semicolons,
     // prepending "var x=readInt;" and appending ";print(x)"
     mkString("var x=readInt;", ";", ";print(x)")
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.