মেঘলা কেমন?


22

চ্যালেঞ্জ

আকাশের একটি চিত্র দেওয়া, আপনাকে অবশ্যই মেঘের কভারটি Oktas এ আউটপুট করতে হবে। সরবরাহিত চিত্রটি একটি চিত্র ফাইল হবে (ধরণটি আপনার উপর নির্ভর করে) এবং আউটপুটটি STDOUT এ হওয়া উচিত।

Oktas

আবহাওয়াবিদ্যায়, একটি ওপটা হ'ল পরিমাপের একক যা কোনও আবহাওয়ার স্টেশন যেমন কোনও নির্দিষ্ট স্থানে মেঘের কভারের পরিমাণ বর্ণনা করতে ব্যবহৃত হয়। আকাশের পরিস্থিতি অনুমান করা হয় আকাশের কত অষ্টম মেঘে আচ্ছাদিত, 0 টি ওটা (সম্পূর্ণ পরিষ্কার আকাশ) থেকে 8 টি ওক্টাস (সম্পূর্ণভাবে মেঘাচ্ছন্ন) পর্যন্ত)

আকাশ সর্বদা মধ্যাহ্নের চিত্র হতে পারে (সুতরাং, নীল আকাশ, লাল / রাতের আকাশ নয়)।

মেঘের রঙ সর্বদা এমন রঙ হবে যা নিম্নলিখিত প্যাটার্নটি অনুসরণ করে:

#ABCDEF

কোথায় AB >= C0, CD >= C0এবং EF >= C0

বা, আরজিবিতে:

(A, B, C)

কোথায় A >= 192, B >= 192এবং C >= 192

এখানে ওক্টাসের সাথে সম্পর্কিত শতাংশের কভারেজ রয়েছে:

0%    - 0 oktas
12.5% - 1 okta
25%   - 2 oktas
37.5% - 3 oktas
50%   - 4 oktas
62.5% - 5 oktas
75%   - 6 oktas
87.5% - 7 oktas
100%  - 8 oktas

শতাংশগুলি মেঘ যা চিত্রের শতাংশ।

যদি আপনি আপনার চিত্রের শতাংশের মেঘটি 12.5 এর একাধিক না হন তবে আপনার নিকটতম দিকে গোল হওয়া উচিত।

আউটপুট

আউটপুটটি কেবল ওকেটা নম্বর হওয়া উচিত (আপনাকে ইউনিট বলতে হবে না)।

উদাহরণ

1 ওক্টা (18.030743615677714% মেঘ)

0 টি ওটা (0.0% মেঘ)

3 টি ওটা (42.66319444444445% মেঘ)

1 ওক্টা (12.000401814778645% মেঘ)

পাইথন কোড সংখ্যা গণনা করতে ব্যবহৃত হয়

জয়লাভ

বাইটস মধ্যে সংক্ষিপ্ত কোড।


শেষ এক 3 টি Oktas না?
TheLethalCoder

@ দ্য লেথলকোডার উফস, সম্পাদিত
বিটা

একটি চিত্রের মাত্রা সর্বাধিক?
শেগি

2
আমি একটি চতুর্থ পরীক্ষার কেস যুক্ত করেছি যার জন্য 12.5 অবধি গোল করা দরকার, যেহেতু পূর্ণসংখ্যার মেঝে ব্যবহার করে উত্তরগুলি প্রথম 3 টি পরীক্ষার ক্ষেত্রে কেটে যায়।
জাস্টিন মেরিনার

1
যেসব ভাষাতে সি ++ এর মতো চিত্র প্রক্রিয়াকরণ ক্ষমতা নেই, সেগুলি সম্পর্কে কি লাইব্রেরিটি ব্যবহার করা ঠিক আছে? যদি তাই হয়, বাইট গণনাটির জন্য, এটি কেবল লিখিত কোড বা প্রোগ্রামটি চালানোর জন্য প্রয়োজনীয় ডিএলএল ফাইলের আকারের গণনা করা উচিত?
হাটসুপয়েন্টারকুন

