রুবিতে গল্ফ করার টিপস


62

রুবির গল্ফ করার জন্য আপনি কোন সাধারণ টিপস দিতে পারেন?

আমি এমন ধারণাগুলি সন্ধান করছি যা রুবীর সাথে নির্দিষ্টভাবে কোড গল্ফ সমস্যার ক্ষেত্রে প্রয়োগ করা যেতে পারে। (উদাহরণস্বরূপ, "মন্তব্যগুলি সরান" কোনও উত্তর হবে না))

দয়া করে উত্তর প্রতি একটি টিপ পোস্ট করুন।


কারও কাছে রুব নামে একটি ভাষা লিখতে হবে, যা প্রতিটি রুবি টোকেনের জন্য একক ইউনিকোড অক্ষর ব্যবহার করে, যেমন জেলি এবং পাইথের মতো :)
মার্ক টমাস

উত্তর:


46
  • 126 সংখ্যার 100 হিসেবে লেখা যেতে পারে ?dথেকে ?~1.8 হবে।
  • অনুরূপ নোটে আপনার যদি একটি একক-অক্ষরের স্ট্রিং দরকার হয় 1.9? X "x" এর চেয়ে কম হয়।
  • আপনার যদি নতুন লাইন সংযোজন না করে কোনও স্ট্রিং মুদ্রণ করা দরকার তবে $><<"string"তার চেয়ে কম print"string"
  • আপনার যদি একাধিক লাইন ইনপুট পড়তে $<.map{|l|...}হয় তবে তার চেয়ে কম while l=gets;...;end। এছাড়াও আপনি $<.readএটি একবারে পড়তে ব্যবহার করতে পারেন ।
  • আপনার যদি কোনও ফাইল থেকে পড়ার কথা, $<এবং getsফাইলের নামটি স্ট্যান্ডিনের পরিবর্তে কোনও ফাইল থেকে পড়বেন ARGV। সুতরাং reimplement করার golfiest উপায় catহবে: $><<$<.read

1
? x সাধারণভাবে এসকি কোড দেয়, তাই আপনি সমস্ত মুদ্রণযোগ্য দুটি অক্ষরে অঙ্কগুলিতে পেতে পারেন। ১.৯ আলাদা, 'এ'আর্ডটি আসকি নম্বর দেয় তবে দশমিক সংস্করণের চেয়ে চার বাইট দীর্ঘ হয়।
হিয়াটো

8
বাস্তবায়নের একটি এমনকি গল্ফিয়ার উপায় হ'ল catরুবি ফাইলটি সম্পূর্ণ খালি (0 বাইট) ছেড়ে যাওয়া এবং জোর দিয়ে বলা উচিত যে এটি -pপতাকা সহ কমান্ড লাইন থেকে চালানো উচিত ।
ডানিরো

1
বা, @ ডানিরোর নিজের উত্তর থেকে ,puts *$<
চার্লস

1
১.৮-এ, আমাকে যা করতে হবে তা হল? ~ এবং এটি 126 এ ফিরে আসবে?
সহজ সুন্দর আর্ট

5
বা 12 এর মতো চিন্তাভাবনা ব্যবহার করে আপনি 126 ছাড়িয়ে যেতে পারেন , বা আপনি যদি যথেষ্ট পাগল হন:?﷽.ord=65021
কেবল সুন্দর আর্ট

32

একটি অ্যারের লেজ এবং মাথা পেতে স্প্ল্যাট অপারেটরটি ব্যবহার করুন:

head, *tail = [1,2,3]
head => 1
tail => [2,3]

এটি অন্যান্য উপায়েও কাজ করে:

*head, tail = [1,2,3]
head => [1,2]
tail => 3

*উপাদানগুলিতে যোগ দিতে একটি অ্যারের স্ট্রিং সহ পদ্ধতিটি ব্যবহার করুন :

[1,2,3]*?,
=> "1,2,3"

27
  • ব্যবহার করুন abortপ্রোগ্রাম বিনষ্ট এবং stderr হবে একটি স্ট্রিং প্রিন্ট করতে - চেয়ে খাটো putsদ্বারা অনুসরণexit
  • আপনি যদি এর সাথে একটি লাইন পড়ে থাকেন getsতবে ~/$/তার দৈর্ঘ্য সন্ধান করতে আপনি এটি ব্যবহার করতে পারবেন (এটি যদি বিদ্যমান থাকে তবে এটি নতুন ট্র্যাকিংয়ের পরে গণনা করে না)
  • []স্ট্রিংয়ে অন্যটি রয়েছে কিনা তা পরীক্ষা করতে ব্যবহার করুন :'foo'['f'] #=> 'f'
  • চরিত্র অনুসারে বিকল্পের trপরিবর্তে ব্যবহার করুন gsub:'01011'.tr('01','AB') #=> 'ABABB'
  • আপনার যদি নতুন ট্র্যাকিংয়ের নতুন লাইনগুলি সরিয়ে ফেলতে হয় তবে তার chopপরিবর্তে ব্যবহার করুনchomp

2
+1 এর জন্য abortএবং~/$/
জে__- এল

দয়া করে কীভাবে ব্যবহার করবেন তা ব্যাখ্যা করুন~/$/
ম্যাথিউ CAROFF

