আমাকে কিছু তরকারি বানিয়ে দাও


20

একটি ফাংশন হচ্ছে যে আর্গুমেন্ট লাগে এক্স 1 , x 2 , ..., x এর এন

                                               - যেমন।  চ: এক্স 1 × এক্স 2 ×… × এক্স এন → ওয়াই

- সংবাহন redefines একটি ফাংশন হিসাবে একটি একক যুক্তি গ্রহণ একটি 1 যা এখনও অন্য ফাংশন মানচিত্র তৈরী করে। এই কৌশলটি আংশিক প্রয়োগের জন্য দরকারী, উদাহরণস্বরূপ কোনও ত্রিযুক্ত powফাংশন সহ আমরা লিখতে পারি exp = pow(e)

উদাহরণ

ধরে নেওয়া যাক আমরা নিম্নলিখিত কার্যকারিতা থাকতে তিন আর্গুমেন্ট গ্রহণ ( চ: এক্স 1 × এক্স 2 × এক্স 3 → ওয়াই ):

def f(a,b,c):
  return a + b * c

এই ফাংশনটি তৈরি করা আমাদের f_curry সহ ছেড়ে দেয় : এক্স 1 → (এক্স 2 → (এক্স 3 → ওয়াই)) , যদি আমরা এখন আবার সেই ফাংশনটির সাথে দু'বার কল করি তবে নীচের রিটার্নের সমতুল্য f_curry(1)(2)একটি ফাংশন ( h) পাব :

def h(c):
   return 1 + 2 * c

কার্ড ফাংশনটি fএভাবে লেখা যেতে পারে (পাইথন 3):

def f_curry(a):
  def g_curry(b):
    def h(c):
      return a + b * c
    return h
  return g_curry

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

চ্যালেঞ্জ

আপনার চ্যালেঞ্জটি হ'ল উপরে বর্ণিত কোনও ফাংশনটি কারি করা, এখানে বিধিগুলি দেওয়া হল:

  • ইনপুট একটি ব্ল্যাকবক্স ফাংশন হবে যা কমপক্ষে 2 টি আর্গুমেন্ট নেয়
  • ইনপুট printfফাংশনটিতে সর্বদা একটি নির্দিষ্ট সংখ্যক আর্গুমেন্ট থাকবে (বিপরীত বা অনুরূপ, দ্রষ্টব্য: আপনাকে কোনও সংখ্যা ments2 দিয়ে আটকানো ফাংশন সমর্থন করতে হবে)
  • যদি আপনার ভাষাটি ডিফল্টরূপে কারিড ফাংশনগুলি ব্যবহার করে (উদাঃ হাস্কেল), আপনি ইনপুট ফাংশনটিকে "উচ্চ-অর্ডার ফাংশন" এর পরিবর্তে এন- টিপলসগুলিতে সংজ্ঞায়িত করার প্রত্যাশা করতে পারেন
  • আপনি ইনপুট হিসাবে আর্গুমেন্টের সংখ্যা নিতে পারেন
  • আউটপুট ইনপুট এর তরকারি সমতুল্য হবে *
  • আপনি ধরে নিতে পারেন আউটপুট ফাংশনটি কেবল সর্বদা থাকবে:
    • ইনপুট ফাংশনটি নেয় এমন আর্গুমেন্টের সংখ্যার কম বা সমান সাথে ডাকা হয়
    • সঠিক ধরণের আর্গুমেন্টের সাথে ডাকা হয়

* এর অর্থ হবে যুক্তিগুলির fসাথে একটি ইনপুট Nএবং আউটপুট hযা সমস্ত বৈধ আর্গুমেন্টের জন্য a1,…,aNএটি ধারণ করে f(a1,a2,…,aN) == h(a1)(a2)…(aN)



সুতরাং ইনপুট হয় def f(a,b,c): return a + b * cএবং আউটপুট def f_curry(a): def g_curry(b): def h(c): return a + b * c return h return g_curry?
ড্যানিয়েল ইন্ডি