উত্তর:


10

পাইথন 2 , 114 110 98 বাইট

-4 বাইট থেলথেলকোডারকে -12 বাইট ধন্যবাদ রউডকে
ধন্যবাদ জানায়

import PIL.Image as P
i=P.open(input()).getdata()
print round(8.*sum(min(x)>191for x in i)/len(i))

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


191পরিবর্তে ব্যবহার করবেন ?
TheLethalCoder

2
আমি পরামর্শ দিতে যাচ্ছিলাম x&y&z&192>191, তবে আপডেট হওয়া সংস্করণটি ঠিক তত ছোট।
আর্নল্ড

2
আপনি সম্ভাব্য প্রতিস্থাপন করতে পারে import PIL.Image as Pসঙ্গে from PIL.Image import*এবং 1 বাইট সংরক্ষণ যখন পরিবর্তন i=P.openকরার জন্য i=open? আমি জানি না যে এটি সমস্যার কারণ হতে পারে কারণ ওপেন ইতিমধ্যে একটি সংজ্ঞায়িত ফাংশন, তবে আমি পরীক্ষা করতে পারছি না কারণ মডিউলটি ইনস্টল করার ক্ষমতা আমার নেই I
আর্নল্ড পামার

1
হ্যাঁ, এটি কাজ করে বলে মনে হচ্ছে। 1 বাইট সংরক্ষণ করে।
আরফি

2
@ রড আপনার কোডটি সমস্ত প্ল্যাটফর্মে চলতে হবে না - ভাষা দোভাষী দ্বারা সংজ্ঞায়িত করা হয়েছে। যদি এটি আপনার পক্ষে চলে তবে এটি বৈধ valid
টিম

10

এমএটিএল , 18 17 বাইট

Yi191>3&A1eYm8*Yo

উদাহরণ প্রদত্ত চারটি চিত্রের সাথে চলছে (পূর্বরূপ মানের সম্পর্কে দুঃখিত; সম্পূর্ণ রেজোলিউশনের জন্য ক্লিক করুন):

এখানে চিত্র বর্ণনা লিখুন

বা গোল না করে ফলাফল দেখতে শেষ চারটি অক্ষর মুছে ফেলুন:

এখানে চিত্র বর্ণনা লিখুন

ব্যাখ্যা

Yi     % Implicitly input filename or URL. Read image. Gives an M×N×3 array
191>   % Does each entry exceed 191?
3&A    % True for 3rd-dim "lines" that only contain true. Gives an M×N matrix
1e     % Linearize (flatten) into a 1×L row vector, with L = M*N
Ym     % Mean of vector
8*     % Multiply by 8
Yo     % Round. Implicitly display

আমি ভাবছি কি esolangs ব্যবহার করা যেতে পারে
Евгений Новиков

6

জাভা (ওপেনজেডিকে 8) , 204 বাইট

i->{int x=0,y=0,t=0,w=i.getWidth(),h=i.getHeight();for(;x<w;)for(y=0;y<h;){java.awt.Color c=new java.awt.Color(i.getRGB(x++,y++));if(c.getRed()>191&&c.getBlue()>191&&c.getGreen()>191)t++;}return 8*t/w/h;}

এটি অনলাইন চেষ্টা করুন! আমি সর্বদা ভুলে যাই যে টিআইও STDERR কে ডিবাগ ট্যাবে আউটপুট দেয় .. সম্ভবত এটি কোনও ত্রুটির ক্ষেত্রে লালটিকে হাইলাইট করতে পছন্দ করতে পারে?


কয়েকটি জিনিস: আপনার কোডটি বর্তমানে অসীম লুপে চলে, কারণ আপনি কখনই বৃদ্ধি করেন না xবা করেন না y। আপনি y=0দু'বার নিয়োগ করেছেন, যাতে আপনি প্রথম নিয়োগটি সরাতে পারেন। শ্রেণিটি Colorহয় হয় পুরোপুরি যোগ্যতাসম্পন্ন ( java.awt.Color) বা আপনাকে অবশ্যই আপনার বাইট গণনায় আমদানিটি অন্তর্ভুক্ত করতে হবে। এবং আপনার কোড 4 র্থ পরীক্ষার ক্ষেত্রে ব্যর্থ হয়েছে (1 এর পরিবর্তে 0 প্রদান করে)।
জাস্টিন মেরিনার

