বহুবচনগুলির প্রতীকী পার্থক্য


20

প্রতীকী পার্থক্য 1: কোফিশিন চলে গেছে

কার্য

এমন একটি প্রোগ্রাম লিখুন যা স্ট্ডিনের ( x 1 ডিগ্রি (পি) <128) থেকে x এর বহুবচন হিসাবে গ্রহণ করে এবং এটি পৃথক করে। ইনপুট বহুপদী নিম্নলিখিত ফর্মের একটি স্ট্রিং হবে:

"a + bx + cx^2 + dx^3 +" ...

যেখানে প্রতিটি পদটির সহগ একটি পূর্ণসংখ্যা হয় (-128 <ক <128)। প্রতিটি পদ একটি স্থান, একটি + এবং অন্য স্থান দ্বারা পৃথক করা হয়; রৈখিক এবং ধ্রুবক পদগুলি উপরে প্রদর্শিত হয় (যেমন, না x^0বা x^1) or শর্তাদি ক্রমবর্ধমান ডিগ্রির ক্রম হিসাবে উপস্থিত হবে এবং শূন্য সহগ সহ সেই ক্ষমতাগুলি বাদ দেওয়া হবে। সহগের 1 বা -1 এর সাথে সমস্ত পদগুলি স্পষ্টভাবে সহগের প্রদর্শন করে।

আপনার আউটপুট অবশ্যই অবিকল একই ফর্ম থাকতে হবে। দ্রষ্টব্য যে আউটপুটে সহগগুলি 127 * 127 == 16129 এর চেয়ে বড় হতে পারে।

উদাহরণ

"3 + 1x + 2x^2" ==> "1 + 4x"
"1 + 2x + -3x^2 + 17x^17 + -1x^107" ==> "2 + -6x + 289x^16 + -107x^106"
"17x + 1x^2" ==> "17 + 2x"

স্কোরিং

আপনার স্কোরটি বাইটে আপনার প্রোগ্রামের দৈর্ঘ্য, আপনি যদি অন্তর্নির্মিত বা লাইব্রেরি প্রতীকী বীজগণিত ব্যবহার করেন তবে তিনটি দ্বারা গুণিত হবে।


আমি বিশ্বাস করতে পারি না যে ইতিমধ্যে আমাদের এখানে এই চ্যালেঞ্জ ছিল না!
flawr

5
@ ফ্লেয়ার আমরা বাছাই করেছি। (যদিও এটির জন্য অন্যান্য ফাংশনগুলিরও প্রয়োজন ছিল এবং আউটপুট ফর্ম্যাটে কোনও কঠোর নিয়ম ছিল না))
মার্টিন ইন্ডার

@ ফ্লোয়ার আমি একই জিনিসটি ভেবেছিলাম ... এবং তবুও আমি মার্টিনের লিঙ্কযুক্ত পোস্ট সন্ধান করতে পারি নি। আহ ভালো.
hYPotenuser

উত্তর:


15

রেটিনা , 53 43 42 41 40 35 বাইট

^[^x]+ |(\^1)?\w(?=1*x.(1+)| |$)
$2

গণনা উদ্দেশ্যে প্রতিটি লাইন পৃথক ফাইলে যায় তবে আপনি রেটিনার সাথে অনুরোধ করে উপরেরটিকে একক ফাইল হিসাবে চালাতে পারেন -s পতাকাটির ।

এটি প্রত্যাশা করে যে ইনপুট স্ট্রিংয়ের নম্বরগুলি আনারিতে দেওয়া হবে এবং একই ফর্ম্যাটে আউটপুট দেবে। যেমন

1 + 11x + -111x^11 + 11x^111 + -1x^11111
-->
11 + -111111x + 111111x^11 + -11111x^1111

পরিবর্তে

1 + 2x + -3x^2 + 2x^3 + -1x^5
-->
2 + -6x + 6x^2 + -5x^4

ব্যাখ্যা

কোডটি একটি একক রেজেক্স বিকল্পকে বর্ণনা করে, যা মূলত 4 টি বিকল্প একটিতে সংকুচিত হয়। মনে রাখবেন যে কেবলমাত্র একটি শাখাই গ্রুপ পূরণ করবে $2তাই অন্য তিনটি ম্যাচের কোনও হলে ম্যাচটি কেবল স্ট্রিং থেকে মুছে ফেলা হবে। সুতরাং আমরা আলাদাভাবে চারটি আলাদা কেসের দিকে নজর দিতে পারি:

^[^x]+<space>
<empty>

