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


15

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

উত্তর:


7

lmapপরিবর্তে ব্যবহার করুন foreach। এর জন্য টিসিএল 8.6 প্রয়োজন।

বাক্য গঠন একই, তবে lmapপ্রতিটি লুপের ফলাফল সহ একটি তালিকা প্রদান করে।


4

আমার উত্তরে /codegolf//a/107557/29325 আমি প্রদর্শন করতে পারি:

  1. সাধারণত set j 0;while \$j<$n;{...;incr j}সমপরিমাণের চেয়ে কম হয়for {set j 0} {$j<$n} {incr j} {...}

  2. যখন লুপিং ভেরিয়েবলটি 1 এ শুরু হয়, আমরা whileপরীক্ষার শর্তের অংশ হিসাবে ইনক্রিমেন্টটি করতে পারি , set i 1অযথা লেখার আগে এড়াতে : while {[incr i]<=$n} {...}পরিবর্তেset i 1;while \$i<=$n;{...;incr i}

মনোযোগ : বাইরের লুপের ক্ষেত্রে একজন কেবল 2 টি করতে পারে! আমি এটি আমার jচলকটিতে প্রয়োগ করতে পারি নি কারণ এটির নিজের অভ্যন্তরের লুপের বাইরের 1 এ এটি পুনরায় সেট করা দরকার! এবং incr jঅভ্যন্তরীণ লুপের শেষ ধাপে সেট করা মানটি অর্জন করবে, এটি ধরে নেওয়ার পরিবর্তে একটি অনির্ধারিত ভেরিয়েবল দখল এবং এটিতে বাড়ানোর জন্য !j01


4

কখনও কখনও এটি স্বাভাবিক বা লুপের পরিবর্তে পুনরাবৃত্তির সংখ্যা time {script} nকোথায় nহয় তা ব্যবহার করার উপযুক্ত । যদিও এর উদ্দেশ্যটি লুপিং নয়, প্রাপ্ত প্রভাব একই।whilefortime

আমি এই নির্দেশ অনুসরণ করে আমার নিজের উত্তরগুলিতে সম্প্রতি পরিবর্তন করেছি।

আপডেট: আমি সবেমাত্র ঝরঝরে পড়ার সহজ আবিষ্কার করেছি: আপনি একটি forবা whileএকটি timeব্লক দ্বারা প্রতিস্থাপন করতে পারবেন না , যদি এতে একটি breakবা একটি থাকে continue


3

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

উদাহরণ:

  • gets -> ge
  • lassign -> las
  • expr -> exp
  • puts -> pu

এবং ইন্টারেক্টিভ সমাধানগুলি বিনামূল্যে: পি

পটভূমি :

যখন tclshইনপুট ডিভাইস হিসাবে একটি টার্মিনাল সঙ্গে রানে, এটা পরিবর্তনশীল সেট করে tcl_interactiveকরতে 1। এই unknownনামটি দিয়ে শুরু হওয়া কমান্ডগুলির সন্ধানের জন্য এটি (ডিফল্ট পদ্ধতি যা বলা হবে যদি একটি আদেশ পাওয়া যায় না)।

ডাউনসাইড: এটি প্রতিটি লাইনের ফলাফল মুদ্রণ করবে ;, নতুন লাইনের পরিবর্তে ব্যবহার করবে ।
ওহ, এবং এটি বাইরের কমান্ডগুলির অনুরোধ করতে পারে, এটির wএকটি ভাল সংক্ষেপণ while


3

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

এরপরে আপনি এটিকে namespaceসত্যিকারের কিছু খারাপ কাজ করার যাদুতে ব্যবহার করতে পারেন । এই বিবেচনা:

namespace exp *;namespace en cr -c ?

তারপরে, ?এখন একটি যাদু কমান্ড যা আপনাকে যে কোনও বিশ্বব্যাপী টিসিএল কমান্ড সংক্ষিপ্ত করতে দেয় এবং এর সাথে জগাখিচির অদ্ভুত অনিশ্চয়তা ছাড়াই unknown


2