@ ম্যাথিউইসিআরএফএফ যতবার আপনি কল করবেন gets, এর ফলাফলটি $_ভেরিয়েবলে সংরক্ষণ করা হবে । /regex/ ~= stringপ্রথম ম্যাচের সূচক ফেরত দেয়। ~একটি রেজেক্সে কল করা সমান /regex/ ~= $_। সুতরাং এটি কিছু হবেs=gets;l= ~/$/
সাইওস

20

আপনার শেষ end

endআপনার কোড থেকে সরানোর চেষ্টা করুন ।

def...endফাংশন সংজ্ঞায়িত করতে ব্যবহার করবেন না । রুবি 1.9 এ নতুন -> অপারেটরের সাথে একটি ল্যাম্বডা তৈরি করুন। (- - অপারেটর হ'ল "ছুরিকাঘাতের ল্যাম্বদা" বা "ড্যাশ রকেট" )) এটি প্রতিটি ফাংশনে 5 টি অক্ষর সংরক্ষণ করে।

# 28 characters
def c n
/(\d)\1/=~n.to_s
end

# 23 characters, saves 5
c=->n{/(\d)\1/=~n.to_s}

মেথড কলগুলি হয় c nবা c(n)। ল্যাম্বদা কলগুলি c[n]। প্রতিটি পরিবর্তন c nকরার c[n]খরচ 1 টি অক্ষর, তাই যদি আপনি ব্যবহার করতে পারেন c nথেকেও ২5 গুন বেশি, তারপর পদ্ধতি রাখা।

যে সমস্ত পদ্ধতিতে do...endব্লক নেওয়া {...}হয় সেগুলি পরিবর্তে ব্লক নিতে পারে । এটি 3 থেকে 5 টি অক্ষর সংরক্ষণ করে। এর প্রাধান্য {...}যদি খুব বেশি হয় তবে এটি ঠিক করার জন্য বন্ধনী ব্যবহার করুন।

# 48 characters
(?a..?m).zip (1..5).cycle do|a|puts a.join','end

# WRONG: passes block to cycle, not zip
(?a..?m).zip (1..5).cycle{|a|puts a.join','}

# 45 characters, saves 3
(?a..?m).zip((1..5).cycle){|a|puts a.join','}

টার্নারি অপারেটরেরif...else...end সাথে প্রতিস্থাপন করুন । যদি কোনও শাখার দুটি বা ততোধিক বক্তব্য থাকে তবে সেগুলি বন্ধনীগুলিতে মুড়ে রাখুন। ?:

# 67 characters
if a<b
puts'statement 1'
puts'statement 2'else
puts'statement 3'end

# 62 characters, saves 5
a<b ?(puts'statement 1'
puts'statement 2'):(puts'statement 3')

আপনার কাছে সম্ভবত নেই whileবা untilলুপ নেই তবে আপনি যদি তা করেন তবে সেগুলি সংশোধক আকারে লিখুন।

(a+=1
b-=1)while a<b

চারপাশে puts'statement 3'প্রয়োজনীয় বন্ধনীগুলি কি প্রয়োজনীয়?
সাইয়েস

15

ডাব্লু0এফএফ যোগ করুন Addition

অ্যারে দিয়ে কাজ করার সময়, 2 টি অক্ষর সংরক্ষণের .compactসাথে প্রতিস্থাপন করা -[nil]যেতে পারে।

উপরের সাথে সংযুক্ত -> আপনি -[p]আরও 2 টি অক্ষর সংরক্ষণ করতে এটিকে আরও খাটো করতে পারেন ।


14

সংক্ষিপ্ত পূর্বনির্ধারিত ভেরিয়েবলগুলি যেখানেই সম্ভব, যেমন $*পরিবর্তে ব্যবহার করুন ARGV। তাদের প্রচুর অন্যান্য দরকারী তথ্যের পাশাপাশি এখানে একটি ভাল তালিকা রয়েছে ।


12

আপনি যখন স্ট্রিং ইন্টারপোলেশন ব্যবহার করছেন, (যেমনটি আপনার মার্টিন বাটনার পোস্ট করা উচিত ), আপনার অবজেক্টের সামনে সিগিল ( $, @) থাকলে আপনার কোঁকড়ানো বন্ধনী প্রয়োজন হবে না । মত ঐন্দ্রজালিক ভেরিয়েবল এর জন্য সহায়ক $_, $&, $1ইত্যাদি:

puts "this program has read #$. lines of input"

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

a=42; puts "here is a: #{a}"; puts "here is a again: #{a}"
$b=43; puts "here is b: #$b"; puts "here is b again: #$b"

11

আপনার যদি কোনও নির্দিষ্ট উপাদান eকোনও সীমার মধ্যে রয়েছে কিনা তা খুঁজে বের করার প্রয়োজন থাকলে আপনি rব্যবহার করতে পারেন

r===e

পরিবর্তে দীর্ঘ:

r.cover?(e) # only works if `r.exclude_end?` is false

অথবা

r.member?(e)

অথবা

r.include?(e)

3
খাটোও না r===e?
akuhn

@ কাকাহন হ্যাঁ, এটি। অনেক সংক্ষিপ্ত। এটি উল্লেখ করার জন্য ধন্যবাদ, এটি আমার কোডটি 10 ​​টি অক্ষর দ্বারা সংক্ষিপ্ত করতে সহায়তা করেছে, যা বিশাল code কোডগলফ.স্ট্যাকেক্সেঞ্জাও
ক্রিশ্চিয়ান লুপাস্কু

1
আপনাকে স্বাগতম. একটি স্যুইচ বিবৃতিতে ব্যবহার করা যেতে পারে এমন সমস্ত কিছুই ===কার্যকর করা হয়েছে।
akuhn

10

$_ সর্বশেষ পঠিত লাইন।

  • print - যদি কোনও যুক্তি মুদ্রিত সামগ্রী দেয় না $_
  • ~/regexp/ - খুব ছোট $_=~/regexp/

রুবি ১.৮ এ আপনার Kernelচালিত চারটি পদ্ধতি রয়েছে $_:

  • chop
  • chomp
  • sub
  • gsub

রুবি ১.৯-এ, এই স্ক্রিপ্টগুলি কেবল তখনই বিদ্যমান যদি আপনার স্ক্রিপ্টটি ব্যবহার করে -nবা -p

আপনি যদি প্রায়শই কিছু পরিবর্তনশীল মুদ্রণ করতে চান তবে ব্যবহার করুন trace_var(:var_name){|a|p a}


2
এগুলি কেবল তখনই উপলভ্য যখন আপনি রুবিটিকে বিকল্প -pবা -nবিকল্প দিয়ে চালান । রেফারেন্স।
ড্যারেন স্টোন

1
দেখে মনে হচ্ছে যে trace_varকেবল বৈশ্বিক $ ভেরিয়েবলগুলি নিয়ে কাজ করে
ডানিরো

10

স্ট্রিং ইন্টারপোলেশন ব্যবহার করুন!

  1. প্রতিস্থাপন করতে to_s। আপনি যদি স্ট্রিংয়ে রূপান্তর করতে চান তার চারপাশে যদি প্রথম বন্ধনীগুলির প্রয়োজন to_sহয় তবে স্ট্রিং ইন্টারপোলেশনের চেয়ে দুটি বাইট দীর্ঘ:

    (n+10**i).to_s
    "#{n+10**i}"
    
  2. সংমিশ্রণ প্রতিস্থাপন। আপনি যদি দুটি অন্যান্য স্ট্রিং দ্বারা বেষ্টিত কোনও জিনিসকে সংযুক্ত করেন তবে বিরতি আপনাকে একটি বাইট বাঁচাতে পারে:

    "foo"+c+"bar"
    "foo#{c}bar"
    

    মধ্যবর্তী জিনিসটি নিজেই সংক্ষিপ্ত হয়ে থাকলে এছাড়াও কাজ করে, যদি আপনি কেবল একত্রিতকরণের অভ্যন্তরে (একাধিক সংযোগ ব্যবহারের পরিবর্তে) যুক্তিটি সরিয়ে থাকেন:

    "foo"+c+d+e+"bar"
    "foo#{c+d+e}bar"
    

10

চলুন lengthমধ্যেif a.length<n

lengthকোড গল্ফ এ কিছুটা ব্যয়বহুল 6 বাইট। অনেক পরিস্থিতিতে, আপনি পরিবর্তে অ্যারেতে একটি নির্দিষ্ট বিন্দুতে কিছু আছে কিনা তা পরীক্ষা করতে পারেন। আপনি যদি শেষ সূচকটি ধরে nilফেলেন তবে আপনি পাবেন একটি মিথ্যা মান value

সুতরাং আপনি পরিবর্তন করতে পারেন:

if a.length<5থেকে if !a[4]-5 বাইট জন্য

অথবা

if a.length>5থেকে if a[5]-6 বাইট জন্য

অথবা

if a.length<nথেকে if !a[n-1]-3 বাইট জন্য

অথবা

if a.length>nথেকে if a[n]-6 বাইট জন্য

দ্রষ্টব্য : সমস্ত সত্যবাদী মানের একটি অ্যারে নিয়ে কাজ করবে। অ্যারে থাকা nilবা এর falseমধ্যে থাকা সমস্যার কারণ হতে পারে।


4
আমি সবসময় ব্যবহার করি size... তবে এটি অবশ্যই আরও ভাল। বিটিডাব্লু, Stringখুব কাজ করে।
manatwork

10

trueএবং falseকীওয়ার্ডগুলি ব্যবহার করবেন না ।

ব্যবহার করুন:

  • !pজন্য true(ধন্যবাদ, histocrat!)
  • !0জন্য false। আপনার যা যা প্রয়োজন তা যদি একটি মিথ্যা মান হয় তবে আপনি সহজেই ব্যবহার করতে পারেন p(যা প্রত্যাবর্তন করে nil)।

কিছু অক্ষর বাঁচাতে।


1
যদি না আপনার আসলে প্রয়োজন হয় true(যেমন যদি সত্যের মান যথেষ্ট হয় তবে যদি কোনও শর্তের মতো) তবে আপনার প্রয়োজনও নেই !!
মার্টিন ইন্ডার

4
এবং একইভাবে, p(যা মূল্যায়ন করে nil) একটি সংক্ষিপ্ত মিথ্যা মান। কোনটি পেতে সংক্ষিপ্ত রাস্তা মানে trueহয় !p
হিস্টোক্র্যাট

@ হিস্টোক্র্যাট ভাল পয়েন্ট! আমি আমার উত্তর সম্পাদনা করেছি।
ক্রিশ্চিয়ান লুপাস্কু


9

আপনি কি কখনো থেকে একটি নম্বর পেতে করার প্রয়োজন হলে ARGV, getবা অনুরূপ কিছু কিছু যে অনেক বার, পরিবর্তে কলিং করতে to_iএটিতে, আপনি শুধু ব্যবহার করতে পারেন ?1.upto x{do something x times}যেখানে x একটি পংক্তি।

এর ?1.upto(a){}পরিবর্তে ব্যবহার করা x.to_i.times{}আপনাকে 2 টি অক্ষর সাশ্রয় করবে।

এছাড়াও আপনি ভালো জিনিস পুনরায় লিখতে পারেন p 1 while 1অথবা p 1 if 1যেমন p 1while 1বাp 1if 1

এই উদাহরণটি খুব কার্যকর নয়, তবে এটি অন্যান্য জিনিসের জন্য ব্যবহার করা যেতে পারে।

এছাড়াও, যদি আপনাকে কোনও ভেরিয়েবলের জন্য অ্যারের প্রথম উপাদানটি বরাদ্দ করতে হয় তবে a,=cতার বিপরীতে দুটি অক্ষর সংরক্ষণ করা হবেa=c[0]


9

রুবি নতুন বৈশিষ্ট্য 2.3 এবং 2.4

নতুন গেমের বৈশিষ্ট্য যা আপনার গল্ফ গেমকে সহায়তা করবে সেগুলি দূরে থাকাই ভাল। সর্বশেষতম রুবিসে কয়েকটি দুর্দান্ত আছেন great

রুবি ২.৩

নিরাপদ নেভিগেশন অপারেটর: &.

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

arr = ["zero", "one", "two"]
x = arr[5].size
# => NoMethodError: undefined method `size' for nil:NilClass

x = arr[5].size rescue 0
# => 0

"নিরাপদ নেভিগেশন অপারেটর" পুরো nilকল্পনাটির nilজন্য যদি কোনও ব্যক্তি ফিরে আসে এবং ফিরে আসে তবে পদ্ধতি কলগুলির চেইনটি থামায় :

x = arr[5]&.size || 0
# => 0

Array#dig & Hash#dig

একটি সুন্দর সংক্ষিপ্ত নাম সহ নেস্টেড উপাদানগুলিতে গভীর অ্যাক্সেস:

o = { foo: [{ bar: ["baz", "qux"] }] }
o.dig(:foo, 0, :bar, 1) # => "qux"

ফেরত পাঠায় nilযদি এটি একটি কানাগলি হিট:

o.dig(:foo, 99, :bar, 1) # => nil

Enumerable#grep_v

বিপরীত Enumerable#grep-returns সব উপাদান আছে যা দেওয়া যুক্তি মিলছে না (সঙ্গে তুলনা ===)। পছন্দ করুন grep, যদি কোনও ব্লক দেওয়া হয় তবে এর পরিবর্তে ফলাফল ফিরে আসে।

(1..10).grep_v 2..5 # => [1, 6, 7, 8, 9, 10]
(1..10).grep_v(2..5){|v|v*2} # => [2, 12, 14, 16, 18, 20]

Hash#to_proc

প্রদত্ত কীটির জন্য মান প্রদান করে এমন একটি প্রোক ফেরত দেয় যা বেশ কার্যকর হতে পারে:

h = { N: 0, E: 1, S: 2, W: 3 }
%i[N N E S E S W].map(&h)
# => [0, 0, 1, 2, 1, 2, 3]

রুবি ২.৪

রুবি ২.৪ এখনও বাইরে নেই তবে এটি শীঘ্রই হবে এবং এর দুর্দান্ত কিছু বৈশিষ্ট্য রয়েছে। (এটি প্রকাশিত হলে আমি ডক্সের কয়েকটি লিঙ্ক সহ এই পোস্টটি আপডেট করব)) আমি এই দুর্দান্ত ব্লগ পোস্টে এর বেশিরভাগটি সম্পর্কে শিখেছি ।

