পাইথনের দৃ strong় টাইপিং!


35

আপনার কাজটি পাইথন 2 বা 3 তে এমন কিছু কোড লিখুন যা এই অভিব্যক্তি:

(a+b)(c+d) == a*c + b*c + a*d + b*d

Trueকোনও ব্যতিক্রম না বাড়িয়ে মূল্যায়ন করবে ।

নির্মল করার জন্য, আমি আপনার কোড একটি ফাইলে তারপর কপি করবে fromফাইল import *। তারপরে আমি কনসোলে এক্সপ্রেশনটি টাইপ করব এবং এটি যাচাই করব True

এটি কোড-গল্ফ, তাই সংক্ষিপ্ত দৈর্ঘ্যের সাথে উত্তর (বাইটে) জেতে।

উত্তর:


20

54 52 50 49 48 45 39 বাইট

ডেনিসকে ধন্যবাদ 4 বাইট অপসারণ করা হয়েছে।

এক্সনোরের উত্তরের "কিছু কারণ" দ্বারা সর্বশেষতম সংস্করণটি অনুপ্রাণিত হয়েছে।

class t(int):__add__=type
a=b=t()
c=d=0

নিস! আছে 0 .__mul__জন্য lambda y:0কিন্তু এটা একই দৈর্ঘ্য আছে।
xnor

x.countএকটি বাইট সংরক্ষণ করে।
ডেনিস

1
আমি এটি পাই না ... type(t(), t())বা t().type(t())একটি ব্যতিক্রম ছুঁড়েছি, তাই আপনি যখন কি ঘটছে t() + t()?
ফেয়ারসাম

1
@ ফেয়ারসামকে __add__দুটি দিয়ে ডাকা হয়, তবে প্রথমটিকে ব্যাখ্যা করা হয় self, কেবল otherতা পাস করা হয় type। অদ্ভুত, হ্যাঁ
জোনাথন অ্যালান

1
@ ফেয়ারসাম: a + bপ্রথম চেষ্টা করে a.__add__(b)a.__add__হয় type, যাতে হয় type(b)। পদ্ধতিগুলির ক্ষেত্রে এই ক্ষেত্রে এবং সাধারণ ক্ষেত্রে প্রধান পার্থক্যটি হ'ল সাধারণত, ক্লাস সংজ্ঞাতে a.__add__আপনি যে জিনিসটি সেট __add__করেন তার থেকে পৃথক বস্তু হতে পারে, বর্ণনাকারী প্রোটোকলের কারণে , যা সাধারণ ফাংশন অবজেক্টগুলি প্রয়োগ করে। (আরও কয়েকটি
কৌশলযুক্ত

10

54 বাইট

class m(int):__call__=__add__=lambda*x:m()
a=b=c=d=m()

intকেবল যুক্ত করা বা কল করা ব্যতীত যে কোনও বস্তু উত্তরাধিকার সূত্রে প্রাপ্ত হয় সেটির একটি অনুলিপি দেয়।

একই দৈর্ঘ্য:

class m(int):__call__=__add__=lambda a,b:a
a=b=c=d=m()

আমি ভেবেছি minবা {}.getএর জায়গায় কাজ করব lambda a,b:a, তবে কোনও কারণে তারা কেবল দ্বিতীয় যুক্তিতে কাজ করে।



1
উফ, আমি কেবল প্রোগ্রামিং-ধাঁধা দেখেছি , গল্ফ হবে।
xnor

3
এটি বেশ হ্রাস ছিল
অ্যাডিসন

@ xnor এটি কাজ করে না কারণ minইতিমধ্যে একটি __self__বৈশিষ্ট্য রয়েছে তাই শ্রেণিটি নিজের স্বত্বে আবদ্ধ হয়। কেন minহয়েছে __self__অপর এক প্রশ্নের ... হয়
matsjoyce

@matsjoyce: না, এটা সত্য যে সাথে কিছু নেই minরয়েছে __self__min.__self__বিল্ট-ইন ফাংশন এবং অন্তর্নির্মিত পদ্ধতিগুলি একই ধরণের হিসাবে কীভাবে প্রয়োগ করা হয় তার একটি নিদর্শন মাত্র। minএখানে কাজ করে না কারণ পাইথনে লিখিত ফাংশনগুলির বিপরীতে, অন্তর্নির্মিত ফাংশনগুলি ডেস্ক্রিপ্টর প্রোটোকলকে সমর্থন করে না, যা প্রথম যুক্তিকে আবদ্ধ করার জন্য দায়ী।
ব্যবহারকারী 2357112


1

68 বাইট

যদিও এটি বিদ্যমান উত্তরগুলির সাথে সত্যই প্রতিযোগিতা করতে পারে না, এটি আসলে প্রশ্নে গণনা সম্পাদন করে:

from sympy.abc import*
type(a+b).__call__=lambda x,y:(x*y).expand()

ব্যাখ্যা:

  • SymPy প্রতীকী গণনার জন্য একটি মডিউল।
  • sympy.abcসব একক অক্ষর চিহ্ন রয়েছে নাম নির্দিষ্ট বেশী a, b, c, এবং d
  • a+bএকটি Addঅবজেক্ট, যা একটি সাধারণ যোগফল উপস্থাপন করে।
  • type(a+b).__call__= […]বানর- Addশ্রেণিটিকে মূল্যায়ন করার ক্ষমতা প্রদান করে, এক্ষেত্রে এটি কলার এবং কলির গুণকের মতো কাজ করতে সক্ষম করে।
  • expand এক্সপ্রেশনগুলি আসলে সমান করার জন্য প্রয়োজনীয় (যেহেতু সিমপি কেবলমাত্র চাহিদা অনুসারে সম্পূর্ণ সামঞ্জস্যতা পরীক্ষা করে)।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.