আমি Tcl 8.0.5 ব্যবহার করছি তবে আমি বিশ্বাস করি যে নিম্নলিখিতটি সমস্ত সাম্প্রতিক সংস্করণে প্রযোজ্য।

  1. renameনাম পরিবর্তন করতে ব্যবহার করুন rename:

    rename rename &
    

    যে &কোনও সনাক্তকারী হতে পারে; &আমাকে কেবল সি এর "রেফারেন্স" মনে করিয়ে দেয়

  2. নাম পরিবর্তন renameকরতে পুনরায় নাম ব্যবহার করুন set:

    & set =
    

    আবার, যে =কোনও সনাক্তকারী হতে পারে; =আমার কাছে কেবল স্বজ্ঞাত।

  3. এখন, অন্যান্য কমান্ডের যে মূল্য পুনঃনামকরনের হয়, নামান্তর যেমন

    & regsub R
    & string S
    & while W
    

    একটি কমান্ড যদি এর দৈর্ঘ্য n , এবং কে , কে (এন -1) - (এন + 4)> 0 দেওয়া হয় তবে তার নাম পরিবর্তন করা যায় । কে জন্য সমাধান , সূত্র হয় k > (n+4)/(n-1)। এখানে একটি রেফারেন্স সারণী যা এটি সহজ করে তোলে:

    length of       minimum         example(s)
    command         occurrences
    ------------------------------------------------
    2               6               if (consider renaming to "?")
    3               4               for, set (consider renaming to "=")
    4               3               eval, expr, incr (consider renaming to "+"), info, join, proc, puts, scan
    5               3               break, catch, lsort, split, subst, trace, unset, while
    6               3               format, lindex, lrange, regexp, regsub, rename, return, string, switch
    7               2               foreach, lappend, linsert, llength, lsearch, unknown
    .               2               lreplace
    .               2               continue
    .               2               
    
  4. এরপরে, কমপ্যাক্ট প্রায়শই ব্যবহৃত সাবকম্যান্ডগুলি পছন্দ করে

    = I index
    = L length
    

    যাতে আপনি ভালো জিনিস করতে পারেন

    S $I $x 7
    S $L $x
    
  5. কিছু সুস্পষ্ট বিবিধ:

    1. lappend তালিকার প্রথম উপাদানটি এখনও বিদ্যমান না থাকলে সেট করতে পারে (আরম্ভ করার প্রয়োজন নেই)।
    2. আপনি ব্যবহার না করেই অ্যারে সেট করতে পারেন array, যেমন set doesNotExist(7) 43
    3. আপনি এর "a b c"পরিবর্তে স্ট্রিং ( ) ব্যবহার করতে পারেন [list a b c]
    4. আপনি এত মত স্ট্রিং মধ্যে ঢুকান পারেন: foo${a}bar
    5. আপনি two\ wordsবরং ব্যবহার করতে পারেন "two words"। (সাধারণভাবে মনে রাখবেন যে স্পেস ছাড়াই সংলগ্ন স্ট্রিংয়ের জন্য, ডাবল উদ্ধৃতি বাদ দেওয়া যেতে পারে!)
    6. একটি অক্ষর বা দুটি সংরক্ষণ করার জন্য আপনি প্রায় সর্বদা forএস হিসাবে পুনরায় লিখতে পারেন while, যেহেতু একটি পৃথক ব্লক ব্যবহার করে whileএকই সাথে চেক এবং বর্ধন করতে পারে for
  6. বৃহত্তর প্রোগ্রামগুলির জন্য, আমি এমন একটি কৌশল সম্পর্কে চিন্তা করেছি যা এখনও প্রয়োগ করে নি:

    proc unknown {c args} {eval [info commands $c*] $args}
    

    এটি ইন্টারেক্টিভ কমান্ড সংক্ষেপণগুলি অনুকরণ করে! এটা তোলে 54 অক্ষর খরচ, কিন্তু এখন আপনি ব্যবহার করতে পারেন jজন্য join, spজন্য split, stজন্য string, wজন্য while, ইত্যাদি।


1
আপনি যদি ইন্টারেক্টিভ সংক্ষেপণগুলি অনুকরণ করতে চান,info script {};set tcl_interactive 1
জোহানেস কুহন

শীতল ধন্যবাদ! আমি তোমাদের জমা থাকেন এখানে । সেই কৌশলটির সাথে কিছু সমস্যা ছিল, তবে আমি এই unknownরুটের সাথে মুখোমুখি হই নি : এখানে এবং এখানে দেখুন
অ্যান্ড্রু চিউং

