ওএস থ্রেড শিডিয়ুলারের ফলস্বরূপ ননডেটেরিনিজম প্রকাশ করুন


10

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

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

আপনাকে অবশ্যই "পর্যাপ্ত ননডেটার্মিনিজম" অর্জন করতে হবে, এটি সংজ্ঞায়িত:

10 ট্রায়ালের 10 ক্রমিক সেটগুলিতে আপনার প্রোগ্রামের প্রতিটি পরীক্ষার মধ্যে কমপক্ষে 9 টি অনন্য ক্রম উত্পাদন করা উচিত। টানা 10 এর উভয় পক্ষেই আপনার কাছে যুক্তিসঙ্গত সংখ্যক ব্যর্থ সেট থাকতে পারে যা সফল হয়।

অথবা, অন্যভাবে বলতে গেলে, আপনার প্রোগ্রামের ১০০ রান দরকার যেখানে 10 রানের প্রতিটি ব্লকের সর্বাধিক দুটি রান থাকে যা একই জিনিসকে আউটপুট দেয়।

সুতরাং, মাঝে মাঝে 98 এবং 99 এর অদলবদল এটি কাটবে না।

এটি একটি , সুতরাং যে উত্তরটি সবচেয়ে কম বাইট জয় ব্যবহার করে।

ক্ষুদ্র অংশ

  • আপনার আউটপুট stdout লিখুন, প্রতি লাইনে একটি প্রবেশ
  • আপনি যদি তিনটি থ্রেড ইন্টারলিভ অক্ষর রেখে স্ট্রাউট (এমনকি মাঝে মাঝে) তিনটি সংখ্যা বা খালি লাইনগুলির মতো জিনিসগুলির ফলস্বরূপ ফর্ম্যাটটি ম্যাঙ্গেল করেন তবে আপনার ফলাফলটি অবৈধ is
  • উপরের নিয়মের একমাত্র ব্যতিক্রম হ'ল আপনি সর্বশেষ প্রয়োজনীয় নম্বরটি মুদ্রণের পরে একটি ফাঁকা রেখা নির্গত করতে পারেন (আপনাকে স্বাগতম)
  • যদি আপনি কোনও প্রয়োজনীয় মানগুলি মিস করেন বা সদৃশ হন তবে আপনার ফলাফলটি অবৈধ
  • তোমার প্রোগ্রাম নেই না (যদিও গৌরব যদি তা না হয়) একটা একক কোর প্রসেসর উপর nondeterministic হতে হবে
  • আপনার প্রোগ্রামে সবুজ থ্রেড / ফাইবার ব্যবহার করা যেতে পারে যা ওএস কার্নেল দ্বারা পরিচালিত হয় না যদি এটি এখনও চ্যালেঞ্জের অন্যান্য প্রয়োজনীয়তা পূরণ করে এবং থ্রেডিং সিস্টেমটি আপনার ভাষার অংশ বা আপনার ভাষার মানক গ্রন্থাগার is
  • আপনার প্রোগ্রামের রানটাইমটি একটি আধুনিক প্রসেসরের উপর নির্ভরযোগ্যভাবে 5 সেকেন্ডের মধ্যে থাকতে হবে
  • আপনার প্রোগ্রামের বাইরে যেমন পরিবেশের জন্য অপেক্ষা করা বা সেটিংস পরিবর্তনগুলি পরিবর্তনগুলি নির্দিষ্ট করতে পারেন না; আপনার প্রোগ্রামটি 100ish বার পিছনে পিছনে বা প্রতিটি রানের মধ্যে এক ঘন্টা বা সমান্তরালে 100ish বারের সাথে পাস করা উচিত (এটি সম্ভবত আসলে সহায়তা করবে ...)
  • আপনি কোনও GPro বা Xeon Phi এবং কোনও নিজস্ব অভ্যন্তরীণ সময়সূচী প্রক্রিয়াগুলির জন্য কোনও কোপ্রোসেসর ব্যবহার করতে পারেন। নিয়মগুলি হ'ল গ্রিন থ্রেডগুলিতে একইভাবে প্রয়োগ হয়।
  • যতক্ষণ আপনি এই পোস্টে সুনির্দিষ্ট নিয়মগুলি মেনে চলেন ততক্ষণ ঘুম, ফলন এবং অন্যান্য কৌশলগুলি দিয়ে শিডিয়ুলারকে প্ররোচিত করতে দ্বিধা বোধ করবেন না