Enumerable#sum

আর নেই arr.reduce(:+)। আপনি এখন ঠিক করতে পারেন arr.sum। এটি একটি alচ্ছিক প্রাথমিক মান আর্গুমেন্ট নেয় যা সংখ্যাসূচক উপাদানগুলির জন্য 0 এ ডিফল্ট হয় ( [].sum == 0)। অন্যান্য ধরণের জন্য আপনাকে প্রাথমিক মান সরবরাহ করতে হবে। এটি এমন একটি ব্লক গ্রহণ করে যা সংযোজনের আগে প্রতিটি উপাদানকে প্রয়োগ করা হবে:

[[1, 10], [2, 20], [3, 30]].sum {|a,b| a + b }
# => 66

Integer#digits

এটি ন্যূনতম-থেকে-বৃহততম তাত্পর্য ক্রমে কোনও সংখ্যার ডিজিটের একটি অ্যারে প্রদান করে:

123.digits # => [3, 2, 1]

তুলনায়, বলুন, 123.to_s.chars.map(&:to_i).reverseএটি বেশ সুন্দর।

বোনাস হিসাবে, এটি একটি alচ্ছিক রেডিক্স যুক্তি লাগে:

a = 0x7b.digits(16) # => [11, 7]
a.map{|d|"%x"%d} # => ["b", "7"]

