সিজেমে গল্ফ করার টিপস


43

সিজাম একটি গল্ফস্ক্রিপ্ট-অনুপ্রাণিত স্ট্যাক-ভিত্তিক গল্ফিং ভাষা, পিপিসিজি ব্যবহারকারী আদিতু দ্বারা নির্মিত ।

সুতরাং, অন্যান্য ভাষা-নির্দিষ্ট টিপসের প্রশ্নের শিরাতে:

সিজেমে গল্ফ করার জন্য আপনার কাছে কোন সাধারণ টিপস রয়েছে? দয়া করে উত্তর প্রতি একটি টিপ পোস্ট করুন ।


4
আরও দেখুন GolfScript মধ্যে golfing জন্য টিপস ; ভাষাগুলি যথেষ্ট পরিমাণে সমান যে অনেকগুলি কৌশল কোনওভাবেই মানিয়ে নেওয়া যায়।
ইলমারি করোনেন

2
@ ইলমারি কারোনেন এই প্রশ্নের উত্তরের পরে, আমি বলতে পারি যে তাদের মধ্যে প্রায় অর্ধেকই ভাষা সিজেমে প্রয়োগ করে, ভাষাগুলির বাক্যগত বা যৌক্তিক পার্থক্যের কারণে।
অপ্টিমাইজার

উত্তর:


23

Negativeণাত্মক সংখ্যার জন্য সঠিক মডুলো

এটি প্রায়শই বিরক্ত হয় যে মডিউলো অপারেশনের ফলাফলটি প্রথম অপারেন্ডের মতো একই চিহ্ন দেয়। যেমন পরিবর্তে -5 3%দেয় । আপনি প্রায়শই না চেয়ে বেশি প্রায়ই। নিষ্পাপ ফিক্সটি হল মডিউলো প্রয়োগ করা, একবার বিভাজক যুক্ত করা এবং আবার মডিউল প্রয়োগ করা:-21

3%3+3%

তবে এটি দীর্ঘ এবং কুরুচিপূর্ণ। পরিবর্তে, আমরা এই সত্যটি ব্যবহার করতে পারি যে অ্যারে ইনডেক্সিং সর্বদা মডুলার এবং নেতিবাচক সূচকগুলি সহ সঠিকভাবে কাজ করে । সুতরাং আমরা কেবলমাত্র বিভাজককে একটি ব্যাপ্তিতে পরিণত করি এবং এতে অ্যাক্সেস করি:

3,=

প্রয়োগ করা হয়েছে -5, এটি 1প্রত্যাশার মতো দেয় । এবং এটি বিল্ট-ইন থেকে কেবলমাত্র একটি বাইট দীর্ঘ %!

যদি মডুলাসটি 2 এর শক্তি হয় তবে আপনি বিটওয়াইস অ্যারিহমেটিক (যা এটিও অনেক দ্রুত) ব্যবহার করে অন্য একটি বাইট সংরক্ষণ করতে পারেন। তুলনা করা:

32,=
31&

65536 == 2^16চরিত্রের ধরণের মোড়কের ব্যবহার করে অন্য বাইটের বিশেষ ক্ষেত্রে সংরক্ষণ করা যায়:

ci

13

সংক্ষিপ্ত চরিত্রের ব্যাপ্তি পুশ করা

  • সমস্ত অঙ্কযুক্ত স্ট্রিং "0123456789"হিসাবে লেখা যেতে পারে

    A,s
    
  • বড় হাতের ASCII অক্ষর ( A-Z) হিসাবে ঠেলা যায়

    '[,65>
    

    যা জেড অবধি সমস্ত অক্ষরের স্ট্রিং তৈরি করে , তারপরে প্রথম 65 টি ( @ অবধি ) বাতিল করে দেয় ।

  • সমস্ত ASCII অক্ষর ( A-Za-z) হিসাবে চাপ দেওয়া যেতে পারে

    '[,65>_el+
    

    যা উপরের মত কাজ করে, তারপরে একটি অনুলিপি তৈরি করে, ছোট হাতের অক্ষরে রূপান্তর করে এবং সংযোজন করে।

    এটি করার একটি ছোট উপায় আছে!

    তারপরে প্রায়শই অবহেলিত ^অপারেটর (তালিকার জন্য প্রতিসাম্যগত পার্থক্য) তিনটি বাইট সংরক্ষণের সময় একই ব্যাপ্তি তৈরি করতে দেয়:

    '[,_el^
    

    '[,সমস্ত এএসসিআইআই অক্ষর জেড অবধি সীমাবদ্ধ _elকরে , ছোট হাতের অনুলিপি তৈরি করে এবং ^উভয় স্ট্রিংয়ের অক্ষর রাখে যা একটিতে উপস্থিত হয় তবে উভয়ই নয়।

    যেহেতু প্রথম স্ট্রিংয়ের সমস্ত অক্ষর বড় হাতের, দ্বিতীয়টিতে সমস্ত ছোট হাতের অক্ষর এবং সমস্ত অক্ষরবিহীন অক্ষর উভয় স্ট্রাইনে থাকে, ফলস্বরূপ অক্ষরের স্ট্রিংয়ের ফলাফল।

  • আরএফসি 1642 বেস 64 বর্ণমালা ( A-Za-z0-9+/) উপরের কৌশলটি ব্যবহার করে এবং অ-অক্ষর যুক্ত করে ঠেলা যায়:

    '[,_el^A,s+"+/"+
    

    এই স্ট্রিংটি পুশ করার একটি সমান সংক্ষিপ্ত উপায় সম্পূর্ণরূপে প্রতিসম পার্থক্যগুলি ব্যবহার করে:

    "+,/0:[a{A0":,:^
    

    শুরুতে আমরা স্ট্রিংটি কীভাবে খুঁজে পাব?

    সব ব্যবহৃত অক্ষর রেঞ্জ ( A-Z, a-z, 0-9, +, /) পরিসরের এর প্রতিসম পার্থক্য হচ্ছে নাল বাইট, যথা এ শুরু যেমন ধাক্কা যাবে 'A,'[,^, 'a,'{,^, '0,':,^, '+,',,^এবং '/,'0,^

    অতএব, কার্যকর :,:^করা "A[a{):+,/0"পছন্দসই অক্ষরগুলিকে ধাক্কা দেবে, তবে সঠিক ক্রমে নয়।

    আমরা সঠিক অর্ডারটি কীভাবে খুঁজে পাব? নিষ্ঠুর বাহিনী উদ্ধার! কার্যক্রম

    '[,_el^A,s+"+/"+:T;"0:A[a{+,/0"e!{:,:^T=}=
    

    স্ট্রিংয়ের সমস্ত সম্ভাব্য ক্রমগুলির উপরে পুনরাবৃত্তি করে, ফল প্রয়োগ :,:^করে কাঙ্ক্ষিত আউটপুট ( পারমালিঙ্ক ) এর সাথে তুলনা করে ।

  • ব্যবহৃত রেডিক্স-64p বর্ণমালা, যেমন, ক্রিপ্ট ( .-9A-Za-z) দ্বারা উপরের পদ্ধতিটি ব্যবহার করে উত্পন্ন করা যেতে পারে:

    ".:A[a{":,:^
    

    এটি আমার জানা সংক্ষিপ্ততম পদ্ধতি।

    যেহেতু কাঙ্ক্ষিত আউটপুট-এর সমস্ত অক্ষর ASCII ক্রমে রয়েছে, ক্রমানুসারে পুনরাবৃত্তি প্রয়োজন হয় না।

  • সমস্ত সংক্ষিপ্ত অক্ষর রেঞ্জগুলি ব্যবহার করে পছন্দসই ক্রমে চাপ দেওয়া যায় না :,:^

    উদাহরণস্বরূপ, কোনও অনুক্রমের উপর 0-9A-Za-z;-?নির্বাহ :,:^করে ব্যাপ্তিটি ধাক্কা দেওয়া যায় না "0:A[a{;@"

    তবে আমরা কোডটি ব্যবহার করে পছন্দসই স্ট্রিংয়ের একটি ঘোরানো তারতম্য খুঁজে পেতে পারি

    A,'[,_el^'@,59>]s2*:T;"0:A[a{;@"e!{:,:^T\#:I)}=Ip
    

    যা নিম্নলিখিত মুদ্রণ করবে ( permalink ):

    10
    0:@[a{A;
    

    এই যে মানে

    "0:@[a{A;":,:^Am>
    

    হিসাবে একই প্রভাব আছে

    A,'[,_el^'@,59>]s
    

    যা কেবলমাত্র একটি প্রিপেন্ডিং ছাড়াই খালি স্ট্যাকের সাথে ব্যবহার করা যেতে পারে [


11

এড়াতে {…}{…}?

ধরুন আপনার স্ট্যাকের উপর একটি পূর্ণসংখ্যা রয়েছে। যদি এটি বিজোড় হয় তবে আপনি এটিকে 3 দিয়ে গুণতে এবং 1 যুক্ত করতে চান; অন্যথায় আপনি এটি 2 দ্বারা ভাগ করতে চান।

একটি "সাধারণ" যদি / অন্য বিবৃতিটি এর মতো দেখায়:

_2%{3*)}{2/}?

তবে {}{}ইতিমধ্যে চারটি বাইট যুক্ত করার ফলে ব্লক ব্যবহার করা সাধারণত যাওয়ার উপায় নয় । ?স্ট্যাকের দুটি আইটেমের মধ্যে একটি নির্বাচন করতেও ব্যবহার করা যেতে পারে:

_2%1$3*)@2/?

এটি একটি বাইট সংক্ষিপ্ত।


Block-? একটি খালি সঙ্গে বিবৃতি সর্বদা যেতে হবে না। উদাহরণ স্বরূপ,

{}{2/}?

এর চেয়ে দুই বাইট দীর্ঘ

{2/}|

পরিবর্তে আপনি যদি

{2/}{}?

এবং আপনি যে জিনিসটি যাচাই করছেন তা হ'ল নেতিবাচক পূর্ণসংখ্যা, আপনি করতে পারেন

g)/

নতুন {}&এবং {}|সহজেই কার্যকর, তবে কখনও কখনও সমস্যাযুক্ত যদি আপনি স্ট্যাকটি বিশৃঙ্খলা করতে না পারেন।

এখনও, ক্ষেত্রে

_{…}{;}?

পরিবর্তে আপনি একটি অস্থায়ী পরিবর্তনশীল ব্যবহার করতে পারেন:

:T{T…}&

1
!)/এবং g)/উদাহরণগুলিতে সংক্ষিপ্ত।
জিমি 23013