নিষিদ্ধ অপারেশন

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

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

উত্তর বৈধতা

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

  • আপনার এন্ট্রি যদি উইন্ডোজ 10 v1607 x64 চলমান আই 75960x এ প্রয়োজনীয় আউটপুট তৈরি না করে তবে প্রয়োজনীয় পরিবেশ নির্দিষ্ট করুন
  • এটি এমন কিছু যদি আমি খুব সহজেই ভিএমওয়্যার ওয়ার্কস্টেশন সহ প্রজনন করতে পারি তবে সঠিক ওএস এবং ভিএম স্পেস সরবরাহ করুন
  • যদি এই শর্তগুলির মধ্যে কোনওটি তৈরি করা না যায় তবে শিরোনাম বিভাগে বর্ণিত হিসাবে পরীক্ষার এক সাথে স্ক্রিন ক্যাপচার রেকর্ড করুন এবং আপনার স্ক্রিনের একটি হ্যান্ডহেল্ড ভিডিও রেকর্ডিং আপনার মাউস এবং কীবোর্ড মিথস্ক্রিয়া (বা আপনার নিয়ন্ত্রণহীন গণনার যেকোন নিয়ন্ত্রণ স্কিম) ডিভাইসটি ব্যবহার করে) পরিষ্কারভাবে দৃশ্যমান হয় এবং আপনার উত্তর সহ দুটি ভিডিও পোস্ট করে এবং এটি কেন কাজ করে তার একটি ব্যাখ্যা অন্তর্ভুক্ত করে
  • পর্যায়ক্রমে, ফলাফল পুনরুত্পাদন করার জন্য মিলে যাওয়া হার্ডওয়্যার সহ একটি স্বনামধন্য দীর্ঘস্থায়ী ব্যবহারকারী (যিনি আপনি নন) পান এবং আপনার পক্ষে আশ্বাস দিন
  • যদি আপনার এন্ট্রিটি বহিরাগত প্রোগ্রামিং ল্যাঙ্গুয়েজে থাকে তবে একটি সাধারণ বিকাশকারী সংকলন / জিত / ব্যাখ্যা করার জন্য সেটআপ করা হয় না, সেটআপ নির্দেশাবলী সরবরাহ করে
  • যদি আপনি এন্ট্রি জেভিএম / পাইথন ইন্টারপ্রেটার / অন্যান্য নির্দিষ্ট সংস্করণের উপর নির্ভর করে তবে কোনটি নির্দিষ্ট করুন
  • আমার পরীক্ষায় আপনার 10 টি সফল ক্রমিক ক্রিয়াকলাপ ট্রায়াল পেতে যদি 10 মিনিটেরও বেশি সময় ব্যয় হয় তবে আপনি ব্যর্থ (তাই সাফল্যের অবস্থাটি একটি অদ্ভুত ঘটনা হতে দেবেন না, বিশেষত যদি আপনি উপরের কাছাকাছি থাকেন) রানটাইম আবদ্ধ)

4
"আমি যদি বিরক্ত হয়ে যাই ..." এর জন্য -1। আমি বলতে চাই যে এটি কতটা সময় নিতে পারে ঠিক তা উল্লেখ করুন।
Rɪᴋᴇʀ

@ ইস্টারলিআইর্ক এটিও বলেছে 'আধুনিক সিপিইউতে পাঁচ সেকেন্ডের নিচে নির্ভরযোগ্যতা'
পাভেল

@ পাভেল এটাকেই আমি উল্লেখ করছি না। 10 টি সফল ট্রায়াল 5 সেকেন্ডের সাথে সম্পর্কিত নয়।
Rɪᴋᴇʀ

@ ইস্টারলিআইর্ক মেলা যথেষ্ট, এখন 10 মিনিট।
টেকরোকেট 9

@ টেকরকেট ৯ দুর্দান্ত
R:01