যদি স্ট্রিংয়ের শুরু থেকে কোনও জায়গায় না পৌঁছানো সম্ভব হয় তবে এর xঅর্থ প্রথম পদটি হ'ল ধ্রুবক শব্দ এবং আমরা এটি মুছতে পারি। লোভের কারণে +, এটি ধ্রুবক শব্দটির পরেও প্লাস এবং দ্বিতীয় স্থানের সাথে মিলবে। যদি কোনও স্থির মেয়াদ না থাকে তবে এই অংশটি কখনও মিলবে না।

x(?= )
<empty>

এটি xএকটি স্পেসের সাথে অনুসরণ করে যা xলিনিয়ার টার্মের (এটি উপস্থিত থাকলে) এর সাথে মিলে যায় এবং এটি সরিয়ে দেয়। আমরা নিশ্চিত হতে পারি যে এর পরেও একটি জায়গা রয়েছে, কারণ বহুবর্ষের ডিগ্রি সর্বদা কমপক্ষে 2 হয়।

1(?=1*x.(1+))
$1

এটি সূচক দ্বারা গুণকের গুণফল করে। এটি 1সহগের সাথে একটির সাথে মেলে এবং লুয়াহেডের মাধ্যমে এটি পুরো সম্পর্কিত এক্সপোনেন্ট দ্বারা প্রতিস্থাপন করে।

(\^1)?1(?= |$)
<empty>

এটি পেছনের সাথে মিল রেখে বাকী সমস্ত এক্সপোজারকে হ্রাস করে 1(লুকোয়ার্ড দ্বারা নিশ্চিত করা হয়)। যদি এটি মিলানো সম্ভব হয় ^11(এবং একটি শব্দের সীমানা) আমরা এর পরিবর্তে এটি সরিয়ে ফেলি, যা লিনিয়ার শব্দটি সঠিকভাবে প্রদর্শন করার জন্য যত্ন নেয়।

সংক্ষেপণের জন্য, আমরা লক্ষ্য করেছি যে বেশিরভাগ শর্তগুলি একে অপরকে প্রভাবিত করে না। (\^1)?তৃতীয় ক্ষেত্রে যদি চেহারাটি সত্য হয় তবে এটি মিলবে না, সুতরাং আমরা সেই দু'জনকে একসাথে রাখতে পারি

(\^1)?1(?=1*x.(1+)| |$)
$2

এখন আমরা ইতিমধ্যে lookahead দ্বিতীয় ক্ষেত্রে জন্য প্রয়োজন আছে এবং অন্যদের সত্য যখন মিলে হতে পারে না x, তাই আমরা কেবল সাধারণের করতে 1একটি থেকে \w:

(\^1)?\w(?=1*x.(1+)| |$)
$2

প্রথম ক্ষেত্রে অন্যের সাথে সত্যিকারের মিলের কিছু নেই, তাই আমরা এটিকে আলাদা রাখি।


9

সিজেম, 43 41 বাইট