11

বিবৃতি পরিবর্তন করুন

সিজেমের সুইচ স্টেটমেন্ট নেই। বিবৃতি যদি ঠিক একইভাবে কাজ করে তবে {{}{}?}{}?তা ইতিমধ্যে 12 বাইট দীর্ঘ ...

যদি আমরা শর্তটিকে একটি ছোট, অ-নেতিবাচক পূর্ণসংখ্যায় রূপান্তর করতে পারি তবে আমরা সমস্ত কেস স্টেটমেন্টগুলিকে একটি সীমিত স্ট্রিংয়ে রূপান্তর করতে পারি এবং সংশ্লিষ্ট ফলাফলটি মূল্যায়ন করতে পারি।

উদাহরণস্বরূপ, আমরা code0যদি স্ট্যাকের পূর্ণসংখ্যা 0 হয় , code1যদি এটি 1 হয় এবং code2যদি এটি 2 হয় তবে নির্বাহ করতে চাই , আমরা হয় ব্যবহার করতে পারি

_{({code2}{code1}?}{;code0}?

অথবা

[{code0}{code1}{code2}]=~

অথবা

"code0 code1 code2"S/=~

S/এতে স্ট্রিং বিভক্ত হয় ["code0" "code1" "code2"], =সংশ্লিষ্ট অংশটি বের ~করে এবং কোডটি মূল্যায়ন করে।

কর্মে স্যুইচ বিবৃতি দেখতে এখানে ক্লিক করুন

অবশেষে, @ জিমি 23013 এবং @ রিটোকোরাডি দ্বারা প্রস্তাবিত হিসাবে, আমরা কিছু ক্ষেত্রে স্যুইচটিকে আরও ছোট করতে পারি। বলুন code0, code1এবং code2আছে লেন্থ এল 0 , এল 1এল 2 যথাক্রমে।

যদি L 0 = L 1 ≥ L 2 হয়

"code0code1code2"L/=~

পরিবর্তে ব্যবহার করা যেতে পারে, যেখানে Lহয় এল 0 । ডিলিমিটারে বিভক্ত হওয়ার পরিবর্তে /স্ট্রিংটি এখানে সমান দৈর্ঘ্যের অংশে বিভক্ত করে।

যদি L 0 ≥ L 1 ≥ L 2 ≥ L 0 - 1 ,

"cccooodddeee012">3%~

পরিবর্তে ব্যবহার করা যেতে পারে। >স্ট্রিংয়ের শুরু থেকে 0, 1 বা 2 উপাদান সরিয়ে দেয় এবং 3%প্রতি তৃতীয় উপাদান বের করে (প্রথম দিয়ে শুরু করে)।


শেষ উদাহরণের জন্য, এর কি কোনও সুবিধা আছে "code0code1code2"5/=~? আমার কাছে আরও সোজা মনে হচ্ছে এবং এটি একই দৈর্ঘ্য।
রেটো কোরাাদি

@ রিটোকোরাডি যদি সকল স্নিপেটের দৈর্ঘ্য একই থাকে তবে কোনও লাভ নেই। বিভিন্ন দৈর্ঘ্যের জন্য, আপনার পদ্ধতিটি মডুলাস পদ্ধতির চেয়ে কম এবং দীর্ঘ উভয় হতে পারে।
ডেনিস

11

গল্ফিং সাধারণ অ্যারে এবং স্ট্রিংয়ের মানগুলি

কিছু সংক্ষিপ্ত অ্যারে বা স্ট্রিং রয়েছে যা প্রতি এবং পরে ক্রপ হয়, যেমন গ্রিডগুলি আরম্ভ করার জন্য। নির্লজ্জভাবে, এগুলির জন্য 4 বা ততোধিক বাইট লাগতে পারে, তাই অন্তর্নির্মিত মানগুলিতে অপারেশনগুলি সন্ধান করা মূল্যবান যা একই ফল দেবে। বিশেষত বেস রূপান্তর প্রায়শই দরকারী।

  • [0 1]হিসাবে লেখা যেতে পারে 2,
  • [1 0]YYb(যেমন বাইনারি 2) হিসাবে লেখা যেতে পারে ।
  • [1 1]ZYb(যেমন বাইনারি 3) হিসাবে লেখা যেতে পারে ।
  • ম্যাট্রিক্স [[0 1] [1 0]]হিসাবে লেখা যেতে পারে 2e!
  • [LL]SS/(স্পেস দ্বারা একক স্থান বিভাজন) হিসাবে লেখা যেতে পারে ।
  • "\"\""হিসাবে লেখা যেতে পারে L`
  • "{}"হিসাবে লেখা যেতে পারে {}s

পরেরটি সেই ক্ষেত্রে প্রসারিত হতে পারে যেখানে আপনি সমস্ত ব্র্যাকেট প্রকারের অন্য বাইট সংরক্ষণ করতে চান:

  • "[{<()>}]"হিসাবে লেখা যেতে পারে {<()>}a`
  • "()<>[]{}"হিসাবে লেখা যেতে পারে {<()>}a`$

বিশেষত বেস রূপান্তর কৌশলটি যে কোনও অস্পষ্ট মামলার ক্ষেত্রে মনে রাখার জন্য কার্যকর হতে পারে যা প্রতি এবং পরে পপ আপ হয়। যেমন [3 2]হবে E4b(বেস 4 14)।

এমনকি বিরল ক্ষেত্রেও আপনি ফ্যাক্টরিওশন অপারেটরটিকে mfদরকারী বলে মনে করতে পারেন। যেমন [2 7]হয় Emf

আপনি যদি অন্য কোনও উদাহরণ জুড়ে আসে তবে এই তালিকাটি বাড়িয়ে দিতে বিনা দ্বিধা বোধ করবেন।


10

স্ট্যাক সাফ করা হচ্ছে

আপনি যদি কেবল পুরো স্ট্যাকটি সাফ করতে চান, এটি একটি অ্যারেতে মুড়ে এটি পপ করুন:

];

আরও জটিল বিষয়টি হ'ল, যদি আপনি প্রচুর গণনা করেন তবে কেবল শীর্ষ স্ট্যাক উপাদান রাখতে এবং সমস্ত কিছু নীচে ফেলে দিতে চান। নিষ্পাপ দৃষ্টিভঙ্গি হ'ল উপরের উপাদানটি একটি ভেরিয়েবলের মধ্যে সঞ্চয় করা, স্ট্যাকটি সাফ করা, ভেরিয়েবলটি ধাক্কা। তবে এর চেয়ে আরও ছোট বিকল্প রয়েছে: একটি অ্যারেতে স্ট্যাকটি জড়িয়ে রাখুন এবং শেষ উপাদানটি বের করুন:

]W=

(অপ্টিমাইজারকে ধন্যবাদ, যিনি অন্য দিন এটি আমাকে দেখিয়েছিলেন))

অবশ্যই, স্ট্যাকের মধ্যে কেবল দুটি উপাদান থাকলে \;সংক্ষিপ্ত।


\;কেবলমাত্র শর্তাবলীর নীচে উপাদানটি পপ করবে। মানে ;;?
ক্যালকুলেটরলাইন

1
@ ক্যালকুলেটরফলাইন উত্তরের দ্বিতীয়ার্ধে টিওএস বাদে সব কিছু সাফ করার বিষয়ে।
মার্টিন ইন্ডার

9

e এবং দশটি শক্তি

ওহ- তেমন অনেক অন্যান্য ভাষায়, আপনি সিজোমের 1e3পরিবর্তে লিখতে পারেন 1000

এটি অ-পূর্ণসংখ্যার ঘাঁটি এবং এমনকি অ-পূর্ণসংখ্যার এক্সপোস্টগুলির জন্যও কাজ করে। উদাহরণস্বরূপ, 1.23e2পাহাড় জমে 123,0 এবং 1e.5পাহাড় জমে 3.1622776601683795 (বর্গমূল 10 )।

যা অবিলম্বে সুস্পষ্ট নয় তা 1e3হ'ল আসলে দুটি টোকেন:

  • 1পূর্ণসংখ্যা 1 স্ট্যাকের দিকে ধাক্কা দেয় ।

  • e3এটি 1000 দ্বারা গুণ করে ।

কেন এটি গুরুত্বপূর্ণ?

  • e<numeric literal>ইতিমধ্যে স্ট্যাকের এমন কিছুতে আপনি কল করতে পারেন ।

    2 3 + e3 e# Pushes 5000.
    
  • আপনি e<numeric literal>একটি অ্যারের উপরে মানচিত্র করতে পারেন ।

    5 , :e3  e# Pushes [0 1000 2000 3000 4000].
    

9

ইউক্লিডিয়ান রীতি

কোনও ভেক্টরের ইউক্লিডিয়ান আদর্শ গণনা করার সোজা উপায়, অর্থাত, এর উপাদানগুলির বর্গের যোগফলের বর্গমূল,

2f#:+mq

যাইহোক, একটি আরও ছোট উপায় আছে।

mh, অতিভুজ অপারেটর, দুই ইন্টিজার পপ একটি এবং স্ট্যাক থেকে push কর্মের sqrt (ক 2 + খ 2 )

আমাদের যদি ভেক্টর থাকে এক্স: = [x 1 … x n ], n> 1 স্ট্যাকের উপর, :mh(হাইপোথেনজ দ্বারা হ্রাস) নিম্নলিখিতটি অর্জন করবে:

  • প্রথম x 1 এবং x 2 ধাক্কা দেওয়া হয় এবং mhকার্যকর করা হয়, স্ট্যাকের উপর স্কয়ার্ট (x 1 2 + x 2 2 ) রেখে।

  • তারপরে, এক্স 3 ধাক্কা দিয়ে mhআবার কার্যকর করা হবে, স্ট্যাকের উপর
    স্কয়ার্ট (স্ক্রার্ট (x 1 2 + x 2 2 ) 2 + এক্স 3 2 ) = স্কয়ার্ট (x 1 2 + x 2 2 + x 3 2 ) রেখে।

  • এক্স এন প্রক্রিয়া করার পরে , আমরা স্কয়ার্ট (x 1 2 +… x n 2 ) , এক্স এর ইউক্যালিডিয়ান আদর্শ নিয়ে চলে এসেছি ।

যদি এন = 1 এবং এক্স 1 <0 হয় , তবে উপরের কোডটি একটি ভুল ফলাফল তৈরি করবে। :mhzনিঃশর্ত কাজ করে। (এটি নির্দেশ করার জন্য @ মার্টিনব্যাটনারকে ধন্যবাদ।)

এই উত্তরে আমি প্রথমবারের মতো এই কৌশলটি ব্যবহার করেছি ।


2
অবশ্যই, এটি আপনার প্রোগ্রামের সংখ্যা বিশ্লেষণের জন্য জড়িত রয়েছে ...
পিটার টেলর

8

N এর চেয়ে বড় সংখ্যার তালিকার সাথে বেস n থেকে রূপান্তর করুন

সিজেএম এই সূত্রটি দিয়ে একটি তালিকায় একটি সংখ্যায় রূপান্তর করে: A 0 * n l + A 1 * n l-1 + A 2 * n l-2 + A l * n 0 (nonnegative সহ n)। nবেস এবং lতালিকার দৈর্ঘ্য। এর অর্থ A আমি যে কোনও পূর্ণসংখ্যার হতে পারি, যার পরিসরের মধ্যে থাকতে হবে না [0,n)

কিছু উদাহরণ:

  • 0bশেষ আইটেমটি বের করে এবং এটি পূর্ণসংখ্যার জন্য কাস্ট করে। W=iবাইটটি পূর্ণসংখ্যা না হলে এর মতো কাজ করে এবং সংরক্ষণ করে। তবে তালিকার অন্য সমস্ত কিছুতে অবশ্যই পূর্ণসংখ্যার মধ্যে কাস্ট করতে সক্ষম হতে হবে।
  • 1bযোগফল প্রদান করে :i:+দুটি বাইটের মতো কাজ করে এবং সেগুলি পূর্ণসংখ্যা না হলে সেভ করে। এটি খালি তালিকার সাথে কাজ করেও :+না।
  • [i{_1&9 32?_@\m2/}16*;]W%:cএকটি অক্ষরকে লাইন এন্ডিং এবং ট্যাবগুলির স্ট্রিংয়ে রূপান্তর করে, যার সাহায্যে ফিরে রূপান্তর করা যায় 2bc। কোড-গল্ফ প্রোগ্রামে যদিও এনকোডিং ফাংশনটি গল্ফ করা সহজ নয়। তবে আপনার সাধারণত এটির প্রয়োজন হয় না।
  • আপনি স্ট্রিংটি ইউনিকোড অক্ষরে রূপান্তর করতে নিম্নলিখিত বিটটি ব্যবহার করতে পারেন 16 বিট নয়, যা দিয়ে ফিরে রূপান্তর করা যেতে পারে 2A#b128b:c। (ব্যাখ্যাগুলি পরে যুক্ত করা হবে Or অথবা সম্ভবত আমি পরে একটি নতুন সংস্করণ লিখব))

    128b2A#b         " Convert to base 1024. ";
    W%2/)W%\:+       " Convert to two base 1024 digit groups. ";
    [0X@
    {
      _54+
      @I+_Am>@\-
      _Am<@+ 0@-@1^
    }fI
    ]);)
    @\+[~+]2A#b_2G#<!{2A#b}*
    \W%+:c
    

আপনি যদি সর্বাধিক তাৎপর্যপূর্ণ অঙ্ক থেকে মুক্তি পাওয়ার কোনও উপায় খুঁজে পেতে পারেন তবে একই ধরণের কোনও nপূর্ণসংখ্যার মানের বিভিন্ন মানের সাথে কাজ করে whichn


8

$যদি ত্রৈমাসিক হিসাবে ব্যবহার করা হয়

আপনি যখন মেমরি ফাঁস করবেন না, অর্থাত্, পরে স্ট্যাকের মধ্যে অব্যবহৃত উপাদানগুলি রেখে যা আপনি পরে পরিষ্কার করবেন ];, অনুলিপি অপারেটর $টের্নারি অপারেটরের একটি সুবিধাজনক বিকল্প হতে পারে ?

? আপনি যদি দুটি আইটেম বেছে নিতে চাপ দেওয়ার আগে শর্তটি গণনা করতে চান তবে ভাল কাজ করে তবে প্রায়শই না করা শর্তটি আসলে এই আইটেমগুলির উপর নির্ভর করে এবং তার উপরে এটি থাকা অনেক বেশি প্রাকৃতিক ফলস্বরূপ।

আপনার যদি A B Cস্ট্যাক থাকে তবে আপনি কার্যকর করতে পারেন

!$

পরিবর্তে

\@?

অনুলিপির Bযদি Ctruthy এবং Aঅন্যথায়।

যদি Cসত্যিকারের বুলিয়ান ( 0বা 1) হয় তবে আপনি কার্যকর করতে পারেন

$

পরিবর্তে

@@?

অনুলিপির Aযদি Ctruthy এবং Bঅন্যথায়।


অনিশ্চিতিতে, এটি একটি বরং স্পষ্ট কৌশল, তবে আমি এর আগে কখনও ভাবিনি। আমি এই উত্তরে এটি প্রথমবার ব্যবহার করেছি ।
ডেনিস

7

নেস্টেড তালিকাগুলির জন্য মানচিত্র

বলুন যে আপনি ম্যাট্রিক্সের মতো নেস্টেড তালিকা পেয়েছেন:

[[0 1 2][3 4 5][6 7 8]]

অথবা স্ট্রিংগুলির একটি অ্যারে:

["foo""bar"]

এবং আপনি নেস্টেড স্তরে একটি ব্লক মানচিত্র করতে চান (অর্থাত এটি প্রতিটি সংখ্যায় বা প্রতিটি অক্ষরের জন্য এটি প্রয়োগ করুন)। নিষ্পাপ সমাধান একটি নেস্টেড %:

{{...}%}%

তবে, আপনি প্রকৃতপক্ষে অভ্যন্তরীণ ব্লকটিকে স্ট্যাকের উপরে ঠেলাতে পারেন এবং তারপরে ব্যবহার করতে পারেন f%fহ'ল "অতিরিক্ত প্যারামিটার সহ মানচিত্র", সুতরাং এটি %দ্বিতীয় পরামিতি হিসাবে ব্লকটি ব্যবহার করে বাহ্যিক তালিকায় ম্যাপ করবে :

{...}f%

দুটি বাইট সংরক্ষণ করুন।

আরেকটি ঝরঝরে কৌতুক ভালো কিছু করতে for (i=0; i<5; ++i) for (j=0; j<5; ++j) {...}হয়

5,_f{f{...}}

বাইরেরটি fপ্রথম পরিসরে ম্যাপ করবে, অতিরিক্ত প্যারামিটার হিসাবে দ্বিতীয় ব্যাপ্তি সরবরাহ করবে। তবে এখন, আপনি যদি fআবার ব্যবহার করেন তবে কেবল শীর্ষ স্ট্যাক উপাদানটি একটি অ্যারে হয়, সুতরাং আপনি এটির উপরের fব্লকটিকে মানচিত্র তৈরি করেন, অতিরিক্ত পরামিতি হিসাবে বাহ্যিক "পুনরাবৃত্তি পরিবর্তনশীল" সরবরাহ করে। এর অর্থ অভ্যন্তরীণ ব্লকটি স্ট্যাকের সাথে iএবং চলমান j

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

5,_m*{~...}%

পার্থক্যটি হ'ল এই সংস্করণটি সমস্ত জোড়ের জন্য একক অ্যারে ফলাফল দেয়, যেখানে দ্বিগুণ fফলিত একটি নেস্টেড তালিকার ফলস্বরূপ, যদি আপনি কোনও গ্রিডে ফলাফলগুলি সংরক্ষণ করতে চান তবে দরকারী হতে পারে, পুনরুক্তি ভেরিয়েবলগুলি স্থানাঙ্ক হিসাবে থাকে।

আমাকে এই কৌশলটি দেখানোর জন্য ডেনিসকে ধন্যবাদ।

0.6.4 আপডেট

fএবং :নিজেকে সহ অন্য কোনও অপারেটর গ্রহণ করে এখন ব্যাপক উন্নতি হয়েছে। এর অর্থ আপনি এখন আরও বেশি বাইট সংরক্ষণ করতে পারেন। নেস্টেড তালিকায় অপারেটরকে ম্যাপিং করা এখন আরও খাটো হয়ে গেছে:

{:x}%
{x}f%
::x

যদিও নেস্টেড তালিকায় ম্যাপিং ব্লকগুলিতে এটি সত্যই সহায়তা করে না।

কার্টেসিয়ান পণ্যগুলিতে প্রয়োগকারী ব্লক বা অপারেটরগুলির ক্ষেত্রে, ব্লকগুলির পাশাপাশি অপারেটরগুলির জন্য এটি এখন আরও সংক্ষিপ্ত হয়ে উঠেছে:

5,_f{f{...}}
5,_ff{...}

5,_f{fx}
5,_ffx

কি সুন্দর আপনি এখন এই বাসা করতে পারেন। সুতরাং আপনি কোনও তালিকার নীচে তৃতীয় স্তরে ঠিক তত সহজে অপারেটর প্রয়োগ করতে পারেন:

:::x

বা কিছু কৌশল সহ একটি ব্লক:

{...}ff%

দুর্দান্ত আপডেট। তবে এখনও নেই f~...
জিমি 23013

@ user23013 fবাইনারি অপারেটরের প্রত্যাশা করে, অবিচ্ছিন্ন ~; আপনি সম্ভবত চেয়েছিলেন :~? এছাড়াও, আমরা এই আলোচনা করতে পারেন চ্যাট
aditsu

আমি কি এই 0.6.4 আপডেট সম্পর্কে কিছু মিস করছি? আমি এখনও এই ট্রিকগুলি করতে ত্রুটি বার্তা পেয়েছি, Unhandled char after ':': :( লিঙ্ক )
রানার 1112

2
@ রানার 1112 আমার পক্ষে কাজ করে। নিশ্চিত হয়ে নিন যে আপনি সঠিকভাবে পুনরায় লোড করেছেন (অর্থাত্ ক্যাশে থেকে নয়)। আপনার ব্রাউজারের উপর নির্ভর করে Ctrl + F5 কাজ করা উচিত।
মার্টিন এন্ডার

@ মার্টিনবাটনার এটি প্রকৃতপক্ষে নির্বিকার ক্যাশে করার কারণে হয়েছিল। ধন্যবাদ।
রানার 1112

7

ASCII শিল্পের জন্য ভেক্টরাইজড অপারেটরগুলি

অনেকগুলি ASCII শিল্প চ্যালেঞ্জগুলির জন্য, পরে এগুলিকে সুপারপোজ করার জন্য দুটি আলাদা নিদর্শন তৈরি করা কার্যকর। ভেক্টরাইজড অপারেটরগুলি বিভিন্ন ধরণের সুপারপজিশনগুলি অর্জনে খুব সহায়ক হতে পারে।

অপারেটর ভেক্টরাইজেশনের একটি দরকারী সম্পত্তি হ'ল অপারেটর কেবল ছোট সংক্ষিপ্ত স্ট্রিং / অ্যারের প্রতিটি উপাদানগুলির জন্য একবারেই মৃত্যুদন্ড কার্যকর করা হয়, যখন বৃহত্তর অংশগুলির যে অংশগুলির সমষ্টি হয় না তা অপরিবর্তিত থাকে।

  • .e<

    e<স্ট্রিং, অক্ষর, অ্যারে এবং পূর্ণসংখ্যার জোড়ার জন্য সর্বনিম্ন অপারেটর কাজ করে; এটি স্ট্যাক থেকে দুটি আইটেম পপ করে এবং নীচে ই পিছনে ঠেলে দেয়।

    যেহেতু কোনও স্থানের অন্যান্য মুদ্রণযোগ্য এএসসিআইআই অক্ষরের চেয়ে কম কোড পয়েন্ট রয়েছে, তাই .e<উত্পাদিত প্যাটার্নের অংশগুলি "মুছতে" ব্যবহৃত হতে পারে:

    "\/\/\/\/\/" "    " .e<
    
    e# This pushes "    \/\/\/".
    

    পুরো উদাহরণের জন্য, আমার উত্তর হানিকম্বের কাছে দেখুন

  • .e>

    সর্বাধিক অপারেটর e>বিপরীত ফলাফল সহ সর্বনিম্ন অপারেটর হিসাবে কাজ করে।

    আবার স্থানটির কম কোড পয়েন্টের কারণে, ফাঁকা .e>জায়গাগুলিতে একটি মুদ্রণযোগ্য অক্ষরের একটি নিদর্শন সন্নিবেশ করতে ব্যবহার করা যেতে পারে:

    [[" " " " " " " "] [" " " " " " " "]][["+" "" "-" ""]["" "*" "" "/"]] ..e>
    
    e# This pushes [["+" " " "-" " "] [" " "*" " " "/"]].
    

    পুরো উদাহরণের জন্য, সাতটি স্ল্যাশ ডিসপ্লেতে আমার উত্তর দেখুন ।

  • .e&

    লজিক্যাল এন্ড অপারেটর e&এটির বাম আর্গুমেন্টটিকে পুশ করে যদি এটি মিথ্যা এবং অন্যথায় তার ডান যুক্তি।

    যদি কোনও প্যাটার্নে মিথ্যা উপাদান থাকে না তবে এটি নিঃশর্তভাবে অন্য একটির উপর একটি প্যাটার্ন চাপিয়ে দিতে ব্যবহার করা যেতে পারে:

    "################" " * * * *" .e&
    
    e# This pushes " * * * *########".
    

    একটি পূর্ণ উদাহরণ হিসাবে, আমেরিকান পতাকা মুদ্রণ আমার উত্তর দেখুন !

  • .e|

    লজিকাল ওআর অপারেটরটিকে e|বিপরীত যুক্তির আদেশ সহ উপরে হিসাবে ব্যবহার করা যেতে পারে:

    " * * * *" "################" .e|
    
    e# This pushes " * * * *########".
    

6

&কোনও আইটেম তালিকায় রয়েছে কিনা তা পরীক্ষা করতে ব্যবহার করুন

জন্য

1 [1 2 3] #W>
1 [1 2 3] #)

তুমি ব্যবহার করতে পার

1 [1 2 3] &,
1 [1 2 3] &

পরিবর্তে, যা যথাক্রমে 0/1 এবং সত্য / মিথ্যা প্রদান করে।


6

z এবং অ-আয়তক্ষেত্রাকার অ্যারে

জিপ অপারেটর zএকটি দ্বি-মাত্রিক 1 অ্যারে A এর সারি এবং কলামগুলি স্থানান্তর করে , যার উপাদানগুলিও পুনরাবৃত্ত হতে পারে।

আয়তক্ষেত্রাকার অ্যারেগুলির জন্য - অন্তর্নির্মিত zipফাংশনগুলির মতো, যেমন পাইথন (সারিগুলি একই দৈর্ঘ্যে কাটা হয়) বা রুবি (সারিগুলির সাথে সারিগুলি প্যাড করে nil) - সিজেম কেবল তাদের অ্যারেগুলির কলামগুলিকে সারিগুলিতে রূপান্তর করে, তাদের দৈর্ঘ্য এবং উপেক্ষা করে ows ফাঁক।

উদাহরণস্বরূপ, অ্যারে জিপ করা

[
  [1]
  [2 4]
  [3 5 6]
]

অ্যারে জিপ করার সমতুল্য

[
  [1 4 6]
  [2 5]
  [3]
]

বা অ্যারে

[
  [1]
  [2 4 6]
  [3 5]
]

তিনটি ক্রিয়া ধাক্কা হিসাবে

[
  [1 2 3]
  [4 5]
  [6]
]

স্ট্যাকের উপর

যদিও এর অর্থ এটি zকোনও চালান নয় (যা উপলক্ষে কার্যকর হবে), এতে কয়েকটি অ্যাপ্লিকেশন রয়েছে।

উদাহরণ স্বরূপ:

  • আমরা একটি অ্যারের কলামগুলি শীর্ষে সারিবদ্ধ করতে পারি (যেমন, প্রথম অ্যারেটিকে দ্বিতীয়টিতে পরিণত করুন) দু'বার জিপ করে:

    zz
    
  • উপরের পদ্ধতির নাবালিক পরিবর্তনগুলি একই ধরণের সমস্যার জন্য ব্যবহার করা যেতে পারে।

    উদাহরণস্বরূপ, একটি অ্যারের কলামগুলি নীচে প্রান্তিককরণ করতে (অর্থাত্ দ্বিতীয় অ্যারেটিকে প্রথমটিতে পরিণত করতে), আমরা বিপরীত সারির ক্রমের সাহায্যে দু'বার জিপ করতে পারি:

    W%zzW%
    
  • স্ট্রিংগুলির একটি অ্যারে দেওয়া, আমরা এর মতো দীর্ঘতম স্ট্রিংয়ের দৈর্ঘ্যটি গণনা করতে পারি:

    :,:e>
    

    তবে, জিপ করে এবং ফলাফলের সারিগুলির সংখ্যা গণনা করে আমরা তিনটি বাইট সংরক্ষণ করতে পারি:

    z,
    

1 যদি এর "সারিগুলির" কোনওটি পুনরাবৃত্ত না হয়, zএগুলিকে সিঙ্গলেটন হিসাবে গণ্য করে, তাই জিপিং নির্বিচারে অ্যারেগুলির জন্য কাজ করে।


1
একই জিনিসটি দেখার জন্য কেবল একটি ভিন্ন উপায়, তবে আমার পক্ষে আচরণটি আরও যুক্তিযুক্ত যদি আমি zকলামগুলিকে সারিগুলিতে রূপান্তরিত করার চিত্র দেখি , যখন খালি মানগুলি বাদ দেওয়া হয়। উদাহরণস্বরূপ, ইনপুটটির প্রথম কলামটি 1, 2, 3, দ্বিতীয় কলামটি 4, 5 (খালি অবস্থান বাদ দেওয়া হয়) এবং তৃতীয় কলামটি 6 হয় These এগুলি তখন ফলাফলের সারি।
রেটো কোরাডি

@ রিটোকোরাদি এটির বর্ণনা করার থেকে এটি আরও অনেক ভাল উপায়।
ডেনিস

6

ব্যতিক্রমসমূহ

সমস্ত ব্যতিক্রম সিজেমে মারাত্মক। যেহেতু STDERR এ আউটপুট ডিফল্টরূপে উপেক্ষা করা হয় , তাই আমরা এটি আমাদের সুবিধার জন্য ব্যবহার করতে পারি।

সিজেমের সমস্ত অপারেটর স্ট্যাক থেকে শূন্য বা আরও বেশি উপাদান পপ করে কাজ করে, কোনও কাজ সম্পাদন করে এবং স্ট্যাকের উপরে শূন্য বা আরও বেশি উপাদানগুলিকে চাপ দেয়। টাস্কটি সম্পাদন করার সময় ব্যতিক্রম ঘটে, সুতরাং এটি এখনও উপাদানগুলিকে পপ করে দেয়, কিন্তু বিনিময়ে কিছুই ঠেলা হয় না।

এখানে কয়েকটি ব্যবহারের মামলা রয়েছে:

  • একটি ছোট স্ট্যাক সাফ করা হচ্ছে

    দুটি উপাদান রয়েছে এমন স্ট্যাক সাফ করার @জন্য ব্যবহার করা যেতে পারে। @তিনটি স্ট্যাক উপাদান পপ করার চেষ্টা করে, তবে দ্বিতীয়টি পপ করার পরে ব্যর্থ হয়।

    অন্য যে কোনও অপারেটর যা তিনটি উপাদান পপ করে একই উদ্দেশ্যে কাজ করবে।

    এটি এখানে কর্মে দেখুন ।

  • স্ট্যাক থেকে দুই বা তিনটি উপাদান সরিয়ে ফেলা হচ্ছে

    যে কোনও অপারেটর যা এই নির্দিষ্ট উপাদানগুলির জন্য বাস্তবায়িত হয় না তা প্রস্থান করার ঠিক আগে স্ট্যাক থেকে দুটি বা তিনটি উপাদান পপ করতে ব্যবহার করা যেতে পারে।

    দুটি উপাদান পপ bকরতে, তাদের মধ্যে একটি চরিত্র বা তাদের কোনওটিই পূর্ণসংখ্যা না হলে কাজ করে।

    তিনটি উপাদান পপ করতে, tনীচের দিকের-দু'জনের কোনওটিই পুনরাবৃত্ত না হলে কাজ করে, নীচের দিকের সর্বাধিক পুনরাবৃত্ত শূন্য হয় বা তাদের কোনওটিই পূর্ণসংখ্যা নয়।

  • একটি লুপ থেকে প্রস্থান করা হচ্ছে

    যখন কোনও পূর্ণসংখ্যা শূন্য হয় বা স্ট্রিং খুব সংক্ষিপ্ত হয়ে যায় তখন আমাদের লুপ থেকে প্রস্থান করতে হবে। এই শর্তগুলির জন্য পরীক্ষার পরিবর্তে, যদি জড়িত ক্রিয়াকলাপগুলি শূন্যের জন্য ব্যর্থ হয়, খালি স্ট্রিং বা সিলেটলেট, আমরা কেবল প্রোগ্রামটিকে তার প্রাকৃতিক পথ অবলম্বন করতে পারি।

    পাটিগণিত জড়িত একটি উদাহরণের জন্য, এখানে দেখুন

    স্ট্রিং জড়িত উদাহরণের জন্য, এখানে দেখুন

  • শর্তসাপেক্ষ কার্যকর

    যদি উত্স কোডটি নির্দিষ্ট ধরণের ইনপুটটির জন্য কার্যকর করা না যায় তবে আমরা কখনও কখনও এমন অপারেটর ব্যবহার করতে পারি যা এই ধরণের ইনপুটটিকে ব্যর্থ করে।

    উদাহরণস্বরূপ, iএমন স্ট্রিংগুলির জন্য ব্যর্থ হবে যা কোনও পূর্ণসংখ্যার সাথে মূল্যায়ন করে না এবং ew0 বা 1 দৈর্ঘ্যের স্ট্রিংগুলিতে ব্যর্থ হবে।

    এটি এখানে কর্মে দেখুন ।


5

একটি অ্যারে থেকে সর্বাধিক / মিনিট

এখানে শুরু করার জন্য একটি!

যখন আপনাকে একটি অ্যারের থেকে সর্বাধিক বা ন্যূনতম সংখ্যাটি সন্ধান করতে হবে, তখন সবচেয়ে সহজতম এবং ক্ষুদ্রতম উপায়টি অ্যারের বাছাই করা এবং তারপরে প্রথম বা শেষ উপাদানটি বের করা।

সুতরাং অ্যারে পরিবর্তনশীল হয় A

A$W=

সর্বাধিক এবং

A$0=

সর্বনিম্ন হয়।

একই সাথে উভয় পানও সম্ভব

A$)\0=

এটি পড়ার পরে সুস্পষ্ট বলে মনে হতে পারে তবে যে কারও প্রথম প্রচেষ্টাটি ব্যবহারের দিকে যেতে e<বা e>অ্যারের মাধ্যমে পুনরাবৃত্তি করার মাধ্যমে যেতে পছন্দ করে

A{e<}*

যা 2 বাইট দীর্ঘ, এবং আপনি যদি সর্বোচ্চ এবং সর্বনিম্ন উভয়ই চান তবে আরও দীর্ঘ।


অবশ্যই, যদি আপনি অ্যারে স্ট্যাক অবশিষ্ট বাকি কিছু মনে না করেন, আপনি আসলে ব্যবহার করতে পারেন (এবং )পরিবর্তে 0=এবং W=
মার্টিন ইন্ডার

এখন আছে :e<এবং:e>
অদিতসু

@ অ্যাডিটসু যদিও তারা উপরের টিপ থেকে ছোট নয়।
অপ্টিমাইজার

5

প্রচুর সংখ্যার জন্য একটি টাইমস্ট্যাম্প ব্যবহার করুন

আপনার যদি খুব বড়, তবে স্বেচ্ছাসেবী সংখ্যার প্রয়োজন হয় তবে আপনি সাধারণত বৈজ্ঞানিক স্বরলিপি ব্যবহার করেন 9e9বা বৃহত্তর বিল্ট-ইন ভেরিয়েবলগুলির মধ্যে একটির অনুরূপ শক্তিতে উত্থাপন করেন KK#। তবে, যদি আপনি প্রকৃত সংখ্যাটি কী তা যত্নশীল করেন না এবং এটির ধারাবাহিকভাবে একই রকম হওয়া প্রয়োজন না (উদাহরণস্বরূপ এলোমেলো সংখ্যার জন্য উপরের আবদ্ধ হিসাবে), আপনি এটি ব্যবহার করে দুটি বাইটে করতে পারেন

es

পরিবর্তে. এটি মিলিসেকেন্ডগুলিতে বর্তমান টাইমস্ট্যাম্প দেয় এবং 10 12 এর ক্রম অনুসারে


3
এছাড়াও মনে রাখবেন যে আপনি যদি একটি বড় স্বেচ্ছাসেবী সংখ্যা চান এবং একটি ধনাত্মক সংখ্যা একসাথে বাতিল করতে চান তবে আপনি ব্যবহার করতে পারেন e9
jimmy23013

5

দুটি স্ট্রিং / অ্যারে সমান নয় তা পরীক্ষা করা হচ্ছে

দুটি স্ট্রিং বা অ্যারে সমান না হলে কখনও কখনও আপনি সত্যবাদী মান চান এবং যদি হয় তবে একটি মিথ্যা মান। সুস্পষ্ট সমাধান দুটি বাইট:

=!

সমতার জন্য পরীক্ষা করুন, এবং ফলাফলটি উল্টে দিন। তবে কিছু শর্তে আপনি ব্যবহার করতে পারেন

#

যখন #দুটি অ্যারে প্রয়োগ করা হয় এটি প্রথমে প্রথম অ্যানা হিসাবে দ্বিতীয় অ্যারের সন্ধান করে (এবং আপনাকে সূচনা দেয় যেখানে সাবহারি শুরু হয়)। সুতরাং যদি দুটি অ্যারে একই 0হয় তবে সাববারেটি শুরুতেই পাওয়া যাবে এবং দেবে , যা মিথ্যা। তবে যদি দ্বিতীয় অ্যারেটি পাওয়া যায় না, তবে এটি -1সত্য y

দুটি অ্যারেতে আমাদের অতিরিক্ত শর্তের প্রয়োজনের কারণ এটি হ'ল এটিরও একটি মিথ্যা মান পাওয়া যায় যদি দ্বিতীয় অ্যারেটি প্রথমটির অ-তুচ্ছ উপসর্গ হয়, যেমন:

"abc""ab"#

0স্ট্রিং একই নয় যদিও দেয় । সবচেয়ে সহজ শর্ত যা এই কেসটিকে রায় দেয় তা হ'ল যদি আপনি জানেন যে উভয় অ্যারে একই দৈর্ঘ্য হবে - সেই ক্ষেত্রে যদি একটি অপরটির উপসর্গ হয় তবে আপনি জানেন যে সেগুলি সমান। তবে নির্দিষ্ট পরিস্থিতিতে দুর্বল পরিস্থিতিগুলিও পর্যাপ্ত sufficient উদাহরণস্বরূপ, আপনি যদি জানেন যে স্ট্রিংগুলি বাছাই করা হয়েছে তবে একটি উপসর্গ সর্বদা প্রথম স্ট্রিং হবে, দ্বিতীয় নয়।


5

c এবং 16-বিট পূর্ণসংখ্যা

যথাযথ মোড়কের সাহায্যে স্বাক্ষরবিহীন 16-বিট পূর্ণসংখ্যক (বা বিয়োগ) যুক্ত করতে আপনি ব্যবহার করতে পারেন +65536%বা +2G#%

যাহোক,

+ci

অনেক খাটো। অক্ষরগুলি প্রায় 65536 এ মোড়ানো হয় , সুতরাং অক্ষর ( c) এরপরে লং ( i) এর কাছে কাস্ট করা একইরূপ প্রভাব ফেলেছে 65536%, যুক্ত হওয়া বেনিফিটের সাথে ফলাফলটি নেতিবাচক হবে না।

একই কৌশলটি 65535 টিপতে ব্যবহার করা যেতে পারে :

Wci

4

শক্তি সেট

বলুন আপনার কাছে একটি অ্যারে রয়েছে এবং আপনি সেই অ্যারের সমস্ত সম্ভাব্য সাবসেট সহ একটি অ্যারে চান। কৌশলটি হ'ল একটি খালি অ্যারে দিয়ে শুরু করা হবে এবং তারপরে প্রতিটি উপাদানের জন্য আপনার ইতিমধ্যে থাকা সাবসেটগুলি নকল করুন এবং তাদের সাথে নতুন উপাদান যুক্ত করুন (উপাদানটি যুক্ত করা হয়নি এমন পূর্ববর্তী ফলাফল রেখে )। নোট করুন যে আপনি বেস কেস দিয়ে স্ট্যাকের সূচনা করতে হবে, যেমন একটি খালি কেবল খালি অ্যারে রয়েছে: এটি দেখতে এটি দেখতে পারে:

[1 2 3 4 5]La\{1$f++}/

এটি সম্পর্কে দুর্দান্ত জিনিসটি হ'ল আপনি অবিলম্বে সাবসেটটিতে কিছু সংখ্যক চালনা চালিয়ে যেতে পারেন, সম্ভাব্যভাবে যুক্ত অক্ষরগুলি ছাড়াই। বলুন যে আপনি সমস্ত উপগ্রহের পণ্য চান want সেক্ষেত্রে বেস কেসটি হ'ল একটি অ্যারে 1এবং প্রতিটি পদক্ষেপে আপনি সম্ভাব্য পণ্যগুলির পূর্ববর্তী তালিকাটি নিয়ে যান, এটি সদৃশ করুন এবং নতুন উপাদানটির সাথে সদৃশটিতে সমস্ত কিছুকে গুণ করুন:

[1 2 3 4 5]1a\{1$f*+}/

4

তালিকার আইটেমগুলি সমস্ত একই কিনা তা পরীক্ষা করে দেখুন

আমি এটি উল্লেখযোগ্য মনে করি। ব্যবহার করুন:

)-

সমস্ত এক না হলে সত্যবাদী বা সমস্ত এক হিসাবে খালি তালিকা প্রদর্শন করে। তালিকা খালি থাকলে ত্রুটি।

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

)a-

ব্যবহার করুন !বা !!বুলিয়ান মান পেতে। যদি সরানো আইটেমটি একটি অ্যারে হতে পারে এবং সর্বাধিক দুই ধরণের বিভিন্ন আইটেম রয়েছে এবং আপনি এটি 1 না করে দেখতে চান তবে সবগুলি একই হয়, এটি সংক্ষিপ্ত:

_|,(

4

0= স্ট্রিং জন্য

অ্যারের প্রথম উপাদানটি পুনরুদ্ধার করতে আপনাকে ব্যবহার করতে হবে 0=(বা (, যদি আপনি অ্যারের বাকী অংশটি স্ট্যাকের মধ্যে রেখে কিছু মনে করেন না)।

তবে, যদি সেই অ্যারেটি একটি স্ট্রিং হয় তবে অক্ষরে কাস্টিংই যথেষ্ট।

উদাহরণ

"xyz"c e# Pushes 'x.

আমি দেখতে পাচ্ছি না কেন সিজেএম কেবল cকোনও অ্যারের প্রথম উপাদানটি বের করতে দেয় না, এটি আরও কার্যকর এবং ধারাবাহিক হবে।
ফলসকে এলোসিং করা হচ্ছে

4

একটি অ্যারে (বা স্ট্যাক) একটি ইউনিট বাম দিকে ঘোরানো

সিজোমের ঘোরানো বাম অপারেটর রয়েছে m<, যা সাধারণত আপনি বামদিকে একটি অ্যারেটি নির্বিচার সংখ্যক ইউনিট ঘোরানোর জন্য ব্যবহার করা উচিত।

ইন কিছু ক্ষেত্রে, আপনার কাছে ব্যবহার করতে পারেন (+শিফ্ট ও সংযোজন করতে:

[1 2 3]       (+ e# Pushes [2 3 1].
[[1] [2] [3]] (+ e# Pushes [[2] [3] 1].

দ্বিতীয় উদাহরণটি কার্যকর হয়নি কারণ অ্যারে প্রথম উপাদানটিও একটি পুনরাবৃত্ত, তাই +সংযোজনের পরিবর্তে সংক্ষিপ্ত।

এছাড়াও, আপনি যদি স্ট্যাকের উপর আবর্তিত অ্যারে ফেলে দিতে চান তবে আপনি :\নিঃশর্তভাবে (অদলবদল করে হ্রাস) ব্যবহার করতে পারেন :

[1 2 3]       :\ e# Pushes 2 3 1.
[[1] [2] [3]] :\ e# Pushes [2] [3] [1].

যতক্ষণ না আপনার খোলা থাকে [, ততক্ষণ এই কৌশলটি পুরো স্ট্যাকটি ঘোরানোর জন্যও ব্যবহার করা যেতে পারে, নীচের দিকে সর্বাধিক স্ট্যাক আইটেমটি শীর্ষে আনতে:

]:\

3

একটি তালিকা মুদ্রণ এবং স্ট্যাক সাফ করা

বলুন আপনার স্ট্যাকের স্ট্রিং / সংখ্যা / ইত্যাদির একটি তালিকা রয়েছে। উপরে এবং এর নীচে কিছু অন্যান্য অতিরিক্ত আইটেম। অর্থাত

123 "waste" ["a" "b" "rty" "print" "me" "please"]

এখন আপনি কেবলমাত্র সর্বশেষ তালিকা মুদ্রণ করতে আগ্রহী, তাই আপনি করেন

S*]W=

যা ফলাফল

a b rty print me please

যা আমরা স্ট্যাক ট্রিকটি ক্লিয়ারিংয়ের সাথে ব্যবহার করে কেবল ফাঁকা জায়গাগুলির সাথে তালিকাগুলি মুদ্রণ করে (যা কোনও সময়ে কোনও তালিকা মুদ্রণের কাঙ্ক্ষিত উপায় নাও হতে পারে) মুদ্রণ করার সাথে সত্যই স্মার্ট বলে মনে হচ্ছে।

এটি আরও গল্ফ করা যেতে পারে!

p];

এটা 2 বাইট খাটো !

এবং যদি আপনার তালিকার বাইরে স্ট্যাকের মধ্যে কেবল 1 টি আইটেম থাকে তবে এটি আরও খাটো!

p;

এর সৌন্দর্য pহ'ল এটি স্ট্যাক থেকে শীর্ষ সর্বাধিক আইটেমটি সরিয়ে দেয়, স্ট্রিংফাইজ করে (শেষের দিকে একটি নতুন লাইনও যুক্ত করে) এবং কোডটি সম্পূর্ণ হওয়ার অপেক্ষায় না করে তাত্ক্ষণিকভাবে STDOUT এ প্রিন্ট করে।

সুতরাং উপরের কোড আউটপুট হবে

["a" "b" "rty" "print" "me" "please"]

কোন তালিকার স্ট্যাকের সময় এটির সঠিক প্রতিনিধিত্ব!


3

কার্টেসিয়ান পণ্য বা দুটি বা আরও বেশি সেটগুলির সমস্ত সম্ভাব্য সংমিশ্রণ

সিজেমে একটি ইনবিল্ট কার্টেসিয়ান পণ্য ক্যালকুলেটর রয়েছে m*যা শীর্ষস্থানীয় দুটি অ্যারেলিস্ট / স্ট্রিং স্ট্যাকের উপরে নিয়ে যায় এবং এ থেকে সমস্ত সম্ভাব্য জোড়া তৈরি করে। উদাহরণ স্বরূপ

[1 2 3 4]"abc"m*

পাতার

[[1 'a] [1 'b] [1 'c] [2 'a] [2 'b] [2 'c] [3 'a] [3 'b] [3 'c] [4 'a] [4 'b] [4 'c]]

স্ট্যাক হিসাবে

তবে যদি আপনি 2 টিরও বেশি তালিকা / স্ট্রিং থেকে সমস্ত সম্ভাব্য সংমিশ্রণ চান। আপনি m*অনেকবার ব্যবহার করেন ? উদাহরণ স্বরূপ

[1 2 3 4][5 6]"abc"m*m*

নিম্নলিখিত স্ট্যাক উপর ছেড়ে যাবে

[[1 [5 'a]] [1 [5 'b]] [1 [5 'c]] [1 [6 'a]] [1 [6 'b]] [1 [6 'c]] [2 [5 'a]] [2 [5 'b]] [2 [5 'c]] [2 [6 'a]] [2 [6 'b]] [2 [6 'c]] [3 [5 'a]] [3 [5 'b]] [3 [5 'c]] [3 [6 'a]] [3 [6 'b]] [3 [6 'c]] [4 [5 'a]] [4 [5 'b]] [4 [5 'c]] [4 [6 'a]] [4 [6 'b]] [4 [6 'c]]]

লক্ষ্য করুন যে পণ্যগুলি এখনও জোড়া, যেখানে আইটেমগুলির মধ্যে একটি জুড়ি। এটি প্রত্যাশিত নয় এবং আমরা সমতল সমন্বয় চাই।

এটি করার একটি সহজ উপায় আছে। আপনার কার্টেসিয়ান পণ্যটির জন্য আপনি যে তালিকা চান তা কেবল অ্যারেতে আবদ্ধ করুন, জোড় করে কার্টেসিয়ান পণ্য তৈরি করুন এবং প্রতিবার এটি সমতল করুন:

[1 2 3 4][5 6]"abc"]{m*{(+}%}*

এই পাতার

[['a 5 1] ['b 5 1] ['c 5 1] ['a 6 1] ['b 6 1] ['c 6 1] ['a 5 2] ['b 5 2] ['c 5 2] ['a 6 2] ['b 6 2] ['c 6 2] ['a 5 3] ['b 5 3] ['c 5 3] ['a 6 3] ['b 6 3] ['c 6 3] ['a 5 4] ['b 5 4] ['c 5 4] ['a 6 4] ['b 6 4] ['c 6 4]]

স্ট্যাক উপর

অর্ডার বজায় রাখতে চান? , প্যাপড আইটেমটি অ্যারেতে যুক্ত করার আগে কেবল অদলবদল করুন। অর্থাত

{m*{(\+}%}*

শুধু অনুমতি চাই?

{m*{(+$}%_&}*

সংমিশ্রণে কেবল অনন্য উপাদান চান?

{m*{(+_&}%}*

এই সব ভাবেন। এখন জন্য


1
এখন আপনি যে ]:m*:e_কোনও সংখ্যক অ্যারে
সহও

3

স্ট্রিং উপর অপারেটিং

কখনও কখনও যদি আপনি একটি জটিল ডেটা কাঠামো নিয়ে কাজ করছেন তবে এতে থাকা আইটেমগুলি সহজ, স্ট্রিংগুলিতে রূপান্তর করতে সহায়তা করতে পারে।

উদাহরণস্বরূপ, যদি আপনি বিটগুলির 2 ডি অ্যারেতে প্রথম বা শেষ কয়েকটি আইটেম পেতে চান এবং ফিরে আসা প্রকারের বিষয়ে চিন্তা না করেন, বা sA<থেকে একটি বাইট সংরক্ষণ করে ।0=A<:+A<

অথবা আপনি যদি ইনপুটটিতে কিছু বিট সংশোধন করতে চান তবে স্ট্রিংটি মূল্যায়নের আগে এটি সংশোধন করতে পারেন।

অথবা যদি আপনি এই কাঠামোটি পেয়ে থাকেন এবং এটিকে একটি সাধারণ তালিকায় রূপান্তর করতে চান:

[[[[[[[[[1]2]3]4]5]6]7]8]9]

আপনি এটি অন্যান্য উপায়ে অনেকগুলি অক্ষর দিয়ে করতে পারেন:

[a{~)\}h;]W%

তবে স্ট্রিং সহ এটি আরও খাটো হতে পারে:

s:~

এটির সংক্ষিপ্ততা এমনকি একাধিক সংখ্যার সংখ্যা থাকলেও:

[`La`-~]

বা:

`']-~]

আপনার যদি এমন অনেক অ্যারে সমেত আর কোনও অ্যারের প্রয়োজন না হয়।


নেই e_এখন
aditsu

@ অ্যাডিটসু এই উত্তরটি দেখুন এবং মন্তব্য করুন । কখনও কখনও sআরও ভাল কাজ করে।
জিমি 23013

অবশ্যই, আপনি যখন সরাসরি কোনও স্ট্রিংয়ের সাথে কাজ করতে পারেন, এটি খাটো।
অদিতসু

3

এর Nপরিবর্তে ব্যবহার করা হচ্ছেLa

অনেক ক্ষেত্রে আপনাকে খালি অ্যারে সম্বলিত অ্যারেটির একমাত্র উপাদান হিসাবে কিছু সূচনা করতে হবে যা La, অযথা অযৌক্তিকভাবে 1 বাইট বেশি দীর্ঘ longer

অনেক ক্ষেত্রে আপনার মুদ্রণের আগে প্রতিটি উপাদানগুলির পরে একটি নতুন লাইনও যুক্ত করা দরকার যা এটির মতো Noবা হবে N*

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

Sআপনার ফাঁকা জায়গাগুলির সাথে আউটপুট আলাদা করার প্রয়োজন হলে মাঝে মাঝে কাজ করে।

বিরল ক্ষেত্রে প্রাথমিক উপাদানটির একটি স্ট্রিং হতে হয়। তবে আপনি এখনও এটি ব্যবহার করতে পারেন Naযা পরবর্তীতে নতুন লাইন সংযোজন করার চেয়ে কম হতে পারে be


2

এক বা একাধিক ঘটনায় বিভক্ত

বলুন আপনার কাছে একটি স্ট্রিং রয়েছে "abbcdbbfghbdbb"এবং আপনি এটি বিভক্ত করতে চানb

"abbcdbbfghbdbb"'b/

এটি স্ট্যাকের উপর ছেড়ে যায়:

["a" "" "cd" "" "fgh" "d" "" ""]

খালি স্ট্রিং লক্ষ্য করুন? দু'জন bএকসাথে ছিলেন এবং তাদের মধ্যে কিছুই ছিল না বলে সেগুলি সেখানে রয়েছে। সময়ে, আপনি এড়াতে চান। আপনি এই দ্বারা এটি করতে পারেন

"abbcdbbfghbdbb"'b/La-

বা খালি স্ট্রিং আউট ফিল্টারিং

"abbcdbbfghbdbb"'b/{},

তবে এটি 3 অতিরিক্ত বাইট।

এই নির্দিষ্ট ব্যবহারের ক্ষেত্রে একটু কম পরিচিত অপারেটরটি %। মোড এবং মানচিত্র করা এবং সংখ্যার ( "abcd"2%= "ac") ভিত্তিতে বিভাজক করা ছাড়াও %স্ট্রিং / অ্যারেতে বিভক্ত হতে পারে। উপরের ব্যবহারের ক্ষেত্রে:

"abbcdbbfghbdbb"'b%

প্রস্থান করবে

["a" "cd" "fgh" "d"]

স্ট্যাক উপর

আজ আমার উত্তরগুলির মধ্যে একটিতে এটি নির্দেশ করার জন্য @ ব্যবহারকারী ২৩০১৩ এর জন্য ধন্যবাদ।


আমি মনে করি এটির নামকরণ করা উচিত "এছাড়াও শিখুন গল্ফস্ক্রিপ্ট", যা ডকুমেন্টেশনে আরও ভাল উদাহরণ রয়েছে।
jimmy23013

@ ইউজার ২৩০১৩ তবে আমরা কখনই নিশ্চিত নই যে সমস্ত জিএস-এর মতো কী এবং কী নয়।
অপ্টিমাইজার 9

2

ইনফিক্স ফোরচ হিসাবে ভাঁজ / হ্রাস ব্যবহার করুন

আমাদের এবং এবং ( সংঘবদ্ধ বা বাইনারি কিনা তার উপর নির্ভর করে ) :xএকটি শর্টহ্যান্ড হিসাবে রয়েছে । দুর্ভাগ্যক্রমে, সংক্ষিপ্ত করার জন্য কোনও সমতুল্য ইনফিক্স অপারেটর নেই । যাইহোক, খুব প্রায়ই যখন আমরা কি , আসলে একটি বাইনারি অপারেটর যা বারবার স্ট্যাক আইটেমটি মিথ্যা নীচে পরিবর্তন হয়। যদি তা হয়, এবং বলে আইটেমটি অ্যারে না হয় তবে আমরা ভাঁজ / ভাঁজকে হ্রাস করে বাইট সংরক্ষণ করতে পারি:{x}%{x}*x{x}/{x}/x

5 [1 2 3 4]{-}/  e# Gives -5
5 [1 2 3 4]+:-

এটি কাজ করে কারণ ভাঁজ সর্বদা প্রথম উপাদানটিকে অচ্ছুত করে। দুর্ভাগ্যক্রমে, এটি কোনও বাইট সংরক্ষণ করে না, যখন পরিবর্তিত উপাদানটি একটি অ্যারে হয়, কারণ এটি যুক্ত করলে এটি মোড়ানো হবে। যাইহোক, কখনও কখনও আপনি যথেষ্ট ভাগ্যবান যে আপনার অ্যারেতে ইতিমধ্যে সামনের {}/অংশটি রয়েছে reduce


2

মুদ্রণ এবং মুদ্রণ

CJam হয়েছে printঅপারেটর: o। এটি কাজ করে তবে সমস্ত কোড কার্যকর হয়ে যাওয়ার সাথে সাথে স্ট্যাক মুদ্রণ করা হয়। আপনি প্রোগ্রামের শেষে স্ট্যাকটি সাফ করলে আপনি এটি বন্ধ করতে পারেন। কেবল এটিকে শেষে দিন:

];

Println আপনি ব্যবহার করতে পারেন করার oNoবা p(যেমন কাজ `oNo)


3
তার মাঝে একটি বড় পার্থক্য oএবং ppআইটেমটি মুদ্রণ করতে হবে না এমন একটি স্ট্রিং উপস্থাপনায় রূপান্তর করে শুরু হয়। pকার্যকর করার সমতুল্য ​`oNo
ডেনিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.