আমি জানি এটা অনেক দিন হয়ে গেছে, কিন্তু আপনি গলফ জন্য-লুপ ভেতরের এর বন্ধনী সরিয়ে দেওয়া, আর পরিবর্তন করে 6 বাইট করতে পারেন &&করতে &এবং ,y=0করতে ,y: অনলাইনে চেষ্টা করুন।
কেভিন ক্রুইজসেন

6

সি #, 150 146 বাইট

b=>{int t=0,c=0,w=0,h;for(;w<b.Width;++w)for(h=0;h<b.Height;++t){var p=b.GetPixel(w,h++);if(p.R>191&p.G>191&p.B>191)c++;}return(int)(c/(t+0d)*8);}

@ ইয়ান এইচ.কে 4 টি বাইট সংরক্ষণ করা হয়েছে

সম্পূর্ণ / ফর্ম্যাট সংস্করণ:

using System.Drawing;

namespace System
{
    class P
    {
        static void Main()
        {
            Func<Bitmap, int> f = b =>
            {
                int t = 0, c = 0, w = 0, h;
                for (; w < b.Width; ++w)
                    for (h = 0; h < b.Height; ++t)
                    {
                        var p = b.GetPixel(w, h++);

                        if (p.R > 191 & p.G > 191 & p.B > 191)
                            c++;
                    }

                return (int)(c / (t + 0d) * 8);
            };

            string[] testCases =
            {
                @"Appearance_of_sky_for_weather_forecast,_Dhaka,_Bangladesh.JPG",
                @"spanish-sky.jpeg",
                @"why-is-sky-blue-1.jpg",
            };

            foreach (string testCase in testCases)
            {
                using (Bitmap bitmap = new Bitmap(testCase))
                {
                    Console.WriteLine(f(bitmap));
                }
            }

            Console.ReadLine();
        }
    }
}

for(h=0 h<b.Height;++t)আমি মনে করি আপনি সেখানে একটি আধা-কোলন মিস করেছেন
ক্রিটিক্সী লিথোস

2
আপনি প্রতিস্থাপন করতে পারেন /0.125সঙ্গে *8কয়েক বাইট সংরক্ষণ করতে শেষে।
ইয়ান এইচ।

@ ক্যোসাকাক আমি স্থানের পরিবর্তে আধা কোলনটি মুছে ফেলতাম! এখনই স্থির ..
TheLethalCoder

3

সি #, 313 বাইট

namespace System.Drawing.Imaging{b=>{unsafe{int t=0,c=0,y=0,x,w=b.Width,h=b.Height;var d=b.LockBits(new Rectangle(0,0,w,h),(ImageLockMode)1,(PixelFormat)137224);for(;y<h;++y){var r=(byte*)d.Scan0+y*d.Stride;for(x=0;x<w*3;++t)if(r[x++]>191&r[x++]>191&r[x++]>191)c++;}b.UnlockBits(d);return(int)(c/(t+0d)/0.125);}}}

একথাও ঠিক যে আমার অন্যান্য জবাব চেয়ে দীর্ঘতর কিন্তু এই একটি ব্যবহার LockBitsএবং unsafeসরাসরি মেমরি চিত্রটি অ্যাক্সেস কোড; যেমন এটি অবিশ্বাস্যভাবে দ্রুত। আমি সম্ভবত কলটি সরাতে পারলাম UnlockBitsতবে এটির সাথে এটি আরও সঠিক।

সম্পূর্ণ / ফর্ম্যাট সংস্করণ:

namespace System.Drawing.Imaging
{
    class P
    {
        static void Main()
        {
            Func<Bitmap, int> f = b =>
            {
                unsafe
                {
                    int t = 0, c = 0, y = 0, x, w = b.Width, h = b.Height;

                    var d = b.LockBits(new Rectangle(0, 0, w, h), (ImageLockMode)1, (PixelFormat)137224);
                    for (; y < h; ++y)
                    {
                        var r = (byte*)d.Scan0 + y * d.Stride;

                        for (x = 0; x < w * 3; ++t)
                            if (r[x++] > 191 & r[x++] > 191 & r[x++] > 191)
                                c++;
                    }
                    b.UnlockBits(d);

                    return (int)(c / (t + 0d) / 0.125);
                }
            };

            string[] testCases =
            {
                @"Appearance_of_sky_for_weather_forecast,_Dhaka,_Bangladesh.JPG",
                @"spanish-sky.jpeg",
                @"why-is-sky-blue-1.jpg",
            };

            foreach (string testCase in testCases)
            {
                using (Bitmap bitmap = new Bitmap(testCase))
                {
                    Console.WriteLine(f(bitmap));
                }
            }

            Console.ReadLine();
        }
    }
}

3

পাওয়ারশেল , 200 বাইট

$a=New-Object System.Drawing.Bitmap $args[0]
0..($a.Height-1)|%{$h=$_;0..($a.Width-1)|%{$i+=(("$($a.GetPixel($_,$h)|select R,G,B)"|iex)['R','G','B']-ge192).count-eq3}}
[int]($i/($a.Height*$a.Width)*8)

$args[0]সম্পূর্ণ চিত্র ফাইল-পাথ হিসাবে ইনপুট পান, একটি New Bitmapবস্তুকে এর মধ্যে তৈরি করে $a। এটি কেবল অভ্যন্তরীণ বস্তুর নাম; এটি জেপিজি, পিএনজি, ইত্যাদি সমর্থন করে

আমরা তারপরে .heightএবং তারপরে .widthচিত্রটির ডাবল লুপ করি এবং প্রতিটিটিকে স্পর্শ করি pixel। আমরা বৈঠাচালনা আউট R,G,Bমূল্যবোধ ও তারপর ঐ যে হয় নির্বাচন -greaterthanor eকরার গণদেবতা 192এবং নিশ্চিত করুন যে countহয় 3(অর্থাত, তাদের সব সাদা পর হয়)। সেই বুলিয়ান ফলাফলটি আমাদের সংযোজকের সাথে যুক্ত করা হয়েছে $i

তারপরে আমরা শতাংশ পেতে ভাগ করে 8নিই, ওক্টাসের সংখ্যা পেতে এটি দিয়ে গুণ করব এবং তারপরে [int]কেবল একটি সংখ্যার আউটপুট পেতে পারি। (দ্রষ্টব্য যে এটি ব্যাঙ্কারের রাউন্ডিং সম্পাদন করে - যদি এটি অনুমোদিত না হয় তবে রাউন্ডিং পদ্ধতিটি পরিবর্তন করতে আরও বেশ কয়েকটি বাইট হবে be)


2

ডিসি, 74 বাইট

???*sa?[1+]ss[r1+r]st[?191<s]su0ddsd[0luxluxlux3=t1+dla>r]dsrxr8*la2/+la/p

ইনপুটটিকে একটি P3 পিপিএম ফাইল হিসাবে নেওয়া হয়, সমস্ত সাদা স্থান নতুন লাইন হিসাবে। আউটপুট STDOUT এ চলেছে।

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


2

জাভাস্ক্রিপ্ট, 83 77 বাইট

ETH প্রোডাকশন দ্বারা -6 বাইট

f=i=>(z=a=b=0,i.map(e=>{z=e<192||z;(++b%4)||((z||(a+=64))&&(z=0))}),a/b+1>>1)

ইনপুট

ছবি # 1

ছবি # 2

ছবি # 3

ছবি # 4

ডেমো


