দীর্ঘতম লাঠিটি বেছে নিন


13

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

আপনারা সবাই প্রোগ্রামার এবং ধাঁধা তৈরি করতে পছন্দ করায় আপনি কম্পিউটারের ধাঁধাতে "সবচেয়ে ছোট স্টিকটি বেছে নিন" পরিবর্তন করেছেন।

এখানে ধাঁধা নিয়ম।

  1. আপনাকে একটি 2 ডি ম্যাট্রিক্স দেওয়া হবে, যেখানে প্রতিটি কলাম একটি কাঠি উপস্থাপন করে।
  2. প্রতিটি কলামে, 1 স্টিকের একটি অংশ উপস্থাপন করে এবং 0 খালি স্থান space
  3. প্রতিটি কলামে উপর থেকে নীচে যাওয়ার সময়, শুরুতে আপনার কাজ হবে 0এবং আপনি যখনই আঘাত করবেন 1, লাঠিটি শুরু হয়ে গেছে এবং বাকি কলামটি 1কেবল পূর্ণ হবে will
  4. একটি কলাম বেছে নিতে আপনি নিজের প্রোগ্রামটি লিখতে পারেন। সেই কলামের স্টিকের আকারটি বিজয়ী / হারাতে হবে। স্টিকের আকার == এই কলামে 1 টি সংখ্যা।
  5. তবে, সেই প্রোগ্রামটিতে কেবলমাত্র লিনিয়ার সবচেয়ে খারাপ ক্ষেত্রে সময় জটিলতা থাকতে পারে।

আপনারা সবাই প্রোগ্রামার হিসাবে, আপনি অন্য কারও প্রোগ্রামের সময় জটিলতার সীমাটি শুট করছেন কিনা তা আপনি জানতে পারবেন।

আপনার কাজটি হ'ল:

  • এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা 2D ফর্ম্যাট বা স্ট্রিংগুলির অ্যারেতে ইনপুট গ্রহণ করে।
  • ইনপুটটি STDIN / প্রম্পট / কনসোল বা কোনও ফাংশন আর্গুমেন্ট থেকে নেওয়া যেতে পারে।
  • আপনি যদি এসটিডিআইএন / প্রম্পট থেকে ইনপুটটি পড়ছেন তবে আপনি ধরে নিতে পারেন ইনপুট পড়তে এবং এটিকে অ্যারে রূপান্তর করতে 0 সময় লাগে (যদিও কোডটি আপনার উত্তরটিতে থাকতে হবে)
  • এটিতে দীর্ঘতম কাঠি সহ কলামটি নির্ধারণ করুন।
  • আউটপুট ফাংশনের রিটার্ন মান বা STDOUT / কনসোল / সতর্কতা হতে পারে।
  • প্রোগ্রাম / ফাংশনে অবশ্যই লিনিয়ার সবচেয়ে খারাপ ক্ষেত্রে সময় জটিলতা থাকতে হবে, O(m+n)যেখানে mসারিগুলির nসংখ্যা এবং কলামগুলির সংখ্যা।

ইনপুট নিম্নলিখিত ফর্ম্যাটগুলির মধ্যে একটি হতে পারে:

2 ডি অ্যারে:

[ [0, 0, 0, 0],
  [1, 0, 0, 0],
  [1, 1, 0, 1],
  [1, 1, 1, 1] ]

স্ট্রিংগুলির অ্যারে:

[ "0000", "1000", "1101", "1111" ]

ইনপুটটিতে নিম্নলিখিত বৈশিষ্ট্য থাকবে:

  • অ্যারের আকার অজানা, যে কোনও আকারের একটি আয়তক্ষেত্র ধরে নিন
  • যে কোনও কলামে, উপরে নীচে আসছে, আপনি যদি 1 টি দেখেন, তবে নীচের সমস্ত কিছু এক হবে
  • খালি কলাম (অর্থাত 0-দৈর্ঘ্য) লাঠি হয় মঞ্জুরিপ্রাপ্ত।

এটি একটি কোড-গল্ফ তাই সংক্ষিপ্ততম কোড জয় !

দয়া করে আপনার কোডটি ব্যাখ্যা করুন, বা প্রত্যাশিত দুটি ইনপুট ফর্ম্যাটগুলির মধ্যে কোনটি দিয়ে অবরুদ্ধ সংস্করণটি (সময়ের জটিলতা যাচাই করতে) দিন।

আপডেটের লিনিয়ার সময় জটিলতার অর্থ এখানে ও (এন + মি) যেখানে n কলামের আকার এবং মিটি সারির আকার। (যারা অস্পষ্ট ছিল তাদের জন্য)