প্রশ্ন টিসিএল-এর জন্য কিছুটা সুনির্দিষ্ট টিপসের জন্য জিজ্ঞাসা করে। টেরিনারি অপারেটরটি সমস্ত ভাষার টিপসের অন্তর্ভুক্ত ।
পিটার টেলর

@ পিটারটেলর - ধন্যবাদ, আমি সেই পরামর্শটি সরিয়েছি।
অ্যান্ড্রু চিউং


1

এটি অন্য উত্তরে একীভূত হওয়া উচিত, তবে এখানে এটি যায়:

যখন একটি procমাত্র প্যারামিটার থাকে এটি হিসাবে লেখা যেতে পারে

proc p a {DO THINGS}

পরিবর্তে

proc p {a} {DO THINGS}

procব্যাকস্ল্যাশ ব্যবহার করে একই দুটি পরামিতি প্রয়োগ করা হয় ; এটি হিসাবে লেখা যেতে পারে

proc p a\ b {DO THINGS}

পরিবর্তে

proc p {a b} {DO THINGS}

পরামিতির একটি উচ্চ সংখ্যার জন্য {}সংক্ষিপ্ত কোড রেন্ডার।


1

কখনও কখনও দুটি setস্টেটমেন্টকে কেবল একটি lappendবিবৃতি দিয়ে স্ট্রাক্টকেটেট করে প্রতিস্থাপন করা ভাল । যেমন একটি নির্মাণে, কেউ বিকল্প করতে পারেন

set s ""

loop {
    # ...
    set s $s\X
}

দ্বারা

loop {
    # ...
    append s X
}

appendকমান্ড একটি আছে incrমত আচরণ, যা একটি এখনো সংজ্ঞায়িত পরিবর্তনশীল সূচনা।

না ভুল যত্ন নিন appendদ্বারাlappend


1

যদি আপনি এমন কোনও ক্রিয়াকলাপের সাথে তালিকাটি পরিচালনা করছেন যা সিন্টেক্সিকভাবে প্রতিটি উপাদানের মধ্যে ইন্টারলিভ করছে, তবে কখনও কখনও আপনি joinউপাদানগুলি ট্র্যাভারিংয়ের পরিবর্তে একটি নির্দিষ্ট ক্রিয়াকলাপ করতে পারেন ।

উপর /codegolf//a/127042/29325 একটি উদাহরণ থাকে:

puts \n[expr [join [split [read stdin]] +]]

এটি read stdinদেয় 23 214 52তখন বিভক্ত তালিকা দেয় {23 214 52}পরে, [join {23 214 52} +]স্ট্রিং ফিরে আসবে 23+214+52অবশেষে expr 23+214+52যোগফল কাজ করে


এই ক্ষেত্রে, আপনি বাদ দিতে পারেন split
জোহানেস কুহান

@ জোহনেসকুহান: ধন্যবাদ সম্পন্ন.
সার্জিওল

1

আপনাকে বড় কোড রয়েছে, এটা একাধিক ব্যবহারগুলির এড়াতে সম্ভব exprব্যবহার namespace pat tcl::mathopশুরুতে। এটি নিয়মিত টিসিএল ফন্টেশন হিসাবে উপসর্গ-সিনট্যাক্স অপারেশন সরবরাহ করে। উদাহরণ স্বরূপ:

namespace pat tcl::mathop
set sum [+ 1 2 3]
set prod [* {*}{1 2 3 4}]
puts $sum\ $prod

অফিসিয়াল ম্যাথপ ডক পৃষ্ঠা দেখুন


0

যখন আপনার বেশ কয়েকটি ভেরিয়েবলগুলি setপরবর্তী লাইনে রয়েছে তখন আপনি একই প্রভাবটি অর্জন করতে lassignবিভিন্ন setনির্দেশাবলীর পরিবর্তে একটি ব্যবহার করতে পারেন ।

একটি উদাহরণ হ'ল আমার নিজের উত্তর /codegolf//a/105789/29325

সিদ্ধান্ত নেওয়ার জন্য, শুধুমাত্র একটি ভেরিয়েবলের সংখ্যা ওজন করা উচিত (1 টি বর্ণের ভেরিয়েবল ধরে নেওয়া, গল্ফ করার সময় এটি প্রত্যাশিত হিসাবে):

  • <5, set গল্ফিয়ার is

  • = 5, set এবং lassignএকই বাইট গণনা উত্পন্ন

  • > 5, lassignগল্ফিয়ার হয়

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