1
খুব সুন্দর সমাধান। ES6 তীর ফাংশন সহ একটি সহজ কৌশল হ'ল a=>(b,c,d)করণীয় a=>{b;c;return d}বা এর পরিবর্তে কমা ( ) দ্বারা পৃথক করে সমস্ত প্রথম বন্ধনীতে আবৃত করা a=>eval("b;c;d")। যদি আপনার কোনও ধরণের লুপ না থাকে তবে এটি কাজ করে, সেক্ষেত্রে আপনি সম্ভবত evalপদ্ধতিটি ব্যবহার করে সেরা হয়ে উঠবেন।
ETH প্রোডাকশনগুলি

2

সি (পসিক্স), 103 বাইট

স্টিডিনে বিএমপি ফাইল হিসাবে ইনপুট গ্রহণ করে।

b,c,i,m=0xc0c0c0;main(){lseek(0,54,0);for(;read(0,&b,3);c+=(b&m)==m,i++);printf("%d",(i+16*c)/(2*i));}

2

x86 মেশিন কোড, 34 বাইট

51
31 D2
AD
F7 D0
25 C0 C0 C0 00
75 01
42
E2 F3
C1 E2 03
DB 04 24
52
DB 04 24
DE F1
DB 1C 24
58
5A
C3

কোডের এই বাইটগুলি একটি ফাংশন সংজ্ঞায়িত করে যা একটি বিটম্যাপ ইনপুট নেয় এবং তার ওকেটাসকে নির্দেশ করে একটি পূর্ণসংখ্যার মান প্রদান করে। যেমনটি সি , অ্যারেগুলি (বিটম্যাপের মতো) প্রথম উপাদানটির আকার এবং আকার / দৈর্ঘ্যের হিসাবে উপস্থাপিত হয়। সুতরাং, এই ফাংশনটি দুটি পরামিতি নেয়: বিটম্যাপে মোট পিক্সেল (সারি × কলাম) এবং বিটম্যাপে নিজেই একটি পয়েন্টার।

এই কোডটি একটি কাস্টম নিবন্ধভিত্তিক কলিং কনভেনশন ব্যবহার করে, যেখানে বিটম্যাপ পয়েন্টারটি ESIরেজিস্টারে পাস করা হয় এবং বিটম্যাপ আকারটি পাস করা হয়ECX রেজিস্টারে । ফলাফল (Oktas), যথারীতি, ফিরে আসে EAX

ইতিমধ্যে উপরে বর্ণিত হিসাবে, ইনপুটটি বিটম্যাপ হিসাবে নেওয়া হয়। বিশেষত, 32-বিপিপি ফর্ম্যাটটি সামান্য-এন্ডিয়ান ফর্ম্যাটে ব্যবহৃত হয় তবে আলফা চ্যানেল (সর্বোচ্চ অর্ডার বাইট) উপেক্ষা করা হয়। এটি অনেকগুলি জিনিসকে সহজতর করে, আমাদের কেবল প্রতিটি পিক্সেলের মাধ্যমে পুনরাবৃত্তি করতে এবং এর 32-বিট আরজিবি রঙের মানটি পরীক্ষা করতে দেয়। একটি চতুর অপ্টিমাইজেশন এখানেও ব্যবহৃত হয়। প্রতিটি রঙের উপাদান বিচ্ছিন্ন করে>> = 192 হয় কিনা তা যাচাই করার পরিবর্তে আমরা কেবল 0xC0C0C0 দ্বারা পুরো 32-বিট মানটি মাস্ক করে ফলাফলটি> = 0xC0C0C0 হয় কিনা তা পরীক্ষা করি। এটি সমস্ত "ক্লাউড" রঙের জন্য সত্য এবং সমস্ত "আকাশ" (নন-ক্লাউড) রঙের ক্ষেত্রে মূল্যায়ন করবে। ভাল, আমি ভেবেছিলাম চালাক! :-) এটি অবশ্যই বিপুল সংখ্যক বাইট সংরক্ষণ করে।