আপডেট 2 এই হ 'ল পারেন রৈখিক সময়ের মধ্যে সম্পন্ন করা হবে। এবং যদি আপনি উত্তর পোস্ট করে থাকেন তবে নির্দ্বিধায় লড়াইয়ের জন্য কয়েক দিন সময় করে লজিক / অ্যালগরিদম পোস্ট করতে দেরি করুন :)

আপডেট 3 আমি সময়ের জটিলতা এবং প্রোগ্রামটি যাচাই করতে কয়েক ঘন্টার মধ্যে সমস্ত উত্তর দিয়ে যাব :)


2
আমি যুক্তি দিয়ে বলছি যে এটি ও (এন + এম) এ করা যায় না, যেহেতু প্রতিটি কক্ষে গুরুত্বপূর্ণ মান (যেমন দীর্ঘতম কাঠি / কলামের প্রথম "1") ধারণ করতে পারে। সুতরাং আপনার প্রতিটি ঘরের দিকে নজর রাখা দরকার, যা ও (এন * মি) লাগে।
ফালকো

খালি কলাম থাকতে পারে?
মার্টিন এন্ডার

@ অপ্টিমাইজার: ওহ, আমি দেখতে পাচ্ছি। তুমি ঠিক বলছো. :)
ফালকো

11
এটা তোলে করতে পারবে না (ঢ + M) হে মধ্যে সম্পন্ন করা। একবার ইনপুটটি এমন ফর্ম্যাটে রূপান্তরিত হয়ে যায় যা এলোমেলো অ্যাক্সেসের অনুমতি দেয় তারপরে বাকী প্রসেসিং ও (এন + এম) হতে পারে তবে আপনার একটি প্রোগ্রাম লেখার দরকার আছে এবং সবচেয়ে খারাপ ক্ষেত্রে ইনপুটটিতে কেবলমাত্র 1সর্বশেষ সেলটি রয়েছে then এটি সম্পূর্ণ ইনপুট পড়া প্রয়োজন। এমনকি যদি কোনও ভাষার স্ট্যান্ডার্ড লাইব্রেরি স্টিডিনে এলোমেলো অ্যাক্সেস নষ্ট করে, দৃশ্যের আওতায় এটি এটি বাফার করে এবং তাই নেওয়া সময়টি ওমেগা (এন * মি) হয়।
পিটার টেলর

2
আপনি যদি লোকদের " কেবল একটি অ্যারে গ্রহণ করে এমন একটি ক্রিয়াকলাপ তৈরি করার" অনুমতি দিতে চান , তবে প্রশ্নটি বলা উচিত নয় যে তাদের অবশ্যই একটি প্রোগ্রাম লিখতে হবে। এবং যদি আপনার ও (এন ^.০) এ থাকা সমাধানগুলির প্রয়োজন হয় যেখানে এন ইনপুটটির আকার হয় তবে আপনার লিনিয়ার সময় সমাধানের জন্য জিজ্ঞাসা করা উচিত নয়। একটি লিনিয়ার সময় সমাধান সম্পূর্ণ ইনপুট পড়তে পারে।
পিটার টেলর

উত্তর:


4

গল্ফস্ক্রিপ্ট, 45 টি অক্ষর