Comparable#clamp

টিনে যা বলে তা করে:

v = 15
v.clamp(10, 20) # => 15
v.clamp(0, 10) # => 10
v.clamp(20, 30) # => 20

যেহেতু এটি তুলনীয় হয় আপনি এটি যে কোনও শ্রেণীর সাথে তুলনীয় সহ অন্তর্ভুক্ত ব্যবহার করতে পারেন, যেমন:

?~.clamp(?A, ?Z) # => "Z"

String#unpack1

একটি 2 বাইট সঞ্চয় বেশি .unpack(...)[0]:

"👻💩".unpack(?U)    # => [128123]
"👻💩".unpack(?U)[0] # => 128123
"👻💩".unpack1(?U)   # => 128123

জন্য যথার্থ যুক্তি Numeric#ceil, floorএবংtruncate

Math::E.ceil(1) # => 2.8
Math::E.floor(1) # => 2.7
(-Math::E).truncate(1) # => -2.7

শর্তসাপেক্ষে একাধিক অ্যাসাইনমেন্ট

এটি রুবির পূর্ববর্তী সংস্করণগুলিতে একটি ত্রুটি উত্থাপন করে তবে এটি ২.৪-এ অনুমোদিত।

(a,b=1,2) ? "yes" : "no" # => "yes"
(a,b=nil) ? "yes" : "no" # => "no"