@ ড্যানিয়েলআইডি: আপনি যদি উদাহরণটি নিচ্ছেন তবে ইনপুটটি হবে f(যা কোথাও সংজ্ঞায়িত হয়েছে) এবং আউটপুটটির সমতুল্য কিছু হওয়া উচিত f_curry। অথবা ইনপুট হবে lambda a,b,c: a+b*cএবং আউটপুট সমান একটি ফাংশন f_curry
3

বেশিরভাগ স্থিতিযুক্ত টাইপ করা ভাষাগুলিতে এটি করা শক্ত ... আমি অনুমান করি এর জন্য আপনার টাইপ ফাংশন প্রয়োজন।
পাওলো ইবারম্যান

@ পাওলোবার্মন: সত্য, কিছু ভাষা এই কাজটি সমাধান করতে সক্ষম হবে না (ট্যাগটি কার্যকরী-প্রোগ্রামিং নোট করুন )। তবে কিছু স্থিতিযুক্ত টাইপ করা ভাষাগুলি ফাংশন পয়েন্টারগুলি ব্যবহার করতে সক্ষম হতে পারে যা একটি বৈধ I / O হবে, মূল কারণেই আমি যুক্তিগুলির সংখ্যাকে অতিরিক্ত ইনপুট হিসাবে গ্রহণের অনুমতি দিয়েছিলাম।
22

উত্তর:


11

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

f=g=>g.length<2?g:a=>f(g.bind(f,a))

9

ইদ্রিস , 204 বাইট

import Data.HVect
C:(a:Vect n Type)->(HVect a->Type)->Type
C[]T=T[]
C(h::t)T=(x:h)->C t(T .(x::))
c:{a:Vect n Type}->{T:HVect a->Type}->((b:HVect a)->T b)->C a T
c{a=[]}f=f[]
c{a=h::t}f=\v=>c(\u=>f(v::u))

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

নির্ভরশীল ধরণের জন্য একটি কাজের মতো শোনাচ্ছে! ভাল হয়ত.


সি একটি কারিরিং টাইপ ফাংশন। প্রকারের ভেক্টরকে a = [টি 1 , টি 2 ,… টি এন ] এবং একটি টাইপ ফাংশন টি দেওয়া হয়েছে: এইচভিেক্ট এ → প্রকার , এটি একটি নতুন ধরণের রিটার্ন দেয়:

           (x 1  : t 1 ) → (x 2  : t 2 ) →… → (টি [এক্স 1 , এক্স 2 ,… এক্স এন ])

এখানে, এইচভিেক্ট হ'ল ইদ্রিস প্রিলিড থেকে ভিন্ন ভিন্ন ভেক্টর টাইপ - এন- টিপলসের ধরণ যার উপাদানগুলি এন বিভিন্ন ধরণের।

একটি ফাংশন যে লাগে একটি এবং টি অন্তর্নিহিত আর্গুমেন্ট হিসাবে, এবং তারপর পরিবর্তন করে একটি uncurried ফাংশন fধরনের : (HVect ক) → টি খ (খ) একটি মধ্যে curried ধরনের এক সি একটি টি

( সি কেবল বর্ণনা আমরা কি করতে চান কি; আসলে এটা আছে কিন্তু আমরা দূরে সংজ্ঞা না দিয়ে পেতে পারে না। সি , যেমন ইদ্রিস দাবি যে প্রতি টপ লেভেল সংজ্ঞা একটি টাইপ স্বাক্ষর রয়েছে।)


টিআইও লিঙ্কটি ব্যবহারের উদাহরণ দেয়। যদি আমরা 3-টি-টিপলস (নাট, নাট, স্ট্রিং) এর উপর কোনও ক্রিয়া সংজ্ঞায়িত করি :

uncurried : HVect [Nat, Nat, String] -> String
uncurried [a, b, c] = show (a*a + b*b) ++ c

তারপরে uncurried [3, 4, "th"]একই ফলাফল দেয় c uncurried 3 4 "th"। ইদ্রিস যুক্তি উপস্থাপন করে a=[Nat, Nat, String]এবং T=const Stringআমাদের জন্য, আমি বিশ্বাস করি।