:^,:y;0:x{^y(=x=2%y*{y(:y;x\}{x):x}if^0=,<}do

স্ট্রিংগুলির অ্যারের হিসাবে ইনপুট নেয়, দীর্ঘতম কলামের সূচক (0-ভিত্তিক) সূচক। এটি ও ( সারি + কলাম ) পুনরাবৃত্তিতে সঞ্চালিত হয় এবং প্রতিটি পুনরাবৃত্তির জন্য প্রয়োজনীয় ধ্রুবক সময় নেওয়া উচিত (কমপক্ষে ধ্রুবক-সময় গণিতকে ধরে নেওয়া)। লুপের মধ্যে সম্পন্ন কেবলমাত্র অ্যারে / স্ট্রিং অপারেশনগুলি হ'ল উপাদানগুলির অনুসন্ধান ( =) এবং স্ট্রিংয়ের দৈর্ঘ্য ( ,) নেওয়া, উভয়ই গল্ফস্ক্রিপ্টে স্থির সময় নেয়।

এটি অনলাইনে চেষ্টা করুন।

ব্যাখ্যা:

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

প্রোগ্রামের শুরুতে, আমি ইনপুট অ্যারেটি ভেরিয়েবল ^, তার দৈর্ঘ্য (অর্থাত্ সারিগুলির সংখ্যা) yএবং 0 থেকে 0 হিসাবে নির্ধারণ করি x। মান 0 স্ট্যাকের উপরও ছেড়ে যায়; নিম্নলিখিত লুপ চলাকালীন, এটি দীর্ঘতম কলামের সূচি দ্বারা প্রতিস্থাপিত হবে।

মূল লুপের মধ্যে, চতুর্থ সারির চতুর্থ অক্ষরটি ^y(=x=বের করে । এটি প্রকৃতপক্ষে অক্ষরের ASCII কোডটি দেয়, তাই শেষ বিট বাদে সমস্ত ছেড়ে দেওয়া দরকার। একটি বিশেষ কেস হিসাবে, যদি 0 এর সমান হয় (যা এখন পর্যন্ত পাওয়া সবচেয়ে দীর্ঘতম কলামটি শীর্ষ সারিতে পৌঁছায় তবে তা ঘটতে পারে), কিছুটা আপ করা আসলে ম্যাট্রিক্সের শেষ সারি (সূচি -1) থেকে আসবে তবে, নিম্নলিখিতগুলি এটি শূন্যে জোর করে, সুতরাং কার্যকরভাবে ম্যাট্রিক্সের শীর্ষে একটি ভার্চুয়াল অল-জিরো সারি তৈরি করে।xy-1^2%yy*

নীচের ifবর্ণনগুলি বিটটি শূন্য (সত্য) বা শূন্য (মিথ্যা) কিনা তা নির্ভর করে নীচে তার আগে দুটি কোড ব্লকের একটি কার্যকর করা হবে। শূন্য-না হলে, yএক দ্বারা হ্রাস করা হয় এবং বর্তমান মানটি xস্ট্যাকের দীর্ঘতম কলাম সূচকে প্রতিস্থাপিত করে (পুরানো মানটি অস্থায়ীভাবে এটির উপরে রেখে যায়)। যদি শূন্য xহয় তবে কেবল একটি দ্বারা বৃদ্ধি করা হয় (এবং সাময়িকভাবে স্তম্ভের উপরে দীর্ঘতম কলাম সূচকের উপরে থাকে)।

পরিশেষে, ^0=ম্যাট্রিক্সের প্রথম সারিটি বের করে, ,তার দৈর্ঘ্যটি ফেরত দেয় এবং <স্ট্যাকের উপর অস্থায়ীভাবে ছেড়ে দেওয়া কলাম সূচীর সাথে এটি তুলনা করে ( xএটি কেবল বৃদ্ধি পেলে সমান হবে ) যদি সূচকটি সারিটির দৈর্ঘ্যের চেয়ে কম হয় তবে লুপ পুনরাবৃত্তি করে।

পুনশ্চ. আমার পরীক্ষার ভিত্তিতে , ,<লুপের শেষে স্ট্রিং দৈর্ঘ্যের পরীক্ষাটি প্রতিস্থাপন করে একটি প্রোগ্রাম দ্বারা এই প্রোগ্রামটি ছোট করা সম্ভব হবে >যা প্রদত্ত সূচকে স্ট্রিংটি কেটে দেয় এবং শেষ অংশটি ফেরত দেয় (যা খালি হবে, এবং এইভাবে মিথ্যা, লুপের শেষে)। যাইহোক, যে মত একটি পংক্তি কাটার সময়ে প্রদর্শিত হয় GolfScript একটি ধ্রুবক সময় অপারেশন (অথবা, বরং রুবি, যা GolfScript উপরের উপর সঞ্চালিত হয়) হিসেবে বাস্তবায়িত হবে, আমি কোন সরকারী নথিপত্রে তাই বলে খুঁজে পেয়েছি। কেবল নিরাপদ থাকতে, আমি সামান্য দীর্ঘ, তবে অবশ্যই ও (1), উপরের সংস্করণটি বৈশিষ্ট্যযুক্ত করেছি।


6

রুবি, 83 75 68 66 63 বাইট

f=->m{m[b=c=i=0].map{(c=i;b-=1)while(r=m[b-2])&&r[i]>0;i+=1};c}

fইনপুট হিসাবে 2D অ্যারে ফর্ম গ্রহণ করে এমন একটি ফাংশন সংজ্ঞায়িত করে ।

আমি নীচে বামদিকে শুরু করছি, সর্বোচ্চ কাঠির দৈর্ঘ্য (প্রকৃতপক্ষে, বিয়োগ যেটি) এবং সংশ্লিষ্ট কলামের উপর নজর রাখছি। প্রতিটি কলামে, যদি এখনও 1আগের সর্বাধিক কাঠি দৈর্ঘ্যের উপরে থাকে তবে আমি লাঠিটি প্রান্তে চলে যাই এবং নতুন সর্বোচ্চ দৈর্ঘ্য এবং কলামটি মনে করি remember মানে আমি iterating করছি কলাম বরাবর একবার এবং সারি বরাবর একবার সর্বাধিক, যা অবিকল হয় (বিশেষত আমি iterating যতদূর সর্বাধিক লাঠি দৈর্ঘ্য আছি) সেই O(m+n)


@ অপ্টিমাইজারটি পোস্ট করার পরে আমি আপনার দ্বিতীয় সম্পাদনাটি দেখতে পেলাম না, যাইহোক এটি সম্পাদনার ইতিহাসে ছিল। সে কারণেই আমি এটি কেবল এমন লোকদের জন্য ছড়িয়ে দিয়েছি যারা নিজেরাই এটি নির্ধারণ করতে চায়।
মার্টিন এন্ডার

4

পাইথন 2 - 71, 69, 73, 75 81

j=i=-1
M=input()
for m in M[0]:
 j+=1
 while-i<len(M)and M[i][j]:i-=1;J=j
print J

এটি কি পাইথন 2 বা 3 এ চালানোর ইচ্ছা রয়েছে? ইনপুট কেমন লাগবে বলে মনে হচ্ছে?
12:30

1
@ ফেয়ারসাম পাইথন 2, অ্যারের অ্যারে।
জাস্টিন

@ ফেয়ারসাম: কুইঞ্চুনস ঠিক আছে। ইনপুটটি ইনটসের একটি 2D অ্যারে, যেমন আপনি প্রস্তাব করেছিলেন।
ফালকো

iএকটি লাঠি পুরো কলামটি নেয় তবে সীমা ছাড়িয়ে যাবেন না ?
xnor

1
দুঃখিত, তবে লুপের শর্তটি ভাঙ্গা jথেকে গণনা করা পরিবর্তনের মতো মনে হচ্ছে । 0i*j
xnor

2

সি, 64 বাইট

সম্পাদনা: আমি শিখেছি যে প্রশ্নটি দীর্ঘতম কলামের অবস্থান জানতে চায় এবং এর দৈর্ঘ্য নয়।

প্রথম লাইনটি গল্ফড কোড এবং বাকীটি নমুনা প্রার্থনা।

g(int m,int n,int**a,int*r){for(*r=n;n*m;a[m][n]?m--,*r=n:--n);}

/* usage:
    m = number of rows
    n = number of columns
    a = 1-based 2D array such that a[i][j] gives the value at the ith row and jth column
    r = address of return value 
    Returns (to r) the 1-indexed location of a column with the longest length, or 0 if n=0
    */

int main()
{
    int flat[4*4] = {1, 0, 0, 0,
                     1, 0, 0, 1,
                     1, 1, 0, 1,
                     1, 1, 1, 1};
    int*twoD[4] = {flat-1,flat+3,flat+7,flat+11};
    int ret;
    g(4,4,twoD-1,&ret);
    printf("%d", ret);
    return 0;
}

// old function which determines longest length (65 bytes)
f(int m,int n,int**a,int*r){for(*r=m;n*m;a[m][n]?m--:--n);*r-=m;}

চিত্তাকর্ষক! আপনি intকোনও সুযোগ দ্বারা ফাংশন স্বাক্ষরে এসটি খাঁজ করতে পারেন বা সেখানে পয়েন্টারগুলির কারণে এটি কাজ করে না?
মার্টিন এন্ডার

1
ইনপুটটিতে কেবল অ্যারে থাকা উচিত। আপনি অ্যারের আকার সম্পর্কে প্রোগ্রামটি বলতে পারবেন না।
অপ্টিমাইজার

অপেক্ষা করুন, এটি কি আসলে কাজ করে? মনে হচ্ছে এটি দীর্ঘতম কাঠির দৈর্ঘ্যটি ফিরে আসবে এবং এটির অবস্থানটি নয়: আইডিয়োন.com
মার্টিন

2
@ অপ্টিমাইজার যা সিতে মূলত অসম্ভব
মার্টিন এন্ডার

হতে পারে তবে সেটাই প্রশ্ন :)
অপ্টিমাইজার

2

সি #: 236 চার্স

int p(int[,] a){int y=0,s=0,i=0,x;for(;++y<=a.GetUpperBound(0);)for(x=i;x<=a.GetUpperBound(1);){if(a[y,x++]==0)break;s=y;i++;}return s;}

ungolfed:

int p(int[,] a)
{
    int selectedRow=0;
    int maxLength=0;
    for(var y = 0; y<=a.GetUpperBound(0); y++)
        for(var x=maxLength; x<=a.GetUpperBound(1); x++)
        {
            if(a[y,x++]==0)
                break;
            selectedRow=y;
            maxLength++;
        }
    return selectedRow;
}

2

পিএইচপি 5.4 - 108 বাইট

(আপনি যদি অন্তর্ভুক্ত করেন তবে ১১৩ <?php)

ইনপুট ফর্ম্যাট: অ্যারে JSON স্ট্রিং হিসাবে পড়া হবে।

php longest_stick.php "[[0, 0, 0, 0],[1, 0, 0, 0],[1, 1, 0, 1],[1, 1, 1, 1]]"

পঠনযোগ্যতার জন্য হোয়াইটস্পেস যুক্ত - সমস্ত নতুনলাইন এবং শীর্ষস্থানীয় স্পেসগুলি সরানো যেতে পারে।

<?php
$t=count($s=json_decode($argv[1]))-1;
foreach($s[0] as $k=>$_)
    while($s[$t][$k]) {
        $t--;
        $l = $k;
    }
echo $l?:0;

সংক্ষিপ্ত সংস্করণ:

<?php $t=count($s=json_decode($argv[1]))-1;foreach($s[0] as $k=>$_)while($s[$t][$k]){$t--;$l=$k;}echo $l?:0;

মার্টিন থেকে এখানে অ্যালগরিদম চুরির মতো, তবে প্রায়শই XD দেখা যায় না এমন ভাষাগুলি নিয়ে খুব ভাল লাগছে X


@ মার্টিনব্যাটনার আমি আপনার অ্যালগরিদমকে "চুরি" করেছি, সুতরাং এটি এখন ও (এন + এম) হওয়া উচিত। আমি মনে করি এটি সঠিক এক্সডি
নীট দ্য ডার্ক অ্যাবসোল

আপনি (-3 বাইট) $s=json_decode($argv[1]);$t=count($s)-1;দিয়ে প্রতিস্থাপন করতে পারেন $t=count($s=json_decode($argv[1]))-1;
ব্ল্যাকহোল 10'14

পছন্দ করুন ধন্যবাদ!
নীট দ্য ডার্ক আবসোল

@ ব্ল্যাকহোল আমার ধারণা এটি কার্যকারিতা ভঙ্গ করবে। শর্তটি পূরণ না হলেও এটি অ্যাসাইনমেন্টগুলি সম্পাদন করবে।
নিট দ্য ডার্ক আবসোল

@ ব্ল্যাকহোল তবুও এটি ভেঙে গেছে, আমি আশঙ্কা করছি $t--শর্তটি পূরণ হলেই এক্সডি অবশ্যই ঘটবে।
নিট দ্য ডার্ক আবসোল

2

কোবরা - 98

def f(a)
    s,x,y=0,0,a.count-1
    while y+1and x<a[0].count
        while a[y][x],y,s=y-1,x
        x+=1
    print s

2

সি ++ :: 78

অন্যান্য সি সমাধান থেকে পৃথক, এটি পুরো প্রোগ্রাম। (কোন অনুরোধের প্রয়োজন নেই, অ্যারের আকারটি ফাংশনটি বলার দরকার নেই)। দুর্ভাগ্যক্রমে এর অর্থ এটি একটি দীর্ঘ mainঅক্ষরের ফাংশন নামের পরিবর্তে ব্যবহার করা আবশ্যক, আমাকে ইনপুটটি ব্যাখ্যা করতে হবে এবং তারপরে উত্তরটি আউটপুট করতে হবে, যেখানে অন্য সমাধানটি "অন্য কোথাও" পরিচালনা করে। এছাড়াও আমার প্রথম কোড গল্ফ।
সংকলিত, এর সাথে g++ file.cpp -include iostreamচালিত ./a 000 010 110 111(উদাহরণস্বরূপ) == স্ট্রিংগুলির অ্যারে (আমি বিশ্বাস করি যে প্রশ্ন উত্সে এটি অনুমোদিত)

int c;main(int r,char**v){for(r--;r*v[r][c];v[r][c]-48?std::cout<<c,r--:++c);}

উপরের সংস্করণটি প্রতিটি পুনরাবৃত্তিতে এখনও অবধি সর্বাধিক পাওয়া আউটপুট করে। চূড়ান্ত আউটপুট অঙ্ক উত্তর। নীচে ডান পরিবর্তে নীচে বাম থেকে প্রসেসিং থেকে স্যুইচিং এবং 0সূচিকরণটি এই সমাধানটি 10 ​​(!) অক্ষর দ্বারা হ্রাস করেছে।
সি ++ ড্রপ জমা দেওয়ার পরিবর্তে আরও একটি চরিত্রের std::cout<<চেয়ে ছোট হওয়া putchar(-48)এবং এটি যথাযথভাবে আউটপুট সহ 9 টির বেশি লাঠিগুলি সমর্থন করা উচিত (যদিও এটি প্রতিটি আউটপুটকে আলাদা করতে আরও কঠিন হতে পারে)
উত্তর ক্ষেত্রটি সরানো এবং আউটপুট আউট করার সাথে সাথে আরও 6 টি অক্ষর কেটে যায়। এটি এখন কেবলমাত্র সর্বাধিক ফলাফলকে আউটপুট করে যখন এটি সরে যায় যা কমপক্ষে কিছু আউটপুট কেটে দেয়।
পুরো ফাইলটি এখন আকারে কেবলমাত্র 78 বাইট - অন্যটি যে ফাংশনটির কেবল সেই সমাধানটিতে পৌঁছেছেCজমা ব্যবহার। (ফাংশন সমর্থন করার জন্য প্রচুর অতিরিক্ত কোড সহ)।

নীচের বর্ণনাটি পুরানো:

cবৈশ্বিক তাই সূচনা হয় 0
rইনপুট সংখ্যা (সারি) +1 (প্রোগ্রামের নাম) অবৈধ (স্ট্রিমের নাম)
vসহ স্ট্রিংগুলির অ্যারেটি যেমন 0 সূচকযুক্ত, সীমা ছাড়িয়ে গেছে, তাই হ্রাস হচ্ছে। যদিও (সেটি এখন বৈধ স্ট্রিং নির্দেশ) এবং চরিত্র স্ট্রিং নাল টারমিনেটর নয় যদি চরিত্র না '0' হয় একটি সারিতে (পর্যন্ত যেতে ) এবং আউটপুট কলাম ( ) পরবর্তী কলামে অন্য চলতে চলতে ( ) সম্পন্ন v[0]
r
r!=0c'\0'

rc
c

আমি কি এই আরও গল্ফ করতে পারি?

অবহেলিত কোড (অতিরিক্ত আউটপুট সহ):

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
  int rows = argc-1;
  int cols = strlen(argv[1]);
  int ans;

  printf("rows: %d, cols: %d\n",rows, cols);

  while((rows)&&cols)
  {
    if (argv[rows][cols-1]-'0')
    {
      printf("stick @%d,%d\n",cols,rows);
      ans = cols;
      rows--;
    }
    else
    {
      printf("no stick @%d,%d\n",cols,rows);
      cols--;
    }
  }
  printf("%d",ans);
}
এটি কলামগুলির সংখ্যা এবং সারিগুলির সংখ্যা খুঁজতে আর্গাকের সংখ্যা জানতে স্ট্রিংয়ের দৈর্ঘ্য ব্যবহার করে। নীচে ডান কোণে শুরু করে, এটি এই সাধারণ নিয়মগুলি অনুসরণ করে: যদি ঘরটি একটি কাঠি হয়, তবে উপরের দিকে যান, বর্তমান কলামে উত্তর সেট করুন। যদি ঘরটি কোনও লাঠি না থাকে তবে বাম দিকে যান। ও (এন + এম): এটি কেবল উপরে এবং বাম হিসাবে সরায়, এটি কেবল সর্বোচ্চ এন + এম পড়তে পারে। এটি অ্যারের শীর্ষে বা বামে পড়ে যদি তাড়াতাড়ি প্রস্থান করে।