অতএব, এই কোডটি পরীক্ষা করার জন্য, আপনাকে ইনপুট চিত্রগুলি 32-বিপিপি বিটম্যাপে রূপান্তর করতে হবে। আপনি এটির জন্য উইন্ডোজ পেইন্ট ব্যবহার করতে পারবেন না, কারণ এটি প্রতি পিক্সেল সর্বোচ্চ 24 বিট সমর্থন করে। যাইহোক, এমন অনেকগুলি সফ্টওয়্যার সমাধান রয়েছে যা এটি করতে পারে যেমন অ্যাডোব ফটোশপ। আমি ব্যবহার করতাম এই নিখরচায় সরঞ্জামটি , যা একটি পিএনজিকে উইন্ডোজে একটি 32-বিপিপি বিএমপিতে রূপান্তর করে, এর অর্থ আপনার কেবল জেপিইজি থেকে পিএনজি রূপান্তর করতে হবে (যা পেইন্ট করতে পারে)।

অন্যান্য অনুমান যে আমি পোস্ট করি তা বিশিষ্ট যুক্তিসঙ্গত:

  • বিটম্যাপটি 0 (এর চেয়ে বড় আকারের) বলে ধরে নেওয়া হচ্ছে অর্থাত্) এটি কমপক্ষে একটি পিক্সেল ধারণ করে) বলে মনে করা হয়। এটি যুক্তিসঙ্গত কারণ কারণ যখন তাদের আকাশ শূন্য হয় তখন আমাদের আবহাওয়াবিদ্যার চেয়ে বড় সমস্যা হয়।
  • দিকের পতাকাটি ( DF) পরিষ্কার বলে ধরে নেওয়া হয়েছে যাতে আমরা ব্যবহার করে বিটম্যাপের মাধ্যমে সঠিকভাবে পুনরাবৃত্তি করবLODSD নির্দেশটি । এটি বেশিরভাগ x86 কলিং কনভেনশনের দ্বারা করা একই ধারণা, তাই এটিকে ন্যায্য বলে মনে হচ্ছে। আপনি যদি এটি পছন্দ না করেন তবে একটি হিসাবে গণিতে 1 বাইট যুক্ত করুনCLD নির্দেশের ।
  • X87 এফপিইউর জন্য রাউন্ডিং মোডটি রাউন্ড-টু-নিকটতম-এমনকি-তে সেট করা হবে বলে ধারণা করা হচ্ছে। এটি নিশ্চিত করে যে পরীক্ষার কেস # 4 দ্বারা যাচাই করা আমরা ভাসমান-পয়েন্ট থেকে অস্থায়ী থেকে চূড়ান্ত পূর্ণসংখ্যার ফলাফলে রূপান্তর করি যখন আমরা সঠিক আচরণটি পাই। এই অনুমানটি যুক্তিসঙ্গত কারণ এটি এফপিইউর জন্য পূর্বনির্ধারিত রাষ্ট্র এবং এটি সি কোডের মধ্যেও বজায় রাখা প্রয়োজন (যেখানে কাটাটি ডিফল্ট রাউন্ডিং আচরণ হয়, অক্ষম কোড উত্পন্ন করতে মানদণ্ডের সাথে সম্মত হতে ইচ্ছুক সংকলককে বাধ্য করে যে রাউন্ডিং পরিবর্তন করে মোড, রূপান্তরটি করে, এবং তারপরে রাউন্ডিং মোড পরিবর্তন করে)।

অবহেলিত সমাবেশ মেমোনমিক্স:

; int ComputeOktas(void*    bmpBits  /* ESI */,
;                  uint32_t bmpSize  /* ECX */);
   push  ecx                  ; save size on stack
   xor   edx, edx             ; EDX = 0 (cloudy pixel counter)

CheckPixels:
   lodsd                      ; EAX = DS:[ESI]; ESI += 4
   not   eax
   and   eax, 0x00C0C0C0
   jnz   NotCloudy
   inc   edx