গলফ Math::E.ceil(1)থেকে Math::E.ceil 1, এবং অনুরূপভাবে জন্য floorএবং truncate
কেবল সুন্দর আর্ট

1
@ সিম্প্লি বিউটিফুলআর্ট আমি আশা করি যে রুবীতে গল্ফ করা কেউ এই লাফটি নিজেরাই তৈরি করতে সক্ষম হবেন।
জর্দান

জন্য Enumerable#sum, .flatten.sum2 বাইটের চেয়ে ছোট.sum{|a,b|a+b}
অসোন তুহিদ

(-Math::E).truncate(1)যার সমান -Math::E.truncate(1)1 বাইট সংক্ষিপ্ত
Asone Tuhid

1
&.এটির মতো সাবস্ক্রিপশনের সাথে ব্যবহার করা যেতে পারে a&.[]i(1 বাইটের চেয়ে কম a&.at i)। যদিও, যদি বন্ধনীগুলির প্রয়োজন হয়, a||a[i]তবে 1 বাইটটি তার চেয়ে কম a&.[](i)বাa&.at(i)
Asone Tuhid

7

বৈজ্ঞানিক স্বরলিপি প্রায়শই চার বা দু'বার শেভ করতে ব্যবহার করা যেতে পারে:

x=1000
#versus
x=1e3

9
দ্রষ্টব্য: এটি পূর্ণসংখ্যার পরিবর্তে একটি ফ্লোট মান (1000.0) ফিরিয়ে দেবে, যার ফলে বৃহত সংখ্যার সাথে ভুল ফলাফল হতে পারে।
ডগবার্ট

4
আহ, সুন্দর যখন শতাংশ প্রয়োজন 1e2হয় তার চেয়ে ভাল 100.0
ফ্রোগজ

এই নীতি অনুরূপ, 1.0*1 টির গৃহস্থালির কাজ খাটো.to_f
Unihedron

7

প্রথম বন্ধনী পরিবর্তে অপারেটর পদ্ধতি ব্যবহার করুন

বলুন আপনি প্রকাশ করতে চান a*(b+c)। অগ্রাধিকারের কারণে, a*b+cকাজ করবে না (স্পষ্টতই)। পদ্ধতি হিসাবে অপারেটরদের থাকার রুবির দুর্দান্ত উপায়টি উদ্ধার করতে আসে! a.*b+cএর *চেয়ে নিম্নের নজির তৈরি করতে আপনি ব্যবহার করতে পারেন +

a*(b+c) # too long
a*b+c   # wrong
a.*b+c  # 1 byte saved!

এই সাথে কাজ করতে পারেন !এবং ~অপারেটরদের (ইউনারী ভালো জিনিস +বা ইউনারী -কাজ করে না কারণ তাদের পদ্ধতি -@এবং +@সংরক্ষণ ()কিন্তু যোগ .@)

(~x).to_s # too long
~x.to_s   # error
x.~.to_s  # 1 byte saved!

6

||পরিবর্তে orএবং &&পরিবর্তে ব্যবহার করুন and

andআপনার কাছ থেকে একটি চরিত্রের পাশাপাশি অপারেটরের আশেপাশের স্পেসগুলি (এবং সম্ভবত বন্ধনী) সংরক্ষণ করতে পারেন।

p true and false ? 'yes' :'no'   #-> true (wrong result)
p (true and false) ? 'yes' :'no' #-> 'no'
p true&&false ? 'yes' :'no'      #-> 'no', saved 5 characters