1

OCaml - 144 টি অক্ষর

let s a=Array.(let rec f i j m=if i=0then m else if a.(i).(j)=0then if j=length a.(i)-1then m else f i(j+1)m else f(i-1)j j in f(length a-1)0 0)

একটি int array arrayইনপুট হিসাবে নেয় এবং নীচে থেকে বাম থেকে শুরু হয়, উপরে বা ডানদিকে সরানো যদি এটি কোনও 1বা একটি দেখায় 0। কলাম গণনা শুরু হয় 0

ব্যবহার

 s [| [| 0; 0; 0; 0 |]; [| 0; 0; 1; 0|]; [| 1; 0; 1; 0 |]; [| 1; 1; 1; 0 |]; [| 1; 1; 1; 1 |] |];;
 - : int = 2

Ungolfed

let s a = Array.(
  let rec f i j m = (* m is the longest stick seen so far *)
    if i=0 then m (* A column is full: this is the longest possible stick and j=m anyway *)
    else if a.(i).(j)=0 then (* current column is shorter than a previously seen stick *)
      if j=length a.(i)-1 then m (* we have examined all columns, just return m *)
      else f i(j+1) m (* start examining next column *)
    else f (i-1) j j (* current column is longer than all the ones previously seen. Check how long the stick is *)
  in
  f (length a-1) 0 0)