NotCloudy:
   loop  CheckPixels          ; ECX -= 1; loop if ECX > 0

   shl    edx, 3              ; counter *= 8
   fild   DWORD PTR [esp]     ; load original size from stack
   push   edx
   fild   DWORD PTR [esp]     ; load counter from stack
   fdivrp st(1), st(0)        ; ST(0) = counter*8 / size
   fistp  DWORD PTR [esp]     ; convert to integer, rounding to nearest even
   pop    eax                 ; load result
   pop    edx
   ret

নিশ্চয় আপনি এটিকে পুরোপুরি তৈরি করেননি এবং এখনও ভাবছেন যে কোডটি কীভাবে কাজ করে? :-)
ভাল, এটা বেশ সহজ। আমরা পিক্সেল আরজিবি মান "মেঘলা" বা "মেঘলা নয়" তা পরীক্ষা করে একবারে একবারে 32-বিট মান বিটম্যাপের মাধ্যমে পুনরাবৃত্তি করি। যদি এটি মেঘলা থাকে তবে আমরা আমাদের প্রাক-শূন্যতম কাউন্টারকে বাড়িয়ে তুলি। শেষে, আমরা গণনা করব: মেঘলা পিক্সেলমোট পিক্সেল  × 8
(যা সমান: মেঘলা পিক্সেলমোট পিক্সেল  ÷ 0.125)।

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

#include <stdio.h>
#include <assert.h>
#include <Windows.h>

int main()
{
   // Load bitmap as a DIB section under Windows, ensuring device-neutrality
   // and providing us direct access to its bits.
   HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,
                                        TEXT("C:\\...\\test1.bmp"),
                                        IMAGE_BITMAP,
                                        0, 0,
                                        LR_LOADFROMFILE  | LR_CREATEDIBSECTION);
   assert(hBitmap != NULL);

   // Get the bitmap's bits and attributes.
   DIBSECTION dib;
   GetObject(hBitmap, sizeof(dib), &dib);
   assert(dib.dsBm.bmBitsPixel == 32);
   uint32_t cx = dib.dsBm.bmWidth;
   uint32_t cy = abs(dib.dsBm.bmHeight);
   uint32_t sz = cx * cy;
   assert(sz > 0);

   int oktas = ComputeOktas(sz, dib.dsBm.bmBits);

   printf("%d\n", oktas);

   return 0;
}

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

mov  ecx, DWORD PTR [bmpSize]
mov  esi, DWORD PTR [bmpBits]

1

জাভাস্ক্রিপ্ট (ES6), 218 বাইট

(a,c=document.createElement`canvas`,w=c.width=a.width,h=c.height=a.height,x=c.getContext`2d`)=>x.drawImage(a,0,0)||x.getImageData(0,0,w,h).data.reduce((o,_,i,d)=>o+(i%4|d[i++]<192|d[i++]<192|d[i]<192?0:1),0)/w/h*8+.5|0

কোনও Imageবস্তুকে ইনপুট হিসাবে গ্রহণ করে , যা একটি <image>উপাদান থেকে তৈরি করা যায় ।

এখানে কোডপেনে এটি পরীক্ষা করে দেখুন!

বিকল্প

যদি ইনপুটটিকে আরজিবিএ মানগুলির ফ্ল্যাট অ্যারে হিসাবে নেওয়া যেতে পারে, মাত্রা সহ: 82 বাইট

(d,w,h)=>d.reduce((o,_,i)=>o+(i%4|d[i++]<192|d[i++]<192|d[i]<192?0:1),0)/w/h*8+.5|0

এই ইনপুট ফর্ম্যাটটি মেটাতে এই উত্তরটি যা বলে তার সাথে খুব মিল ।


1

গণিত 89 বাইট

নিম্নলিখিতটি ছবিটিকে বাইনারি করে এবং মেঘের ভগ্নাংশ, অর্থাৎ সাদা পিক্সেল নির্ধারণ করে। তারপরে এটি নির্ধারণ করে যে কতবার .125 ফলাফলের সাথে ফিট করে। এটি যে মান মেঝে ফিরে।

o@i_:=⌊8Tr@Flatten[ImageData@MorphologicalBinarize[i,.932],1]/Times@@ImageDimensions@i⌋
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.