Qleu'^/';*'+/{~:E[*'x['^E(]]E<}/]1>" + "*

একটি বাগ দেখিয়ে দেওয়ার জন্য এবং দুটি বাইট বন্ধ করে দেওয়ার জন্য @ জিমি ২৩০১৩ ধন্যবাদ!

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

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

Q           e# Leave an empty array on the bottom of the stack.
l           e# Read a line from STDIN.
eu'^/';*    e# Convert to uppercase and replace carets with semicolons.
'+/         e# Split at plus signs.

{           e# For each resulting chunk:
  ~         e#   Evaluate it. "X" pushes 1 and ";" discards.
            e#   For example, "3X" pushes (3 1) and "3X;2" (3 2).
   :E       e#   Save the rightmost integer (usually the exponent) in E.
   [        e#
     *      e#   Multiply both integers.
            e#   For a constant term c, this repeats the empty string (Q) c times.
     'x     e#   Push the character 'x'.
     ['^E(] e#   Push ['^' E-1].
   ]        e#
   E<       e#  Keep at most E elements of this array.
            e#  If E == 1, 'x' and ['^' E-1] are discarded.
            e#  If E == 2, ['^' E-1] is discarded.
            e#  If E >= 3, nothing is discarded.
}/          e#

]           e# Wrap the entire stack in an array.
1>          e# Discard its first element.
            e# If the first term was constant, this discards [""]. ["" 'x']
            e# or ["" 'x' ['^' E-1]], depending on the constant.
            e# In all other cases, it discards the untouched empty array (Q).
" + "*      e# Join all kept array elements, separating by " + ".

5

পার্ল, 64 63 বাইট

62 বি কোড + 1 কমান্ড লাইন (-p)

এই মুহুর্তে আশ্চর্যজনক নয়, তবে আমি এটি ছোট করার চেষ্টা চালিয়ে যাব।

s/(\d+)x.(\d+)/$1*$2."x^".($2-1)/eg;s/\^1\b|^\d+ . |x(?!\^)//g

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

echo "1 + 2x + 3x^2" | perl -pe 's/(\d+)x.(\d+)/$1*$2."x^".($2-1)/eg;s/\^1\b|^\d+ . |x(?!\^)//g'

ধন্যবাদ -১ বি এর জন্য ডেনিস


5

জুলিয়া, 220 বাইট

কোনও নিয়মিত প্রকাশ নেই!

y->(A=Any[];for i=parse(y).args[2:end] T=typeof(i);T<:Int&&continue;T==Symbol?push!(A,1):(a=i.args;c=a[2];typeof(a[3])!=Expr?push!(A,c):(x=a[3].args[3];push!(A,string(c*x,"x",x>2?string("^",ex-1):""))))end;join(A," + "))

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

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

function polyderiv{T<:AbstractString}(y::T)

    # Start by parsing the string into an expression
    p = parse(y)

    # Define an output vector to hold each differentiated term
    A = Any[]

    # Loop through the elements of p, skipping the operand
    for i in p.args[2:end]

        T = typeof(i)

        # Each element will be an integer, symbol, or expression.
        # Integers are constants and thus integrate to 0. Symbols
        # represent x alone, i.e. "x" with no coefficient or
        # exponent, so they integrate to 1. The difficulty here
        # stems from parsing out the expressions.

        # Omit zero derivatives
        T <: Int && continue

        if T == Symbol
            # This term will integrate to 1
            push!(A, 1)
        else
            # Get the vector of parsed out expression components.
            # The first will be a symbol indicating the operand,
            # e.g. :+, :*, or :^. The second element is the
            # coefficient.
            a = i.args

            # Coefficient
            c = a[2]

            # If the third element is an expression, we have an
            # exponent, otherwise we simply have cx, where c is
            # the coefficient.
            if typeof(a[3]) != Expr
                push!(A, c)
            else
                # Exponent
                x = a[3].args[3]

                # String representation of the differentiated term
                s = string(c*x, "x", x > 2 ? string("^", x-1) : "")

                push!(A, s)
            end
        end
    end

    # Return the elements of A joined into a string
    join(A, " + ")
end

3

সি, 204 162 বাইট

#define g getchar()^10
h,e;main(c){for(;!h&&scanf("%dx%n^%d",&c,&h,&e);h=g?g?e?printf(" + "):0,0:1:1)e=e?e:h?1:0,e?printf(e>2?"%dx^%d":e>1?"%dx":"%d",c*e,e-1):0;}

মূলত প্রতিটি শব্দের বিশ্লেষণ করুন এবং ধারাবাহিকভাবে পৃথক শব্দটি মুদ্রণ করুন। মোটামুটি সহজবোধ্য.


2

জাভাস্ক্রিপ্ট ES6, 108 বাইট

f=s=>s.replace(/([-\d]+)(x)?\^?(\d+)?( \+ )?/g,(m,c,x,e,p)=>x?(c*e||c)+(--e?x+(e>1?'^'+e:''):'')+(p||''):'')

ইএস 5 স্নিপেট:

// ES5 version, the only difference is no use of arrow functions.
function f(s) {
  return s.replace(/([-\d]+)(x)?\^?(\d+)?( \+ )?/g, function(m,c,x,e,p) {
    return x ? (c*e||c) + (--e?x+(e>1?'^'+e:''):'') + (p||'') : '';
  });
}

[
  '3 + 1x + 2x^2',
  '1 + 2x + -3x^2 + 17x^17 + -1x^107',
  '17x + 1x^2'
].forEach(function(preset) {
  var presetOption = new Option(preset, preset);
  presetSelect.appendChild(presetOption);
});

function loadPreset() {
  var value = presetSelect.value;
  polynomialInput.value = value;
  polynomialInput.disabled = !!value;
  showDifferential();
}

function showDifferential() {
  var value = polynomialInput.value;
  output.innerHTML = value ? f(value) : '';
}
code {
  display: block;
  margin: 1em 0;
}
<label for="presetSelect">Preset:</label>
<select id="presetSelect" onChange="loadPreset()">
  <option value="">None</option>
</select>
<input type="text" id="polynomialInput"/>
<button id="go" onclick="showDifferential()">Differentiate!</button>
<hr />
<code id="output">
</code>


2

পাইথন 2, 166 বাইট

ছেলে, এটি হওয়া উচিত দীর্ঘ বলে মনে হচ্ছে।

S=str.split
def d(t):e="^"in t and int(S(t,"^")[1])-1;return`int(S(t,"x")[0])*(e+1)`+"x"[:e]+"^%d"%e*(e>1)
print" + ".join(d(t)for t in S(raw_input()," + ")if"x"in t)

ফাংশনটি dএকটি অ-ধ্রুবক পদ গ্রহণ করে tএবং তার ডেরাইভেটিভ ফিরিয়ে দেয়। defল্যাম্বডা ব্যবহার না করে আমি ফাংশন করার কারণটি হ'ল আমি এক্সপোশনটি বিয়োগ 1 -কে নির্ধারণ করতে পারিe , যা পরে আরও চারবার ব্যবহৃত হয়। মূল বিরক্তিকর জিনিসটি স্ট্রিং এবং ইনটগুলির মধ্যে পিছনে পিছনে নিক্ষেপ করা হয় যদিও পাইথন 2 এর ব্যাকটিক অপারেটর এটিতে সহায়তা করে।

এরপরে আমরা ইনপুটটিকে শর্তগুলিতে বিভক্ত করি এবং এতে dথাকা প্রতিটিকে কল "x"করি, যার ফলে ধ্রুবক শব্দটি মুছে ফেলা হয়। ফলাফলগুলি আবার একত্রিত হয়ে মুদ্রিত হয়।


2

সিজেম, 62 57 55 49 বাইট

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

lS/{'x/:T,({T~1>:T{~T~*'xT~(:T({'^T}&}&" + "}&}/;

সর্বশেষ সংস্করণটি @ ডেনিস দ্বারা প্রস্তাবিত শর্টকাটগুলি সহ কয়েকটি বাইট সংরক্ষণ করে (ভেরিয়েবলগুলি ব্যবহার করুন এবং পরিবর্তে স্পেসে বিভক্ত করুন +)।

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


1
ভেরিয়েবলে সংরক্ষণ করা অন্য ব্লকের পপিংয়ের চেয়ে কম sh উদাহরণস্বরূপ, এর _({'^a\}{;}?চেয়ে 1 বাইট দীর্ঘ :T({T'^a\}&
ডেনিস

1
যদি আপনি প্লাস চিহ্নগুলির পরিবর্তে স্পেসে বিভক্ত হন, তবে আপনার ~অন্য কোনও ব্লকের দরকার নেই এবং এটিও মুছে ফেলতে পারেন।
ডেনিস

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

1

পাইথ, 62 বাইট

jJ" + "m::j"x^",*Fdted"x.1$"\x"x.0"kftTmvMcd"x^"c:z"x ""x^1 "J

বেশ কয়েকটি কুরুচিপূর্ণ সমাধান, কিছু রেজেক্স বিকল্প ব্যবহার করে।


1

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

s=input().split(' + ')
y='x'in s[0]
L=map(lambda x:map(int,x.split('x^')),s[2-y:])
print(' + '.join([s[1-y][:-1]]+['x^'.join(map(str,[a*b,b-1])).rstrip('^1')for a,b in L]))

প্রকৃতপক্ষে, প্রধান বিরক্তি স্ট্রিং এবং ইনসগুলির মধ্যে রূপান্তর করতে হচ্ছে। এছাড়াও, যদি একটি ধ্রুবক পদ প্রয়োজন হয়, কোডটি কেবল 153 বাইটের হবে।


প্রথম উত্তর, ডিএলসকে মারধর করার জন্য শুটিং করছিল, বেশিরভাগ সেখানে পেল না।
এল'েন্ডিয়া স্টারম্যান

0

পাইথন 2, 229 বাইট

import os
print' + '.join([i,i[:-2]][i[-2:]=='^1'].replace('x^0','')for i in[`a*b`+'x^'+`b-1`for a,b in[map(int,a.split('x^'))for a in[[[i+'x^0',i+'^1'][i[-1]=='x'],i]['^'in i]for i in os.read(0,9**9).split(' + ')]]]if i[0]!='0')

0

পাইথন 2, 174 বাইট

print' + '.join(['%d%s%s'%(b[0]*b[1],'x'*(b[1]>1),'^%d'%(b[1]-1)*(b[1]>2))for b in[map(int,a.split('x^')if 'x^'in a else[a[:-1],1])for a in input().split(' + ')if 'x'in a]])

দুর্ভাগ্যক্রমে, বিভাজন পদ্ধতিটির নতুন নামকরণ এবং একটি নির্দিষ্ট ফাংশনে পার্থক্য সম্পাদনের জন্য DLosc এর কৌশলটি আমার কোডকে ছোট করে না ...

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