0

টি-এসকিউএল - 71 64

টেবিল এটিকে ইনপুট হিসাবে নেয়

SELECT IDENTITY(INT, 1, 1) R, A INTO A
FROM (VALUES
 ('0000')
,('1000')
,('1101')
,('1111')
) AS A(A)

এবং কোয়েরিটি হ'ল

SELECT TOP(1)CHARINDEX('1',A)FROM A WHERE A LIKE'%1%' ORDER BY R

SQLFiddle

এটি টেবিল থেকে প্রথম সারিটি একটি আর দ্বারা অর্ডার করা যেখানে স্ট্রিং এ 1 রয়েছে 1

TOP(1) প্রথম সারিটিতে ফলাফল সীমাবদ্ধ করে।

CHARINDEX('1',A) স্ট্রিংয়ে প্রথম 1 এর অবস্থান বা শূন্যটি খুঁজে পাওয়া যায় না।

WHERE A LIKE'%1%' সারিগুলিতে ফিল্টার করে যেখানে A এর 1 রয়েছে

ORDER BY R টেবিলটি নীচে থেকে পড়ার বিষয়টি নিশ্চিত করে


আপনি কি কোডের মধ্যে চলছে তা ব্যাখ্যা করতে পারেন? : ডি টি-এসকিউএল নিয়ে কোনও অভিজ্ঞতা নেই
অপ্টিমাইজার