আমি টিমজ্ব দ্বারা এই লিস্টে এই কোডটি তৈরি করেছি।


আমার মতে, Haskell, এবং ইদ্রিস মধ্যে tuples আসলে হওয়া উচিত HVectdefault- দ্বারা HVectমূলত আপনি uncons করতে পারেন যে একটি tuple হয়।
এ্যাসোলং ফল


5

আর , 96 বাইট

y=function(f,n=length(formals(f)),p=list())function(x,u=c(p,x))`if`(n<2,do.call(f,u),y(f,n-1,u))

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


পূর্ববর্তী সংস্করণ (97 বাইট)

-1 বাইট @ জায়েসিএ ধন্যবাদ


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

@ngm ফাংশনটির নামটি পুনরাবৃত্ত হওয়ার সময় অবশ্যই অন্তর্ভুক্ত করা উচিত।
janর্জন জোহানসেন

@ জিএনএম: আমি সাব-ফাংশনটির মধ্যে
আইএফ স্টেটমেন্টটি


3

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

c=lambda f,n,l=[]:lambda a:n-1and c(f,n-1,l+[a])or f(*l+[a])

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

পাদচরণ একটি পরীক্ষক যা নিম্নলিখিত লাইনে STDIN ব্যবহার করে:

  1. ফাংশন নিজেই
  2. ফাংশনের আর্গুমেন্টগুলির সংখ্যা, ≥2
  3. আর্গুমেন্টের একটি তালিকা ( [a,b,...])

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

অনুরূপ 55-বাইট সংস্করণ ovs দ্বারা সদয়ভাবে সরবরাহ করা হয়েছে :

c=lambda f,n,*l:lambda a:n-1and c(f,n-1,*l,a)or f(*l,a)

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


2

ফুলকপি , 84 বাইট

(:= c(\($f$n(@a))(if$n(\($a)(call c(cat(list$f(-$n 1))@a(list$a))))else(call$f@a))))

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


1
মিমি, ফুলকপি তরকারী। সুস্বাদু। ^ _ ^
DLosc

@DLosc খাবার সম্পর্কিত নামগুলির সাথে এই চ্যালেঞ্জের যথেষ্ট উত্তর নেই: পি (যদিও আমি অনুমান করি যে তাদের বেশিরভাগের কার্যকারিতা নেই)
ASCII-

2

পার্ল 6 , 42 40 বাইট

my&c={.count>1??{c(.assuming($^a))}!!$_}

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

-২ বাইট ব্র্যাড গিলবার্ট বি 2 গিলকে ধন্যবাদ ।


আপনার পিছনে ব্যবহার করার দরকার নেই *, এটির প্রয়োজন পরে যদি এটির মতো কিছু থাকে .assuming(*,1)
ব্র্যাড গিলবার্ট 15


1

সংযুক্তি , 5 বাইট

Curry

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

সাধারণ অন্তর্নির্মিত, মূলত উদ্বেগজনক। তবে, স্ক্র্যাচ থেকে একটি সংস্করণ এখানে:

সংযুক্তি, 35 বাইট