উত্তর:


4

পার্ল 6 , 27 বাইট

await map {start .say},^100

ব্যাখ্যা:

      map {          },^100  # Iterate over the range 0..99, and for each of number:
           start             # Send the following task to a thread pool of OS threads:
                 .say        # Print the number, followed by a newline.
await                        # Wait until all tasks have completed.

আমি আশা করি এটি কার্যটি সন্তুষ্ট করে। (যদি না হয়, দয়া করে আমাকে জানান)

পরীক্ষামূলক:

আমি শেল স্ক্রিপ্টটি পর্যাপ্ত অ-সংজ্ঞা পরীক্ষা করার জন্য ব্যবহার করেছি:

#!/usr/bin/bash
for i in {1..10}; do
    set=""
    for j in {1..10}; do
        set="${set}$(perl6 nondet.p6 | tr '\n' ',')\n"
    done
    permutations="$(echo -e "$set" | head -n -1 | sort | uniq | wc -l)"
    echo -n "$permutations "
done

আমার জন্য, এই ফলাফলগুলি:

10 10 10 10 10 10 10 10 10 10 

সেটআপ নির্দেশাবলী:

আমি bit৪ বিট লিনাক্সে একটি আপ টু ডেট রাকুডো পারল with দিয়ে পরীক্ষাটি চালিয়েছি, যদিও আমার ধারণা এটি অন্যান্য প্ল্যাটফর্মগুলিতে কাজ করবে।

Rakudo ডাউনলোড পাতা সেটআপ নির্দেশমালা হয়েছে। আমি এইভাবে গিট থেকে আমার সংকলন করেছি:

git clone git@github.com:rakudo/rakudo.git
cd rakudo
perl Configure.pl --gen-moar --make-install
export PATH="$(pwd)/install/bin/:$PATH"

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

বা @ বি 2 গিল দ্বারা সরবরাহিত এই চেষ্টা করুন অনলাইন লিঙ্কটি ব্যবহার করে কেবল এটি অনলাইনে পরীক্ষা করুন । আমি কয়েকটি রান পরীক্ষা করে দেখেছি এবং প্রতিবারই আলাদা অর্ডার পেয়েছি, তবে অনলাইনে ইন্টারফেসের মাধ্যমে এটি 100 বার চালানোর ধৈর্য ছিল না।



রাকুডো পার্ল সংস্করণ 2016.11
9

4

bash, 32 28 বাইট

for i in {0..99};{ echo $i&}

আমি এটি 100 বার দৌড়েছি এবং 100 টি আলাদা ফলাফল পেয়েছি।

সম্পাদনা: @ ডিজিটাল ট্রামুমাকে ধন্যবাদ 4 টি বাইট সংরক্ষিত


তুমি আমাকে এটা দ্বারা মেরেছ. আসলে আমার একটি সামান্য বিট ছোট for i in {0..99};{ echo $i&}, তবে আপনি প্রথম পোস্ট করেছেন - আপনি এটি নিতে পারেন :)
ডিজিটাল ট্রমা

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

পুনঃটুইট
নিল

1
হ্যাঁ - এই জন্য একটি টিপ আছে ।
ডিজিটাল ট্রমা

মজার বিষয় হচ্ছে, কোনও E5-2699 ভি 4-তে মাইক্রোসফ্টের অফিসিয়াল ব্যাশ অন উইন্ডোগুলিতে চালিত হওয়ার পরে এটি "পর্যাপ্ত ননডিটারিনিজম" অর্জন করতে ব্যর্থ হয়েছে, তবে এটি একই মেশিনে 4 টি কোর সহ একটি আরএইচইএল ওয়ার্কস্টেশন ভিএম-এ কাজ করে যাতে এটি পাস হয়।
টেকরকেট 9

2

পাওয়ারশেল , 54 46 44 39 বাইট

workflow p{foreach -p($i in 0..99){$i}}

পাওয়ারশেল ওয়ার্কফ্লোগুলি টিআইওতে সমর্থিত নয়, সুতরাং আপনি এটি এখানে চেষ্টা করতে পারবেন না। আপনার উইন্ডোজ 10 মেশিনে দুর্দান্ত কাজ করা উচিত :)