আমি দেখতে পাচ্ছি, তাই কি প্রতিটি সারিতে ফিল্টারিং কোনও O (n * m) ক্রিয়াকলাপ নয়? যেমন লিনিয়ার সময় জটিলতা না।
অপ্টিমাইজার

বলা মুশকিল। এসকিউএল ইঞ্জিন কলামের 1 এর জন্য সমস্ত সারি পরীক্ষা করবে। এটি যোগ্যতার সাথে শীর্ষ থেকে কেবল প্রথম সারিতে ফিরে আসবে। সুতরাং এই পরিস্থিতিতে এটি পুরো টেবিলটি স্ক্যান করে। কলামটি থাকা কলামের সাথে সারিগুলি ফিল্টার করে 1. সনাক্তকরণ কলামের ফলাফলগুলি সাজান এবং প্রথম ফলাফলটি প্রদান করে।
মিকিটি

এটি এর মতো দেখুন: আপনার সারিগুলি "0000", "0000", "0000", "0001" এর মতো হলে। এই ক্ষেত্রে, এটির উপস্থিতি নির্ধারণ করতে শেষ সারিতে এবং সারির শেষ অক্ষর পর্যন্ত যেতে হবে
অপ্টিমাইজার

1
হ্যাঁ, এটি তখন ও (এম * এন) হয় :)
অপ্টিমাইজার