{If[#__2<#_,Fold[`&:,$'__],_@@__2]}

ব্যাখ্যা:

{If[#__2<#_,Fold[`&:,$'__],_@@__2]}
{                                 }    lambda
 If[       ,              ,      ]     if
    #__2                                 the number of parameters after the first
        <#_                              is less than the arity of the first
            Fold[   ,    ]             then fold:
                 `&:                     right-function bonding
                     $                     over this function
                      '__                  paired with the rest of the parameters
                          ,            otherwise:
                           _@@           call the first parameter
                              __2        with the rest of them

1

জাভা 8, 46 + 318 = 364 বাইট

এটি একটি ত্রিযুক্ত (হাহ) ল্যাম্বদা একটি ফাংশন এবং একটি আর্গুমেন্ট গণনা করে এবং ত্রিযুক্ত ফাংশনটি ফিরিয়ে দেয়।

import java.lang.reflect.*;import java.util.*;

f->p->new java.util.function.Function(){Object F=f;Method m=F.getClass().getDeclaredMethods()[0];int P=p;List a=new Stack();public Object apply(Object r){a.add(r);try{return a.size()<P?this:m.invoke(F,a.toArray());}catch(Throwable t){t=t.getCause();if(t instanceof Error)throw(Error)t;else throw(RuntimeException)t;}}}

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

জমা দেওয়ার ধরণ

ইনপুট ফাংশন

ফাংশন ইনপুটটি একটি একক পদ্ধতিতে (উত্তরাধিকার সূত্রে প্রাপ্ত পদ্ধতিগুলি বাদ দিয়ে) ফাংশনটিকে উপস্থাপন করে এমন একটি অবজেক্ট। নোট করুন যে একটি স্ট্যান্ডার্ড ক্রিয়ামূলক ইন্টারফেস ইনপুট প্রকার হিসাবে ব্যবহার করা যাবে না কারণ (উদাহরণস্বরূপ) 3 পরামিতিগুলির ফাংশনগুলি সমর্থন করা আবশ্যক। এছাড়াও নোট করুন যে একটি ল্যাম্বডা এক্সপ্রেশনটি স্ট্যান্ডার্ড- java.util.function.Functionমত ধরণের টাইপ করা যেতে পারে (একক পদ্ধতি হ'ল apply)।

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

আউটপুট ফাংশন

জমা দেওয়ার আউটপুট হ'ল ক java.util.function.Function<Object, Object>। আমি Objectকোনও applyপদ্ধতিতে (ইনপুটের মতো) সমতলের প্রত্যাবর্তনকে বিবেচনা করেছি , তবে তারপরে ফলাফলটি চাওয়া দরকার, যা অস্বীকারযোগ্য বলে যথেষ্ট অসুবিধাজনক বলে মনে হয়েছিল particular বিশেষত, সমস্ত উপায়ে কল করা কোনও একক ক্ষেত্রে আর সম্ভব হবে না calling অভিব্যক্তি।

ব্যবহার

যেহেতু জমাটি কোনও ফাংশন থেকে অন্যকে ফেরত Objectদেয় Object, আউটপুটটি সরাসরি (সহ apply) ডাকা যেতে পারে তবে পরবর্তী মধ্যবর্তী রিটার্ন মানগুলি অনুরোধ করার আগে একটি উপযুক্ত ধরণের (যেমন java.util.function.Function<Object, Object>) দিতে হবে) কিছু ব্যবহারের উদাহরণের জন্য টিআইওর সাথে পরামর্শ করুন।

নোট করুন যে জাভা ফাংশনে (অর্থাত্ পদ্ধতিগুলি) প্রথম শ্রেণীর অবজেক্ট নয়। সুতরাং চ্যালেঞ্জের বর্ণনার আউটপুট বুলেটে ব্যবহৃত সিনট্যাক্স জাভাতে অর্থহীন। বরং f(a1, a2, a3)আমাদের রয়েছে f.apply(a1, a2, a3), বরং f(a1)(a2)(a3)আমাদের রয়েছে f.apply(a1).apply(a2).apply(a3)

সীমাবদ্ধতা

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

Function<Object, Function<Integer, Function>> submission = ...;
Function c = submission.apply((IntBinaryOperator) (a, b) -> a + b).apply(2);
Function c2 = (Function) c.apply(2);
System.out.println(c2.apply(2));
System.out.println(c2.apply(3));

লাইন 4 মুদ্রণ করবে 4, তবে লাইন 5 ব্যর্থ হবে, কারণ সেই সময়ের মধ্যে c2ইতিমধ্যে আর্গুমেন্ট রয়েছে 2এবং 2(এটিও নোট করুন c2 == c)। এটি তরকারীকরণের মনোভাব লঙ্ঘন করে তবে চ্যালেঞ্জে বর্ণিত নির্দিষ্ট প্রয়োজনীয়তা পূরণ করে।

Ungolfed

একটি অব্যক্ত কপির জন্য টিআইও দেখুন।



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