একটি ফাংশন সংজ্ঞা দেয় pযা প্রার্থনার সময় সংখ্যাগুলির তালিকা আউটপুট দেবে will

টাইমিং

আমার মেশিনে প্রায় 600 মিমিতে একটি একক রান নির্ভরযোগ্যভাবে চালিত হয়। নীচে সংজ্ঞায়িত 100 টি পরীক্ষা 2 মিনিটের মধ্যে শেষ হয় finish

পরীক্ষামূলক

এটি পরীক্ষা করার জন্য এখানে সম্পূর্ণ কোড:

workflow p{foreach -p($i in 0..99){$i}}
#workflow p{foreach($i in 0..99){$i}}
# uncomment above to prove testing methodology does detect duplicates

1..10 | % {
    $set = $_
    Write-Host "Set $set of 10"
    1..10 | % -b {
        $runs = @()
    } -p {
        $run = $_
        Write-Host "-- Run $run of 10 in set $set"
        $runs += "$(p)"
    } -e {
        Write-Host "-- There were $(10-($runs|Get-Unique).Count) duplicate runs in set $set"
    }
}

আমার মেশিনে আউটপুট:

Set 1 of 10
-- Run 1 of 10 in set 1
-- Run 2 of 10 in set 1
-- Run 3 of 10 in set 1
-- Run 4 of 10 in set 1
-- Run 5 of 10 in set 1
-- Run 6 of 10 in set 1
-- Run 7 of 10 in set 1
-- Run 8 of 10 in set 1
-- Run 9 of 10 in set 1
-- Run 10 of 10 in set 1
-- There were 0 duplicate runs in set 1
Set 2 of 10
-- Run 1 of 10 in set 2
-- Run 2 of 10 in set 2
-- Run 3 of 10 in set 2
-- Run 4 of 10 in set 2
-- Run 5 of 10 in set 2
-- Run 6 of 10 in set 2
-- Run 7 of 10 in set 2
-- Run 8 of 10 in set 2
-- Run 9 of 10 in set 2
-- Run 10 of 10 in set 2
-- There were 0 duplicate runs in set 2
Set 3 of 10
-- Run 1 of 10 in set 3
-- Run 2 of 10 in set 3
-- Run 3 of 10 in set 3
-- Run 4 of 10 in set 3
-- Run 5 of 10 in set 3
-- Run 6 of 10 in set 3
-- Run 7 of 10 in set 3
-- Run 8 of 10 in set 3
-- Run 9 of 10 in set 3
-- Run 10 of 10 in set 3
-- There were 0 duplicate runs in set 3
Set 4 of 10
-- Run 1 of 10 in set 4
-- Run 2 of 10 in set 4
-- Run 3 of 10 in set 4
-- Run 4 of 10 in set 4
-- Run 5 of 10 in set 4
-- Run 6 of 10 in set 4
-- Run 7 of 10 in set 4
-- Run 8 of 10 in set 4
-- Run 9 of 10 in set 4
-- Run 10 of 10 in set 4
-- There were 0 duplicate runs in set 4
Set 5 of 10
-- Run 1 of 10 in set 5
-- Run 2 of 10 in set 5
-- Run 3 of 10 in set 5
-- Run 4 of 10 in set 5
-- Run 5 of 10 in set 5
-- Run 6 of 10 in set 5
-- Run 7 of 10 in set 5
-- Run 8 of 10 in set 5
-- Run 9 of 10 in set 5
-- Run 10 of 10 in set 5
-- There were 0 duplicate runs in set 5
Set 6 of 10
-- Run 1 of 10 in set 6
-- Run 2 of 10 in set 6
-- Run 3 of 10 in set 6
-- Run 4 of 10 in set 6
-- Run 5 of 10 in set 6
-- Run 6 of 10 in set 6
-- Run 7 of 10 in set 6
-- Run 8 of 10 in set 6
-- Run 9 of 10 in set 6
-- Run 10 of 10 in set 6
-- There were 0 duplicate runs in set 6
Set 7 of 10
-- Run 1 of 10 in set 7
-- Run 2 of 10 in set 7
-- Run 3 of 10 in set 7
-- Run 4 of 10 in set 7
-- Run 5 of 10 in set 7
-- Run 6 of 10 in set 7
-- Run 7 of 10 in set 7
-- Run 8 of 10 in set 7
-- Run 9 of 10 in set 7
-- Run 10 of 10 in set 7
-- There were 0 duplicate runs in set 7
Set 8 of 10
-- Run 1 of 10 in set 8
-- Run 2 of 10 in set 8
-- Run 3 of 10 in set 8
-- Run 4 of 10 in set 8
-- Run 5 of 10 in set 8
-- Run 6 of 10 in set 8
-- Run 7 of 10 in set 8
-- Run 8 of 10 in set 8
-- Run 9 of 10 in set 8
-- Run 10 of 10 in set 8
-- There were 0 duplicate runs in set 8
Set 9 of 10
-- Run 1 of 10 in set 9
-- Run 2 of 10 in set 9
-- Run 3 of 10 in set 9
-- Run 4 of 10 in set 9
-- Run 5 of 10 in set 9
-- Run 6 of 10 in set 9
-- Run 7 of 10 in set 9
-- Run 8 of 10 in set 9
-- Run 9 of 10 in set 9
-- Run 10 of 10 in set 9
-- There were 0 duplicate runs in set 9
Set 10 of 10
-- Run 1 of 10 in set 10
-- Run 2 of 10 in set 10
-- Run 3 of 10 in set 10
-- Run 4 of 10 in set 10
-- Run 5 of 10 in set 10
-- Run 6 of 10 in set 10
-- Run 7 of 10 in set 10
-- Run 8 of 10 in set 10
-- Run 9 of 10 in set 10
-- Run 10 of 10 in set 10
-- There were 0 duplicate runs in set 10