0

ডেলফি 122 টি চর

দীর্ঘশ্বাস ফেলুন ... এটি একটি প্রচুর পরিমাণে ভাষা।

আপডেট: ফাংশনটি আমি থেকে পূর্ণসংখ্যায় ফেরতের ধরন পরিবর্তন করতে 6 টি অক্ষর যুক্ত করতে হয়েছিল। পরীক্ষা প্রোগ্রামটির "টাইপ আই = ইন্টিজার" থাকায় ফাংশনটি এখনও সংকলিত হয়েছে; প্রোগ্রামটির পূর্ববর্তী সংস্করণ থেকে বিবৃতি ছেড়ে গেছে।

function S(A:array of string):integer;var n,c:integer;begin n:=0; repeat c:=Pos('1',A[n]);inc(n) until c>0; result:=c;end;

আপনি কি অ্যারের প্রতিটি সারিতে (আপনার ক্ষেত্রে, স্ট্রিং) পোস () কল করছেন?
অপ্টিমাইজার

@ অপ্টিমাইজার হ্যাঁ, প্রোগ্রামটি '1' না পাওয়া পর্যন্ত প্রোগ্রামটি অ্যারের প্রতিটি স্ট্রিং অনুসন্ধান করে ('ইনক (এন)' ব্যবহার করে)। পাওয়া প্রথম '1' সর্বাধিক (বা সমান সর্বোচ্চ) '1' হবে, সুতরাং স্ট্রিংয়ে এর অবস্থান (স্ট্রিংগুলি ডেল্ফিতে 1-এনডেক্সযুক্ত) দীর্ঘতম কলামের অবস্থান হবে। অ্যারেটিতে '1 'না থাকলে রুটিন ব্যর্থ হয় তবে আমি বিশ্বাস করি যে এটি "ব্রেকড ইনপুট" হয়ে যাবে কারণ সেখানে কোনও "দীর্ঘতম কাঠি" খুঁজে পাওয়া যাবে না।
পেঙ্গুইনো

1
সুতরাং সবার আগে, এটি একটি বৈধ ইনপুট: "0000", "0010", "1111"দ্বিতীয়ত, আপনার উত্তর রৈখিক সময় জটিলতার প্রয়োজনীয়তা পূরণ করছে না
অপ্টিমাইজার

@ অপ্টিমাইজার হ্যাঁ, এটি বৈধ ইনপুট হবে এবং সঠিকভাবে 3 য় স্টিকটি সনাক্ত করবে। তবে আমি পোস্টটি তৈরির পরে বুঝতে পেরেছিলাম যে আমি আমার বৈধ অর্ডার এন প্রোগ্রামটিকে অ্যারে ব্যবহার করে একটি অকার্যকর অর্ডার এন ^ 2 প্রোগ্রামে স্ট্রিং ব্যবহার করে (used 160 অক্ষর থেকে হ্রাসের পিছনে) রূপান্তর করেছি।
পেঙ্গুইনো

0

স্কিম - 236 অক্ষর