p true or false ? 'yes' :'no'   #-> true (wrong result)
p (true or false) ? 'yes' :'no' #-> 'yes'
p true||false ? 'yes' :'no'      #-> 'yes', saved 4 characters

আপনি যদি কোনও অ্যারে লুপ করেন তবে আপনি সাধারণত ব্যবহার করেন each। তবে mapএকটি অ্যারের উপরেও লুপ হয় এবং এটি একটি চরিত্রের চেয়ে ছোট।


6

আমি সবেমাত্র একটি টিডিডি কোড-গল্ফ চ্যালেঞ্জ চেষ্টা করেছি অর্থাৎ চশমাটি পাস করার জন্য সংক্ষিপ্ততম কোড লিখুন। চশমা কিছু ছিল

describe PigLatin do
  describe '.translate' do
    it 'translates "cat" to "atcay"' do
      expect(PigLatin.translate('cat')).to eq('atcay')
    end
    # And similar examples for .translate
  end
end

কোড-গল্ফের খাতিরে, একটির জন্য একটি মডিউল বা ক্লাস তৈরি করা দরকার না।

পরিবর্তে

module PigLatin def self.translate s;'some code'end;end

এক করতে পারেন

def(PigLatin=p).translate s;'some code'end

13 টি অক্ষর বাঁচায়!


7
হা, খুব পুঙ্খানুপুঙ্খ। শুধু আপনাকে প্রয়োজনীয় আচরণ যোগ হয়নি PigLatin, কিন্তু এ ছাড়া @pig_latin, $pig_latinএবং 'pig'['latin']
হিস্টোক্র্যাট

@ ইতিহাসবিদ: এখন আমি এটি পেয়েছি এটি কারণ translateসংজ্ঞায়িত করা হয়েছে nil
এরিক ডুমিনিল

6

কার্নেল # পি একটি মজাদার পদ্ধতি।

p varপরিবর্তে ব্যবহার করুন puts var। এটি পূর্ণসংখ্যা এবং ভাসমানগুলির সাথে পুরোপুরি কাজ করে তবে সমস্ত ধরণের সাথে নয়। এটি স্ট্রিংগুলির চারপাশে উদ্ধৃতি চিহ্নগুলি প্রিন্ট করে, যা সম্ভবত আপনি চান তা নয়।

একক যুক্তি দিয়ে ব্যবহৃত হয়, pএটি মুদ্রণের পরে যুক্তিটি ফেরত দেয়।

একাধিক আর্গুমেন্টের সাথে ব্যবহৃত, pএকটি অ্যারেতে আর্গুমেন্টগুলি প্রদান করে।

ব্যবহার করুন p(কোনো আর্গুমেন্ট বিনা সঙ্গে) পরিবর্তে nil


10
দুর্ভাগ্যক্রমে p 'some string'মুদ্রণগুলি "some string"এবং কেবল some stringএটিই নয় যা প্রায়শই অন্যেরা সমালোচিত হন।
প্যাট্রিক অসিটি

1
মূলত p sএকইরকম puts s.inspect, তবে এটি ফিরে আসেs
সাইয়েস

6

# ইচ ব্যবহার করবেন না। আপনি # মানচিত্রের সাহায্যে সমস্ত উপাদান লুপ করতে পারেন। পরিবর্তে তাই

ARGV.each{|x|puts x}

আপনি কম বাইটে একই কাজ করতে পারেন।

ARGV.map{|x|puts x}

অবশ্যই, এই ক্ষেত্রে puts $*এমনকি আরও খাটো হবে।


যুক্তিযুক্ত এবং জটিল সংখ্যার জন্য আক্ষরিক রয়েছে:

puts 3/11r == Rational(3,11)
puts 3.3r == Rational(66,20)
puts 1-1.i == Complex(1,-1)

=> true
true
true

আপনি স্ট্রিংয়ের মধ্যে সর্বাধিক বাইট ব্যবহার করতে পারেন। "\x01"(6 বাইট) ছোট করা যেতে পারে ""(3 বাইট)। আপনার যদি কেবলমাত্র এই একটি বাইটের প্রয়োজন হয় তবে এটি আরও ছোট করা যেতে পারে ?(2 বাইট)।

একই টোকেন দ্বারা, আপনি এই জাতীয়ভাবে নতুন লাইনগুলি সংক্ষিপ্ত পেতে পারেন:

(0..10).to_a.join'
'

 => "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10"

আপনি ব্যবহার করতে পারেন ?\nএবং ?\tপাশাপাশি, যা এক থেকে বাইট কম "\n"এবং কম "\t"। অবরুদ্ধকরণের জন্য, সেখানেও?, গুলি, একটি স্থান।


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

A=C+B=7+C=9

=> A=17, B=16, C=9

এটি C=9;B=16;A=17বা এর চেয়ে কম C=0;B=C+7;A=C+B


আপনার যদি অসীম লুপের প্রয়োজন হয় তবে ব্যবহার করুন loop{...}। অজানা দৈর্ঘ্যের লুপগুলি অন্যান্য লুপগুলির সাথে সংক্ষিপ্ত হতে পারে:

loop{break if'
'==f(gets)}

while'
'!=f(gets);end

আরও কিছু gsub / regexp কৌশল। '\1'একটি ব্লকের পরিবর্তে বিশেষ অব্যাহতি অক্ষরগুলি ব্যবহার করুন:

"golf=great short=awesome".gsub(/(\w+)=(\w+)/,'(\1~>\2)')

"golf=great short=awesome".gsub(/(\w+)=(\w+)/){"(#{$1}~>#{$2})")

এবং বিশেষ ভেরিয়েবল $1ইত্যাদি যদি আপনার অপারেশন করার প্রয়োজন হয়। মনে রাখবেন সেগুলি কেবলমাত্র ব্লকের ভিতরেই সংজ্ঞায়িত করা হয়:

"A code-golf challenge." =~ /(\w+)-(\w+)/
p [$1,$2,$`,$']

=> ["code", "golf", "A ", " challenge."] 

স্পেস, নিউলাইন এবং প্রথম বন্ধনী থেকে মুক্তি পান। আপনি রুবিতে বেশ কিছুটা বাদ দিতে পারেন। যদি সন্দেহ হয় তবে সর্বদা চেষ্টা করুন যদি এটি ছাড়াই কাজ করে তবে তা মনে রাখবেন এটি হাইডাইলিং করে কিছু সম্পাদক বাক্য গঠন ভঙ্গ করতে পারে ...

x+=1if$*<<A==????::??==??

"দয়া করে উত্তরে একটি টিপ পোস্ট করুন post" এছাড়াও দুর্দান্ত ?\n, তবে কোটের ভিতরে একটি নতুন লাইনের চরিত্র রাখার চেয়ে আসলে খাটো নয়। (ট্যাবটির জন্য একই)
মার্টিন এন্ডার

এবং puts$*আরও খাটো হয়।
সাইয়েস

আমি জানি আপনি একটি বিষয় প্রমাণ করার চেষ্টা করেছিলেন তবে আমি নিশ্চিত যে শেষ উদাহরণটি একই রকমx+=1;$*<<A
Asone Tuhid

6

স্প্ল্যাট অপারেটরটি ব্যবহারের অন্য একটি উপায়: আপনি যদি একটি একক অ্যারে আক্ষরিক অর্পণ করতে চান *তবে বাম-হাতের একটি ডানদিকের বন্ধনীগুলির চেয়ে ছোট is

a=[0]
*a=0

একাধিক মান সহ আপনার এমনকি স্প্ল্যাট অপারেটরের প্রয়োজন নেই (এটি সম্পর্কে আমাকে সংশোধন করার জন্য হিস্টোক্র্যাটকে ধন্যবাদ):

a=[1,2]
a=1,2

পরবর্তী ক্ষেত্রে আসলে স্প্ল্যাটের প্রয়োজন হয় না।
হিস্টোক্র্যাট

@ ইতিহাসবিদ ওহ বাহ, আমি ভেবেছিলাম দ্বিতীয় ক্ষেত্রে সেক্ষেত্রে কেবল বাতিল হয়ে যাবে।
মার্টিন ইন্ডার

1
আমি বিশ্বাস করতে পারি না যে আমি রুবিতে গল্ফ করে কাটিয়েছি এমন সময় আমি এগুলি জানি না।
ডুরকনব

6

যখন কোনও চ্যালেঞ্জের প্রয়োজন হয় যে আপনি একাধিক লাইন আউটপুট তৈরি করেন, প্রতিটি লাইন যেমন একটি অ্যারের মুদ্রণ করতে আপনাকে আপনার ফলাফলগুলি থেকে লুপ করতে হবে না । putsপদ্ধতি একটি অ্যারের চেপ্টা এবং একটি পৃথক লাইনে প্রতিটি উপাদান প্রিন্ট করবে।

> a = %w(testing one two three)
> puts a
testing
one
two
three

#pআপনার সাথে স্প্ল্যাট অপারেটরের সংমিশ্রণ এটি আরও ছোট করে তুলতে পারে:

p *a

স্প্ল্যাট অপারেটর (প্রযুক্তিগতভাবে *@পদ্ধতিটি, আমি মনে করি) আপনার অ-অ্যারে অঙ্কগুলিকে অ্যারেতেও কাস্ট করে:

> p a.lazy.map{|x|x*2}
#<Enumerator::Lazy: #<Enumerator::Lazy: [1, 2, 3]>:map>

বনাম

> p *a.lazy.map{|x|x*2}
2
4
6

1
*@কোনও পদ্ধতি নয়, স্প্ল্যাট সিনট্যাকটিক চিনি
আসোন তুহিদ

6

একটি অ্যারের পুনরাবৃত্তি উপাদানগুলি সরানোর সময় কিছু বাইট সংরক্ষণ করুন

a.uniq # before
a|[]   # after
    ^^

আপনি যদি []কোনও ভেরিয়েবলের খালি অ্যারে ব্যবহার করেন তবে আপনি আরও বেশি বাইট সংরক্ষণ করতে পারেন:

a.uniq;b=[] # before
a|b=[]      # after
      ^^^^^

2
প্রথম a&a
কেসটির

5

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

rvm install goruby

Goruby আপনি আপনার কোড অধিকাংশ লিখতে হিসাবে আপনি রুবি লেখার হবে পারবেন, কিন্তু সালে নির্মিত অতিরিক্ত বর্ণমালা রয়েছে কিছু কম প্রাপ্তিসাধ্য সংক্ষেপ জানতে, আপনি সাহায্যকারী পদ্ধতি ব্যবহার করতে পারেন। shortest_abbreviationউদাহরণস্বরূপ:

shortest_abbreviation :puts
#=> "pts"

Array.new.shortest_abbreviation :map
#=> "m"

String.new.shortest_abbreviation :capitalize
#=> "cp"

Array.new.shortest_abbreviation :join
#=> "j"

এছাড়াও খুব সহজেই হ'ল একটি উপাধি যার sayজন্য putsনিজেই সংক্ষিপ্তসারিত হতে পারে s। পরিবর্তে তাই

puts [*?a..?z].map(&:capitalize).join

আপনি এখন লিখতে পারেন

s [*?a..?z].m(&:cp).j

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

পিএস: hপদ্ধতিটি মিস করবেন না ;-)



5

এর পরিবর্তে একটি অ্যারেতে যোগ দিতে

[...].join

এটা কর

[...]*''

যা 2 বাইট সংরক্ষণ করে। বিভাজক ব্যবহারের সাথে যোগ দিতে

[...]*?,

5

সাবস্ক্রিপিং নম্বর!

আমি গতকাল সবেমাত্র এটি আবিষ্কার করেছি। তৃতীয় অবস্থানে বিট n[i]ফিরে আসে । উদাহরণ:ni

irb(main):001:0> n = 0b11010010
=> 210
irb(main):002:0> n[0]
=> 0
irb(main):003:0> n[1]
=> 1
irb(main):004:0> n[2]
=> 0
irb(main):005:0> n[3]
=> 0
irb(main):006:0> n[4]
=> 1
irb(main):007:0> n[5]
=> 0

এবং এখন আপনি আরও যুক্তি ব্যবহার করতে পারেন যেমনn[0..3]
কেবল সুন্দর আর্ট

4

আপনি 2 টি অক্ষর সংরক্ষণ করতে এবং ব্যবহার করতে সক্ষম হতে পারেন

[*(...)]

পরিবর্তে

(...).to_a

উদাহরণস্বরূপ, ধরুন আমাদের একটি পরিসর রয়েছে যা আমরা অ্যারে হিসাবে চাই:

(1..2000).to_a

কেবল এটির মতো করুন:

[*1..2000]  #  Parentheses around the (ran..ge) is not needed!

এবং এখন আপনার অ্যারে হিসাবে আপনার পরিসীমা আছে।


5
আমারও মনে হয় [*1..2000]কাজ হয়?
লিন

4

<< কৌশল

a.push x

সংক্ষিপ্ত করা যেতে পারে:

a<<x

-4 বাইট জন্য।


2
দ্রষ্টব্য: এটি Strings
সাইওস

4

Array#assoc/rassoc

আপনার যখন অ্যারে রয়েছে এবং কোনও নির্দিষ্ট মান দিয়ে শুরু হওয়া সাব-অ্যারেটি সন্ধান করতে চান Enumerable#find, তখন ব্যবহার করবেন না , ব্যবহার করুন Array#assoc:

a = [[0,"foo"],[0,"bar"],[1,"baz"],[0,"qux"]]
a.find{|x,|x==1} # => [1,"baz"]
a.assoc(1) # => [1,"baz"]

এটি Enumerable#any?কিছু পরিস্থিতিতে একটি ভাল প্রতিস্থাপন ।

Array#rassoc একই জিনিসটি করে তবে সাব-অ্যারেগুলির শেষ উপাদানটি পরীক্ষা করে:

a = [[123,"good"],[456,"good"]]
a.any?{|*,x|x=="bad"} # => false
a.rassoc("bad") # => nil

উদাহরণস্বরূপ a.any?লাইনের জন্য rassoc , কী করে |x,|? এর থেকে আলাদা কীভাবে |x|?
সাইয়েস

@Cyoce ব্লক প্যারামিটার ডেসট্রাকচারিং অ্যাসাইনমেন্ট ডেসট্রাকচারিং যেমন একই নিয়ম অনুসরণ করে, তাই এটি মত x=[1,2]বনাম x,=[1,2]। উপরের আমার উদাহরণটি ব্যবহার করে |x|, প্রথম পুনরাবৃত্তিতে xএটি হবে [0,"foo"]। সাথে |x,y|, xথাকবে 0এবং yথাকবে "foo"। তেমনি, সাথে |x,|, xহবে 0। অন্য কথায়, এটি বলে যে "প্রথম উপাদানটি রেখে দিন xএবং বাকীটি ফেলে দিন
জর্ডান

মনে রাখবেন যে এটি বিপরীতে কাজ করে না, উদাহরণস্বরূপ |,y|একটি সিনট্যাক্স এরর, এরগো |_,y|। তবে আমি এখনই বুঝতে পেরেছি যে |*,y|কাজ করে, যা নামের পরিবর্তক _(তবে কোনও সংক্ষিপ্ত নয়) ব্যবহারের চেয়ে পরিষ্কার er
জর্দান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.