মজার বিষয় হল, এটি আমার E5-2699 ভি 4 বাক্সে রান প্রতি 51 সেকেন্ড সময় নেয় তবে আমার i5-5200U ল্যাপটপে কেবল .7 সেকেন্ডে। এটি 5 সেকেন্ডের সর্বোচ্চের অধীনে আসার সময় ল্যাপটপে ননডেটারিনিজম প্রয়োজনীয় ডিগ্রি অর্জন করে, তাই এটি পাস হয়। স্পষ্টতই, পাওয়ারশেলের শিডিয়ুলার অনেকগুলি কর এবং সংক্ষিপ্ত কার্যের সাথে ভাল খেলছে না।
টেকরকেট 9

এবং এটি i7 5960x
টেকরোকট 9

একটি আই 5-6300 ইউ ল্যাপটপে এইচএম ... 74 সেকেন্ড। সম্ভবত এটি উইন্ডোজ 10 বা পাওয়ারশেল 5.1 এর সাথে সমস্যা, কারণ উইন 10 না চালিত পরীক্ষিতদের মধ্যে i5-5200Uই একমাত্র মেশিন (এটি 8.1 চলছে)।
টেকরকেট 9

@ টেকরকেট 9 অদ্ভুত, আমি উইন 10, পিএস 5.1 তে পরীক্ষা করছিলাম। যদিও ISE তে।
ব্রিটিশবাদী

2

লিনাক্সে জিসিসি, 47 বাইট

main(i){for(i=99;fork()?i--:!printf("%d\n",i););}

এটি আমাকে প্রতিবার বেশিরভাগ ফলাফল দিয়েছে, gcc(কোনও পতাকা নেই) সংস্করণ 4.9.2 দিয়ে সংকলিত হয়েছে। বিশেষত, আমি 64৪-বিট দেবিয়ান 8.6 (কার্নেল সংস্করণ 3.16.31) এ ছিলাম।

ব্যাখ্যা

যদি fork()শূন্যটি (শিশু প্রক্রিয়া) প্রদান করে তবে এর মান iমুদ্রিত হবে এবং লুপের শর্তটি মিথ্যা, কারণ printfশূন্যের চেয়ে বেশি মান প্রদান করবে। মূল প্রক্রিয়াতে লুপের অবস্থাটি ঠিক i--


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