ডেলফি সংস্করণটির চেয়েও দীর্ঘ ... স্কিম দিয়ে আরও দক্ষতার সাথে এটি করার একটি উপায় সম্ভবত রয়েছে। আরও খারাপ - আমি কেবল লক্ষ্য করেছি এটি অর্ডার এম * এন।

(define (s l) (cond ((eq? (cdr l) '()) (car l)) (else (map + (car l) (s (cdr l)))))) (define (u l) (define (t n p q l) (cond ((eq? l '()) p) ((< n (car l)) (t (car l) q (+ 1 q) (cdr l))) (else (t n p (+ 1 q) (cdr l))))) (t 0 0 1 (s l)))

l হল '((0 0 0 0) (1 0 0 0) (1 1 0 1) (1 1 1 1)) ফর্মের একটি তালিকা। আমি মনে করি এটি প্রকল্পের জন্য 2D অ্যারে ইনপুটটির ন্যায্য উপস্থাপনা।

(sl) সংখ্যার তালিকার তালিকার তালিকার প্রতিটি উপ-তালিকার এন-তম উপাদানগুলির সমষ্টি করে, সুতরাং (গুলি) ((0 0 0 0) (1 0 0 0) (1 1 0 1) (1 1 1 1))) ফিরে আসত (3 2 1 2)।

(উল) সংখ্যার তালিকার বৃহত্তম সহায়ক প্রবেশদ্বারের 'সূচক' প্রদান করে (সাহায্যকারী ফাংশন টি ব্যবহার করে), সুতরাং (ইউ '(3 2 1 2)) 1 (তালিকার বৃহত্তম উপাদান হিসাবে' 3) ফিরে আসবে (3 2 1 2) অবস্থান 1)।


সমস্ত সাবলিস্টের সংমিশ্রণ একটি ও (এম * এন) অপারেশন।
মার্টিন এন্ডার

0

র‌্যাকেট 70

Golfed:

(define(h m)(for/last([r m]#:final(memv 1 r))(length(takef r even?))))

ধরে নিই ইনপুট একটি দ্বি-মাত্রিক অ্যারে, যা র‌্যাকেটে তালিকার একটি তালিকা হবে:

(define m 
  '((0 0 0 0)
    (1 0 0 0)
    (1 1 0 1)
    (1 1 1 1)))

Ungolfed:

(define (h m)
  ;; step through rows, stopping at the first that contains a 1
  (for/last ([r m] #:final (memv 1 r)) 
    (length (takef r even?)))) ; pop off the leading zeroes to get the column index

দীর্ঘতম কাঠি দিয়ে কলাম সূচী ফিরে আসে।


সুতরাং মূলত আপনি প্রতিটি কলামটি দিয়ে যাচ্ছেন এবং এর সংখ্যা গণনা করছেন 1?
অপ্টিমাইজার

আমি আপনার পয়েন্ট দেখুন. অ্যালগরিদম আপডেট হয়েছে।
ম্যাথু বাটারিক

এটি এখনও ও (এম * এন) এর নিকৃষ্টতম জটিলতা রয়েছে (যে ক্ষেত্রে 1ম্যাট্রিক্সে কেবল নেই বা কেবল নীচের সারিতে নেই)।
মার্টিন এণ্ডার

0

জাভাস্ক্রিপ্ট, ES6, 76 টি অক্ষর

W=a=>(j=>{for(k=i=a.length-1;~i&~j;)a[i][j]?(k=j,i--):j--})(a[0].length-1)|k

অ্যারে ইনপুট অ্যারে নেয়।


0

জাভাস্ক্রিপ্ট ES6, 65 বাইট

উভয় ইনপুট ফর্ম্যাট নেয়

f=(a,t)=>a.reduceRight((p,c)=>t+1?t:(x=c.indexOf(1,p))+1?x:t=p,0)

ব্যাখ্যা:

নীচে থেকে উপরে পর্যন্ত আইট্রেটস। প্রতিটি মান ইনপুট উপর নির্ভর করে ব্যবহার String.prototype.indexOf()বা Array.prototype.indexOf()নির্ভর করে। পূর্ববর্তী অফসেট থেকে 1 এর সাথে প্রতিটি সারির প্রথম সূচকটি সন্ধান করে, যদি এটি কোনও না পায় তবে এটি tভেরিয়েবলটিকে শেষ অফসেটে সেট করে এবং আর indexOfকলগুলি সম্পাদন করে না ।


indexOfহয় O(log n)বা তে কাজ করে O(n), সুতরাং সামগ্রিক অ্যালগরিদম কখনই এর মধ্যে আসবে নাO(m + n)
অপ্টিমাইজার

@ অপ্টিমাইজার হ্যাঁ বুঝতে পেরেছিলেন যে এটি হ'ল ও (এম * এন) সরাসরি চিন্তা করছে না।
জর্জ রিথ

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