পাইথনে দুটি ভেরিয়েবলের একটি নির্ধারণের জন্য কি আরও ছোট উপায় আছে?


19

এই হল মধ্যে golfing জন্য প্রশ্ন

পাইথনের একাধিক গল্ফগুলিতে, বুলিয়ান দ্বারা নির্বাচিত দুটি ভেরিয়েবলের মধ্যে একটিতে একটি নির্দিষ্ট মান নির্ধারিত হয়। নির্বাচিত পরিবর্তনশীল প্রদত্ত মান দ্বারা ওভাররাইট করা হয় এবং অন্যটি অপরিবর্তিত থাকে।

১rs টি চর:

if b:y=z
else:x=z

শর্তসাপেক্ষ মান নির্ধারণ করা সহজ তবে শর্তসাপেক্ষ ভেরিয়েবলকে বরাদ্দ করা জটিল বলে মনে হচ্ছে। আমি অবাক হয়ে যাচ্ছি যে আমি যদি অনুপস্থিত থাকি তবে এর চেয়ে আরও কম উপায় আছে।

x,yপরিবর্তে একটি তালিকা থাকলে এটি সহজ হবে L, তবে অনুমান করুন যে প্রসঙ্গে লেখার পক্ষে যথেষ্ট পরিমাণে ভেরিয়েবল উল্লেখ করা প্রয়োজন L[0]এবং L[1]এটি নিষেধক। রূপান্তর করতে খুব বেশি সময় লাগে:

20 অক্ষর:

L=[x,y];L[b]=z;x,y=L

আমি জানি দ্রুততম উপায়টি পাইথন 2 এর সাথে exec, যা উদ্ভট:

16 টি চর, পাইথন 2:

exec"xy"[b]+"=z"

টিপল-নির্বাচনটি আরও দীর্ঘ বলে মনে হচ্ছে:

18, 19, 18, 18 অক্ষর:

x,y=b*(x,z)or(z,y)
x,y=[z,x,y,z][b::2]
y,x=[y,z,x][b:b+2]
y,x,*_=[y,z,x][b:]   # Python 3 

কিছু ছোট পদ্ধতি বা চরিত্র-সঞ্চয় অপ্টিমাইজেশন আছে? আপনি অনুমান করতে পারেন bহয় 0বা 1, শুধু Falsey বা Truthy, এবং যদি এটা সাহায্য করে এছাড়াও ধরনের তথ্য ও মূল্যবোধ সম্পর্কে অনুমানের করা।


1
আমি এর চেয়ে ভাল কিছু জানি না। আপনার যদি এটি অনেক কিছু করার দরকার হয় তবে আপনি x,y=C(x,y,z,b)(14 টি অক্ষর) করতে পারেন এবং এর মধ্যে যে কোনও বাস্তবায়নকে দেহের অভ্যন্তরে ঠেলাতে পারেন C
কিথ র্যান্ডাল

কেন এটি স্ট্যাক ওভারফ্লোতে নেই?
ববআউইউইজ

14
@ بابিআউইউইস আমি এটি করার জন্য ভাল উপায় জিজ্ঞাসা করছি না, কেবল ছোটগুলি।
xnor

উত্তর:


26

12 টি অক্ষর / অ্যাসাইনমেন্ট + 9 টি ওভারহেডের অক্ষর

V=vars()     # do once at the start of the program
V["xy"[b]]=z

মনে রাখবেন যে এটি কেবল বিশ্বব্যাপী সুযোগে কাজ করে, এটি কোনও ফাংশনের অভ্যন্তরে কাজ করে না।


1
বাহ, আমি এই সম্পর্কে জানতাম না। এবং এটি দুর্দান্ত যা Vস্বয়ংক্রিয়ভাবে আপডেট হয়ে যায়, ফাংশনটিকে আবার কল করার দরকার নেই। সুতরাং এটি এমনকি execদুটি ব্যবহার সঙ্গে বিরতি । এছাড়াও, কেবল vars()["xy"[b]]=z17 টি চর করা, যা পাইথন 3-এর জন্য আমাদের এখন পর্যন্ত সেরা, নিয়ন্ত্রণ প্রবাহ ছাড়াই if/elseযা সমস্যার কারণ হতে পারে without
xnor

3
এটি আসলে ওভারহেডের 9 টি অক্ষর কারণ একটি নিউলাইন বা সেমিকোলন অবশ্যই অ্যাসাইনমেন্টটি অনুসরণ করবে।
xnor

1
আপনার যদি কেবল একবার এটি করা প্রয়োজন, আপনি কি করতে পারেন vars()["xy"[b]]=z:?
এ্যাববিস

@ অ্যাকাব্যাবিস: হ্যাঁ, এক্সনোর উল্লেখ করেছেন।
কীথ র্যান্ডাল

19

১৪ টি চর, পাইথন ২

exec"xy=z"[b:]

দুটি ভেরিয়েবল হয় yএবং xy। যদি খ = 0, এই সেট করে xy=z। যদি খ = 1, এটি সেট করে y=zxyকোডে অন্য কোথাও একাধিকবার ব্যবহার না করা হলে এটি মূল্যবান হবে ।


2
খুব চালাক! আমার সন্দেহ হয় আপনার xyপ্রাথমিক অ্যাসাইনমেন্টের জন্য আপনাকে সাধারণত কমপক্ষে দুবার ব্যবহার করতে হবে এবং পরে এটি পড়তে হবে।
xnor

15

15 অক্ষর, পাইথন 2

exec`b`[0]+"=z"

প্রয়োজন হয় যে ভেরিয়েবলগুলি কল করা উচিত Fএবং Tতার চেয়ে xএবং y, এবং এটি b is Falseবা b is True, সমান সংখ্যা 0বা হওয়ার চেয়ে বা 1

এর "xy"[b]পরিবর্তে স্ট্রিং উপস্থাপনের প্রথম অক্ষরটি গ্রহণ করে bযা হয় Tবা এটি থেকে একটি চর সংরক্ষণ করে F


7
নোট করুন যে ভেরিয়েবলগুলিও বলা যেতে পারে aএবং r, lএবং uবা sএবং eউপযুক্ত সূচকগুলির সাথে।
isaacg
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.