বাইনারি 1 এর গণনা অনুসারে সংখ্যা বাছাই করুন


35

লক্ষ্য

একটি ক্রিয়াকলাপ বা প্রোগ্রাম লিখুন তাদের বাইনারি উপস্থাপনায় উপস্থিত 1 এর সংখ্যা দ্বারা উত্পন্ন ক্রমে পূর্ণসংখ্যগুলির একটি অ্যারে সাজান। কোনও গৌণ সাজানোর শর্ত প্রয়োজন।

সাজানো তালিকার উদাহরণ

(16-বিট পূর্ণসংখ্যা ব্যবহার করে)

  Dec                Bin        1's
16375   0011111111110111        13
15342   0011101111101110        11
32425   0111111010101001        10
11746   0010110111100010         8
28436   0000110111110100         8
19944   0100110111101000         8
28943   0000011100011111         8
 3944   0000011111101000         7
15752   0011110110001000         7
  825   0000000011111001         6
21826   0101010101000010         6

ইনপুট

32-বিট পূর্ণসংখ্যার একটি অ্যারে।

আউটপুট

বর্ণ অনুসারে বাছাই করা একই সংখ্যার একটি অ্যারে।

স্কোরিং

এটি এক সপ্তাহের মধ্যে নির্বাচিত হওয়ার জন্য সর্বনিম্ন বাইটের কোড গল্ফ।


2
আপনি সুস্পষ্টভাবে উল্লেখ করেন নি, তবে এটি কি অবতরণ ক্রমে থাকা দরকার?
নিক টি

3
আপনি ঠিক বলেছেন, আমি এটি মিস করেছি। বাকি সবাই অবতরণ করে চলেছে, সুতরাং আমরা এটির সাথে থাকব।
হ্যান্ড-ই-ফুড

আমি মনে করি চূড়ান্ত নম্বরটি (21826) ভুল রূপান্তরিত হয়েছে। আমার উইন্ডোজ ক্যালকুলেটর অনুযায়ী, এটি 0101 0101 0100 0010 না 0010 1010 1100 0010. এর
Nzall

এই সংশোধনের জন্য ধন্যবাদ। এটি 21826 সম্পর্কে অদ্ভুত কারণ আমি সংখ্যাগুলিকে বাইনারি রূপান্তর করতে এক্সেল ব্যবহার করেছি। আমি এখন বাকি সম্পর্কে অবাক।
হ্যান্ড-ই-ফুড

সমাবেশ এবং পপকাউন্ট নির্দেশাবলী ব্যবহার করে সমাধান?
eiennohito

উত্তর:


27

জে (11)

(\:+/"1@#:)

এটি একটি ফাংশন যা একটি তালিকা গ্রহণ করে:

     (\:+/"1@#:) 15342 28943 16375 3944 11746 825 32425 28436 21826 15752 19944
16375 15342 32425 28943 11746 28436 19944 3944 15752 825 21826

আপনি যদি এটির নাম দিতে চান তবে এটির জন্য একটি অতিরিক্ত চরিত্রের দাম পড়বে:

     f=:\:+/"1@#:
     f 15342 28943 16375 3944 11746 825 32425 28436 21826 15752 19944
16375 15342 32425 28943 11746 28436 19944 3944 15752 825 21826

ব্যাখ্যা:

  • \:: নিচের দিকে বাছাই করুন
  • +/: সমষ্টি হল
  • "1: প্রতিটি সারি
  • #:: বাইনারি প্রতিনিধিত্ব

5
@ ak82 এটি এপিএল এর ASCII সংস্করণ
জন ডিভোরাক

3
@ জনডভোরাক প্রকারের; বেশ কয়েকটি পরিবর্তন হয়েছে: jsoftware.com/papers/j4apl.htm (ভাষা বিভাগ দেখুন)।
জেমস উড

3
এছাড়াও আছে \:1#.#:যা কয়েক বাইট সংরক্ষণ করে।
মাইল

17

জাভাস্ক্রিপ্ট, 39

আপডেট: এখন রুবির চেয়ে ছোট।

x.sort(q=(x,y)=>!x|-!y||q(x&x-1,y&y-1))

40

x.sort(q=(x,y)=>x&&y?q(x&x-1,y&y-1):x-y)

ব্যাখ্যা:

q একটি পুনরাবৃত্তি ফাংশন। যদি x বা y 0 হয় তবে এটি ফিরে আসে x-y(x শূন্য হলে একটি নেতিবাচক সংখ্যা বা y শূন্য হলে ধনাত্মক সংখ্যা)। অন্যথায় এটি x&x-1x এবং y থেকে সর্বনিম্ন বিট ( ) সরিয়ে পুনরাবৃত্তি করে।

পূর্ববর্তী সংস্করণ (42)

x.sort(q=(x,y)=>x^y&&!x-!y+q(x&x-1,y&y-1))

আসলেই চালাক! আমি এখনও আমার চারপাশে আমার মন মোড়ানো চেষ্টা করছি।
mowwwalker

~yপরিবর্তে কাজ করা উচিত নয় -!y?
টুথব্রাশ

@ টুথব্রাশ শেষ শর্তটি হ'ল x বা y 0 হয়, এই ক্ষেত্রে অভিব্যক্তিটি !x|-!yশূন্য হয়। ~অনেকগুলি ইনপুটগুলির জন্য এটি শূন্য নয় (যেহেতু শূন্য সহ) সত্যিই এটি মাপসই হয় না
অনুলিপি করুন

দয়া করে কোনও মাধ্যমিক বাছাইয়ের প্রয়োজনে কেউ আমাকে সহায়তা করতে পারেন ?
মনুভরগব

15

রুবি 41

f=->a{a.sort_by{|n|-n.to_s(2).count(?1)}}

টেস্ট:

a = [28943, 825, 11746, 16375, 32425, 19944, 21826, 15752, 15342, 3944, 28436];
f[a]
=> [16375, 15342, 32425, 11746, 28436, 28943, 19944, 15752, 3944, 21826, 825]

2
সহজ। বোধগম্য। সংক্ষিপ্ত। এই সমাধানের জন্য কুডোস।
পিয়ের আরলাড


8

কমন লিস্প, 35

logcountএকটি সংখ্যায় 'অন'-বিটের সংখ্যা প্রদান করে। একটি তালিকার জন্য l, আমাদের রয়েছে:

(sort l '> :key 'logcount)
CL-USER> (sort (list 16375 15342 32425 11746 28436 19944 28943 3944 15752 825 21826) '> :key 'logcount)
;=> (16375 15342 32425 11746 28436 19944 28943 3944 15752 825 21826)

একটি স্বতন্ত্র ফাংশন হিসাবে এবং আমি কী বাইট গণনা উপর ভিত্তি করে:

(lambda(l)(sort l'> :key'logcount))

7

পাইথন 3, 90 77 72 67 টি অক্ষর।

আমাদের সমাধান কমান্ড-লাইন থেকে একটি ইনপুট নেয় এবং অবতরণ ক্রমে (67 অক্ষর), বা আরোহণ () 66) নম্বর মুদ্রণ করে।

অবতরণ ক্রম

print(sorted(input().split(),key=lambda x:-bin(int(x)).count("1"))) # 67

@ ডানিরোকে ধন্যবাদ, শেষের দিকে অ্যারেটি বিপরীতমুখী করার জন্য একটি স্লাইস ব্যবহার না করে, এটির বিপরীতে 1 এর গণনায় একটি বিয়োগ ব্যবহার করার পরামর্শের জন্য! এটি কার্যকরভাবে 5 টি অক্ষর সংরক্ষণ করেছে।

কেবল এটি পোস্ট করার স্বার্থে, আরোহী ক্রমের সংস্করণ (যা আমরা প্রথম তৈরি করেছি) একটি চরিত্র কম নেবে।

আরোহী আদেশ :

print(sorted(input().split(),key=lambda x:bin(int(x)).count("1"))) # 66

চাবি = ল্যাম্বদা এক্স… পরামর্শের জন্য @ বাকুরিউকে ধন্যবাদ । ; ডি


সুতরাং 0সর্বদা আপনার আউটপুট এর অংশ হবে; এটি সঠিক নয়।
ডানিরো

আমি প্রশ্নের মধ্যে এমন কোনও কিছুই দেখতে পাই না যা আমাকে কোনও মান সন্নিবেশ করতে বাধা দেয়।
জেটলিফ

আমি করি: " একই পূর্ণসংখ্যার একটি অ্যারে বর্ণিত হিসাবে সাজানো হয়েছে।" ;) তদ্ব্যতীত, কেন কেবল raw_input()কিছু অক্ষর ব্যবহার এবং বাদ দেওয়া যায় না ?
ডানিরো

1
@ ডানিরো এটি ঠিক করে দিয়েছে পাইথন 3 এ স্যুইচ করা (একটি পাইথন 2 উত্তর ইতিমধ্যে উপস্থিত ছিল, সৃজনশীল হতে হবে!) আমাকে ইনপুট ব্যবহার করতে দেয় () মুদ্রণের () দ্বারা প্রয়োজনীয় বন্ধনীগুলির কারণে দুটি অক্ষর (দুটি যুক্ত করা যায় ) সংরক্ষণ করা।
জেটলিফ

আপনি []ভিতরে ড্রপ করতে পারেন sorted। এছাড়াও এই প্রোগ্রামটির আউটপুট হল সাজানো ইনপুট সংখ্যায় 1s এর সংখ্যা, তবে আপনি যে ইনপুটটিতে প্রাপ্ত নম্বরটি 1s এর সংখ্যা ব্যবহার করে বাছাই করা উচিত of এর মতো কিছু: print(sorted(input().split(), key=lambda x:bin(int(x)).count('1')))সঠিক হবে।
বাকুরিউ

7

জাভাস্ক্রিপ্ট [by 76 বাইট]

a.sort(function(x,y){r='..toString(2).split(1).length';return eval(y+r+-x+r)})

aসংখ্যার ইনপুট অ্যারে কোথায় ।

টেস্ট:

[28943,825,11746,16375,32425,19944,21826,15752,15342,3944,28436].sort(function(x, y) {
    r = '..toString(2).split(1).length';
    return eval(y + r + -x + r);
});

[16375, 15342, 32425, 19944, 11746, 28943, 28436, 15752, 3944, 21826, 825]

আপনি দয়া করে বলতে পারেন কিভাবে ..কাজ করে? আমার বোধগম্যতা যদি x = 5তা eval(x + r)হয় তবে eval(5..toString(2).match(/1/g).length)যা হয় তা আমি মনে করি, অবৈধ। ধন্যবাদ।
গৌরাঙ্গ ট্যান্ডন

1
পছন্দ করুন যেমন আপনি জানেন, জেএসে আক্ষরিক ব্যতীত সমস্ত কিছুই একটি অবজেক্ট। এবং সংখ্যা। সুতরাং তাত্ত্বিকভাবে (এবং ব্যবহারিকভাবে) আপনি ডট নোটেশনের মাধ্যমে কোনও অ-আক্ষরিকের সম্পত্তি বা কল পদ্ধতিগুলি পেতে পারেন যেমন আপনি করেন 'string'.lengthবা করেন [1,2,3].pop()। সংখ্যার ক্ষেত্রে আপনিও একই কাজ করতে পারেন তবে আপনার মনে রাখতে হবে যে একটি ডট পরে পার্সার একটি ভাসমান মান (যেমন হিসাবে 123.45) প্রত্যাশা করে সংখ্যার একটি ভগ্নাংশের অংশ সন্ধান করবে । আপনি একটি পূর্ণসংখ্যা ব্যবহার করেন তাহলে আপনি পার্সার করে একটি ভগ্ন অংশ খালি "বলুন" উচিত, একটি সম্পত্তি অ্যাড্রেসিং আগে একটি অতিরিক্ত ডট করুন: 123..method()
ভিজিওন

1
শূন্যগুলি কেটে ফেলে বাকী দশমিক সংখ্যা হিসাবে ধরে রেখে আপনি দুটি বাইট সংরক্ষণ করতে পারেন। match(/1/g).lengthসঙ্গে প্রতিস্থাপন replace(/0/g,"")
ডকম্যাক্স

@ ভিসিওন ধন্যবাদ! একটি নতুন জিনিস শিখেছি।
গৌরাঙ্গ ট্যান্ডন

1
a.sort(function(x,y){r='..toString(2).match(/1/g).length';return eval(y+r+-x+r)})
l4m2

6

গণিত 30

SortBy[#,-DigitCount[#,2,1]&]&

ব্যবহার:

SortBy[#,-DigitCount[#,2,1]&]&@
                           {19944,11746,15342,21826,825,28943,32425,16375,28436,3944,15752}

{16375, 15342, 32425, 11746, 19944, 28436, 28943, 3944, 15752, 825, 21826}


6

কে [১৫ টি চর]

{x@|<+/'0b\:'x}

উদাহরণ 1

{x@|<+/'0b\:'x}19944, 11746, 15342, 21826, 825, 28943, 32425, 16375, 28436, 3944, 15752

16375 15342 32425 28436 28943 11746 19944 15752 3944 825 21826

উদাহরণ 2 (সমস্ত সংখ্যা 2 ^ n -1)

{x@|<{+/0b\:x}'x}3 7 15 31 63 127

127 63 31 15 7 3

5

গণিত 39

IntegerDigits[#,2] একটি বেস 10 নম্বর 1 এবং 0 এর তালিকায় রূপান্তর করে।

Tr অঙ্কগুলি যোগ করে।

f@n_:=SortBy[n,-Tr@IntegerDigits[#,2]&]

পরীক্ষা ক্ষেত্রে

f[{19944, 11746, 15342, 21826, 825, 28943, 32425, 16375, 28436, 3944, 15752}]

{16375, 15342, 32425, 11746, 19944, 28436, 28943, 3944, 15752, 825, 21826}


আমি গল্ফিং কোডে ট্র [] এর (আব?) ব্যবহারের অনুরাগী হয়েছি।
মাইকেল স্টার্ন

5

জাভা 8 - 87/113 81/111 60/80 60/74/48 অক্ষর

এটি সম্পূর্ণ জাভা প্রোগ্রাম নয়, এটি কেবল একটি ফাংশন (একটি পদ্ধতি, নির্ভুল হতে)।

এটি ধরে নেওয়া হয় java.util.Listএবং java.lang.Long.bitCountআমদানি করা হয় এবং এর 60 টি অক্ষর রয়েছে:

void s(List<Long>a){a.sort((x,y)->bitCount(x)-bitCount(y));}

যদি কোনও প্রাক-আমদানি করা সামগ্রীর অনুমতি না দেওয়া হয় তবে এটি এখানে 74 টি অক্ষরের সাথে রয়েছে:

void s(java.util.List<Long>a){a.sort((x,y)->x.bitCount(x)-x.bitCount(y));}

এটির প্রয়োজন হলে এটির জন্য আরও 7 টি অক্ষর যুক্ত করুন static

[৪ বছর পরে] বা আপনি যদি পছন্দ করেন তবে এটি ল্যাম্বডা হতে পারে (পরামর্শের জন্য @ কেভিন ক্রুইজসেন), ৪৮ বাইট সহ:

a->{a.sort((x,y)->x.bitCount(x)-x.bitCount(y));}

কোনও কারণ কেন আপনি না করতে পারেন Integer.bitCount(x)<Integer.bitCount(y)?-1:1;? আপনার কি -1,0,1আচরণ দরকার ?
জাস্টিন

এছাড়াও, <Integer>স্থানটির সাথে প্রতিস্থাপন করা কি সম্ভব ?
জাস্টিন

আপনি Longকিছু জায়গা
বাঁচাতেও

এছাড়াও a.sort((x,y)->Long.bitCount(x)-Long.bitCount(y));
রবউ

1
ধন্যবাদ কেভিন ক্রুজসেন আমি এতটা ব্যবহার করেছি যে স্থির পদ্ধতিতে কল করতে একটি পরিবর্তনশীল উদাহরণ ব্যবহার করা একটি খারাপ অভ্যাস যা আমি কখনই ভুলে গিয়েছিলাম যে সংকলক সেটি গ্রহণ করে।
ভিক্টর স্টাফুসা

4

পাইথন 2.x - 65 টি অক্ষর (বাইট)

print sorted(input(),key=lambda x:-sum(int(d)for d in bin(x)[2:]))

এটি আসলে characters 66 টি অক্ষর, if৫ যদি আমরা এটিকে একটি ফাংশন করি (তবে এটির জন্য আপনাকে কিছু বলার দরকার যা উপস্থাপনের জন্য লামার।)

f=lambda a:sorted(a,key=lambda x:-sum(int(d)for d in bin(x)[2:]))

বাশ / সিএমডি-তে ডেমো:

echo [16, 10, 7, 255, 65536, 5] | python -c "print sorted(input(),key=lambda x:-sum(int(d)for d in bin(x)[2:]))"

আপনি পরিবর্তন করতে পারেন sum(int(d)for d in bin(x)[2:])থেকেsum(map(int,bin(x)[2:]))
আল-ইয়াসা

1
বা এমনকি:print sorted(input(),key=lambda x:-bin(x).count('1'))
ইলিশা

4

মতলব, 34

'এ' ইনপুট

[~,i]=sort(-sum(dec2bin(a)'));a(i)

Nonnegative সংখ্যা জন্য কাজ করে।


4

সি - 85 বাইট (108 106 বাইট)

জিসিসি / কলং / যেখানেই __builtin_popcountপাওয়া যায় তার পোর্টেবল সংস্করণ (106 বাইট):

#define p-__builtin_popcount(
c(int*a,int*b){return p*b)-p*a);}
void s(int*n,int l){qsort(n,l,sizeof l,c);}

আল্ট্রা-কনডেন্সযুক্ত, অ-বহনযোগ্য, সবেমাত্র কার্যকরী এমএসভিসি-কেবল সংস্করণ (85 বাইট):

#define p __popcnt
c(int*a,int*b){return p(*b)-p(*a);}
s(int*n,int l){qsort(n,l,4,c);}         /* or 8 as needed */

  • বাইট গণনাতে প্রথম নিউলাইন অন্তর্ভুক্ত কারণ #define, অন্যান্যগুলি প্রয়োজনীয় নয়।

  • কল করতে ফাংশন s(array, length)নির্দিষ্টকরণ অনুসারে।

  • sizeofপোর্টেবল সংস্করণে হার্ডকোড করতে পারে অন্য কয়েকটি সি উত্তরগুলির মতো আরও 7 টি অক্ষর সংরক্ষণ করতে। দৈর্ঘ্য-ব্যবহারযোগ্যতা অনুপাতের ক্ষেত্রে কোনটি সবচেয়ে বেশি মূল্যবান তা আমি নিশ্চিত নই, আপনি সিদ্ধান্ত নিন।


2
sizeof lএকটি বাইট সংরক্ষণ করে। মারাত্মক কুৎসিত অন্যটিকে #define p-__builtin_popcount(বাঁচাতে সহায়তা করতে পারে।
ugoren

টিউসগুলির জন্য ধন্যবাদ! প্রিপ্রোসেসরটি এমন হ্যাক, আমার কোনও ধারণা ছিল না যে এটি সম্ভব হয়েছিল। দুঃখজনকভাবে এটি এমএসভিসিতে কাজ করে না, তবে প্রতিটি বাইট গণনা করে!
থমাস

4

পাওয়ারশেল ভি 3, 61 58 53

$args|sort{while($_){if($_-band1){1};$_=$_-shr1}}-des

সেমিডলেটের জন্য Sort-Objectস্ক্রিপ্টব্লক সংখ্যার বাইনারি উপস্থাপনায় প্রতিটি 1 এর জন্য 1 এর অ্যারে প্রদান করে। Sort-Objectপ্রতিটি সংখ্যার জন্য ফিরে আসা অ্যারের দৈর্ঘ্যের উপর ভিত্তি করে তালিকাটি সাজান।

চালানো:

script.ps1 15342 28943 16375 3944 11746 825 32425 28436 21826 15752 19944

এটা কাজ। এটি কিভাবে কাজ করে? কেমন যাদু '।' 'অ্যারের দৈর্ঘ্যের উপর ভিত্তি করে' আসে?
mazzy

দ্য '.' এর পরে আসা স্ক্রিপ্টব্লকটি কার্যকর করে। বাছাই কমান্ড বহিরাগত স্ক্রিপ্টব্লকের আউটপুটের উপর ভিত্তি করে সাজান orts আমি এখন বুঝতে পারি যে অভ্যন্তরীণ লিপি ব্লকের প্রয়োজন নেই। সম্পাদনা দেখুন
রিন্যান্ট

$f={অপ্রয়োজনীয়, while-> for, -band1-> %2, -des-> -dএবং অন্যান্য গল্ফ কৌশল। এটা পরিস্কার. আপনি কীভাবে কাজ করবেন তা ব্যাখ্যা করতে পারেন $args|sort{@(1,1,...,1)}? এটা কাজ! কীভাবে সাজানো সুস্পষ্টভাবে অ্যারেগুলির সাথে তুলনা করে .Count? এটি সম্পর্কে কোথায় পড়বেন? ধন্যবাদ!
mazzy

1
@ মমজি, তুমি ঠিক বলেছ, আমি এখন রিডানড্যান্ট বিটগুলি সরিয়েছি। এটি বাছাই-অবজেক্ট সেমিডলেটের ডিফল্ট বাছাই। দেখুন: help Sort-Object -Parameter propertyপ্রকারের জন্য ডিফল্ট বাছাই করার সম্পত্তিটি কোথায় সংজ্ঞায়িত হয়েছে তা আমি জানি না, তবে অ্যারেগুলির জন্য এটি গণনা বা দৈর্ঘ্য।
রেন্যান্ট

ভাল ধারণা। তবে $args|sort{while($_){if($_-band1){$_};$_=$_-shr1}}-desএকটি ভুল ফলাফল দেয়। সুতরাং, এটি না Count। এটি খুব আকর্ষণীয়. আবার ধন্যবাদ.
mazzy

3

ইসমাস্ক্রিপ্ট 6, 61

ধরে নিই zইনপুট

z.sort((a,b)=>{c=d=e=0;while(++c<32)d+=a>>c&1,e+=b>>c&1},e-d)

পরীক্ষার ডেটা

[28943,825,11746,16375,32425,19944,21826,15752,15342,3944,28436].sort(
    (a,b)=>{
        c=d=e=0;
        while(++c<32)
            d+=a>>c&1,e+=b>>c&1
    },e-d
)

[16375, 15342, 32425, 11746, 19944, 28436, 28943, 15752, 3944, 21826, 825]

ধন্যবাদ, সংক্ষিপ্ত সমাধানের জন্য টুথব্রাশ।


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

পছন্দ করুন এটি ধরার জন্য ধন্যবাদ, এখনই কাজ করা উচিত।
ড্যানি

মহান কাজ! আমি এটা পছন্দ করি.
টুথব্রাশ

1
শুধুমাত্র 61 বাইট: z.sort((a,b)=>{c=d=e=0;while(++c<32)d+=a>>c&1,e+=b>>c&1},e-d)(এবং আপ-ভোটের জন্য ধন্যবাদ)।
টুথব্রাশ

1
আমার সমাধান এখন আপনার হিসাবে একই আকার!
টুথব্রাশ

3

আর , 132 96 94 88 84 75 73 53 51 বাইট

-20 জে.ডো এর বাস্তবায়নের জন্য ধন্যবাদ -2 জিউসেপিকে আরও ধন্যবাদ

function(x)x[order(colSums(sapply(x,intToBits)<1))]

আমার মূল পোস্ট:

pryr::f(rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))]))

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

এই ফলাফলটিতে নামার আগে আমি বেশ কয়েকটি বিভিন্ন পদ্ধতি চেষ্টা করেছি।

ম্যাট্রিক্স পদ্ধতি: একটি দুটি কলাম ম্যাট্রিক্স তৈরি করেছে, একটি কলাম ইনপুট ভেক্টর দিয়ে, বাইনারি উপস্থানের যোগফলগুলির মধ্যে একটি, তারপরে আমি বাইনারিয়ের যোগফল অনুসারে বাছাই করেছি।

function(x){m=matrix(c(x,colSums(sapply(x,function(y){as.integer(intToBits(y))}))),nc=2,nr=length(x));m[order(m[,2],decreasing=T),]}

নন-ম্যাট্রিক্স: উপলব্ধ আমি ম্যাট্রিক্স ফাংশনটি টস করতে এবং পরিবর্তে বাইনারি মানগুলির একটি ভেক্টর তৈরি করতে, তাদের যোগফল, অর্ডার, এবং ইনপুট ভেক্টরটিকে পুনর্বিন্যাসের জন্য আদেশকৃত মানগুলি ব্যবহার করতে পারি।

function(x){m=colSums(sapply(x,function(y){as.integer(intToBits(y))}));x[order(m,decreasing=T)]}

ক্ষুদ্র পরিবর্তন

function(x){m=colSums(sapply(x,function(y)as.double(intToBits(y))));x[order(m,decreasing=T)]}

আরও মাইনর পরিবর্তনগুলি সেমিকোলন দ্বারা বিভক্ত দুটিয়ের পরিবর্তে পুরো বিষয়টিকে কোডের এক লাইনে রূপান্তর করে।

function(x)x[order(colSums(sapply(x,function(y)as.double(intToBits(y)))),decreasing=T)]

সমষ্টি পদ্ধতিcolSums দ্বারা তৈরি বাইনারি ম্যাট্রিক্সের সাথে কলামগুলি যুক্ত করার পরিবর্তে sapply, আমি sapply"সমাপ্ত" হওয়ার আগে কলামে উপাদানগুলি যুক্ত করেছি ।

function(x)x[order(sapply(x,function(y)sum(as.double(intToBits(y)))),decreasing=T)]

আয় করার কমে আমি সত্যিই কমছে কমান করতে চেয়েছিলেন, কিন্তু আমার দিকে আর squawks যদি আমি কমান চেষ্টা decreasingমধ্যে orderফাংশন, যা অর্ডার কাঙ্ক্ষিত করতে প্রয়োজন ছিল orderবাড়ানোর ডিফল্ট, তারপর আমি মনে revএকটি ভেক্টর বিপরীত ফাংশন। EUREKA !!! চূড়ান্ত সমাধান গত পরিবর্তন ছিল functionথেকে pryr::f2 আরও বেশি বাইট সংরক্ষণ করতে

function(x)rev(x[order(sapply(x,function(y)sum(as.double(intToBits(y)))))])


1
@ জে.ডো এর দুর্দান্ত গল্ফে 51 বাইট উন্নতি করছে!
জিউসেপে

2

হাস্কেল, 123 সি

import Data.List
import Data.Ord
b 0=[]
b n=mod n 2:b(div n 2)
c n=(n,(sum.b)n)
q x=map fst$sortBy(comparing snd)(map c x)

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

উদাহরণ

*Main> q [4,2,15,5,3]
[4,2,5,3,15]
*Main> q [7,0,2]
[0,2,7]

অবরুদ্ধ সংস্করণ (ব্যাখ্যা সহ)

import Data.List
import Data.Ord

-- Converts an integer into a list of its bits
binary 0 = []
binary n = mod n 2 : binary (div n 2)

-- Creates a tuple where the first element is the number and the second element
-- is the sum of its bits.
createTuple n = (n, (sum.binary) n)

-- 1) Turns the list x into tuples
-- 2) Sorts the list of tuples by its second element (bit sum)
-- 3) Pulls the original number out of each tuple
question x = map fst $ sortBy (comparing snd) (map createTuple x)

এটির জন্য পোঁতা স্বরলিপি ব্যবহার করতে সহায়ক হবে mod, n`mod`2? এর গুণ ও ভাগের সমান নজির রয়েছে।
জন ডিভোরাক

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

আমদানি করুন ডেটলিস্ট; আমদানি করুন ডেটা.আরড; আমদানি করুন ডেট.বিটস; কি = সার্টবি - (পপকাউন্টের তুলনা) - ৮০ সি - বা আপনার পন্থা ব্যবহার করে ডেটা আমদানি করুন ist তালিকা; আমদানি করুন ডেটা.অর্ড; বি 0 = 0; বিএন = (মোড এন 2) + বি (ডিভ এন 2); কি = সাজানো বাই (তুলনা খ) - 86 সি
বাজরঘ

আমি পুরোপুরি আমদানি এড়িয়ে চলার চেষ্টা করেছি, সেরা গল্ফিং কোুইকোর্টের মাধ্যমে আমি 87C ছিল পরিচালনা করতে পারি: বি 0 = 0; বিএন = মোড এন 2 + বি (ডিভ এন 2); কিউ [] = []; কিউ (এ: সি) = এফ ( (বা>)। বি) সি ++ এ: চ ((বা <=)) খ) সি; এফ = (কি।)। ফিল্টার
বাজরঘ

2

কফিস্ক্রিপ্ট (94)

পঠনযোগ্য কোড (212):

sort_by_ones_count = (numbers) ->
  numbers.sort (a, b) ->
    a1 = a.toString(2).match(/1/g).length
    b1 = b.toString(2).match(/1/g).length
    if a1 == b1
      0
    else if a1 > b1
      1
    else
      -1

console.log sort_by_ones_count [825, 3944, 11746, 15342, 15752, 16375, 19944, 21826, 28436, 28943, 32425]

অনুকূলিত (213):

count_ones = (number) -> number.toString(2).match(/1/g).length
sort_by_ones_count = (numbers) -> numbers.sort (a, b) ->
  a1 = count_ones(a)
  b1 = count_ones(b)
  if a1 == b1 then 0 else if a1 > b1 then 1 else -1

অবরুদ্ধকরণ (147):

c = (n) -> n.toString(2).match(/1/g).length
s = (n) -> n.sort (a, b) ->
  a1 = c(a)
  b1 = c(b)
  if a1 == b1 then 0 else if a1 > b1 then 1 else -1

টার্নারি অপারেটরগুলি অত্যধিক দীর্ঘ (129):

c = (n) -> n.toString(2).match(/1/g).length
s = (n) -> n.sort (a, b) ->
  a1 = c(a)
  b1 = c(b)
  (0+(a1!=b1))*(-1)**(0+(a1>=b1))

এখনও খুব দীর্ঘ, castালাই বন্ধ করুন (121):

c = (n) -> n.toString(2).match(/1/g).length
s = (n) -> n.sort (a, b) ->
  a1 = c(a)
  b1 = c(b)
  (-1)**(a1>=b1)*(a1!=b1)

ফাইনাল (94):

c=(n)->n.toString(2).match(/1/g).length
s=(n)->n.sort((a, b)->(-1)**(c(a)>=c(b))*(c(a)!=c(b)))

2

স্মলটাক (স্মলটালক / এক্স), ৩ ((বা সম্ভবত 24)

ইন ইন ইন; ধ্বংসাত্মকভাবে একটিতে সাজানো:

a sort:[:a :b|a bitCount>b bitCount]

ক্রিয়ামূলক সংস্করণ: একটি নতুন সাজানো অ্যারে প্রদান করে:

a sorted:[:a :b|a bitCount>b bitCount]

এমনকি 24 টি অক্ষরে একটি সংক্ষিপ্ত রূপও রয়েছে ( নাম বা ফাংশনটি আর্গুমেন্ট হিসাবে পাঠানো)। তবে (দীর্ঘশ্বাস) এটি সর্বশেষে বাছাই করবে। যেমনটি আমি বুঝতে পেরেছি, এটির জন্য জিজ্ঞাসা করা হয়নি, তাই আমি এটিকে গল্ফ স্কোর হিসাবে গ্রহণ করি না:

a sortBySelector:#bitCount

2

পিএইচপি 5.4+ 131

আমি জানি না কেন আমি পিএইচপি দিয়ে কেন বিরক্ত হই:

<?unset($argv[0]);usort($argv,function($a,$b){return strcmp(strtr(decbin($b),[0=>'']),strtr(decbin($a),[0=>'']));});print_r($argv);

ব্যবহার:

> php -f sortbybinaryones.php 15342 28943 16375 3944 11746 825 32425 28436 21826 15752 19944
Array
(
    [0] => 16375
    [1] => 15342
    [2] => 32425
    [3] => 28436
    [4] => 19944
    [5] => 11746
    [6] => 28943
    [7] => 3944
    [8] => 15752
    [9] => 825
    [10] => 21826
)

ভাল, কেউ আছে পিএইচপি সঙ্গে বিরক্ত করার জন্য
Einacio


2

ডিএফএসএআরটি (আইবিএম মেইনফ্রেম বাছাই করার পণ্য) ২৮৮ (প্রতিটি উত্স রেখা 72২ টি অক্ষরের, এক পজিশনে স্থান থাকতে হবে)

 INREC IFTHEN=(WHEN=INIT,BUILD=(1,2,1,2,TRAN=BIT)), 
       IFTHEN=(WHEN=INIT,FINDREP=(STARTPOS=3,INOUT=(C'0',C'')))
 SORT FIELDS=(3,16,CH,D) 
 OUTREC BUILD=(1,2)

শুধু মজা করার জন্য, এবং কোনও গণিত নেই।

পূর্ণসংখ্যার সাহায্যে একটি ফাইল নেয় (এমন একটি প্রোগ্রাম থেকে চালিত হতে পারে যা "অ্যারে" ব্যবহার করে)। বাছাইয়ের আগে, এটি পূর্ণসংখ্যাকে বিটগুলিতে অনুবাদ করে (একটি 16-অক্ষরের ক্ষেত্রে)। তারপরে বিটগুলিতে 0 গুলি কিছুতেই পরিবর্তন করুন। পরিবর্তিত বিটগুলির ফলাফলের ভিত্তিতে ক্রম বর্ধমান। বাছাই করা ফাইলটি কেবল পূর্ণসংখ্যার সাহায্যে তৈরি করে।


2

সি

void main()
{
 int a[]={7,6,15,16};
 int b,i,n=0;
 for(i=0;i<4;i++)
 {  for(b=0,n=0;b<=sizeof(int);b++)
      (a[i]&(1<<b))?n++:n;   
    a[i]=n;
 }
 for (i = 1; i < 4; i++) 
  {   int tmp = a[i];
      for (n = i; n >= 1 && tmp < a[n-1]; n--)
         a[n] = a[n-1];
      a[n] = tmp;
  }    
}

4
যেহেতু এটি একটি কোড গল্ফ প্রতিযোগিতা, তাই আপনার কোডটি ছোট করার চেষ্টা করা উচিত।
টিমটেক

2

সি #, 88 89

int[] b(int[] a){return a.OrderBy(i=>-Convert.ToString(i,2).Count(c=>c=='1')).ToArray();}

সম্পাদনা: অবতরণ ক্রম একটি অক্ষর যুক্ত করে।


2

জাভাস্ক্রিপ্ট 84

অন্যান্য জাভাস্ক্রিপ্ট উত্তরের দ্বারা অনুপ্রাণিত হয়েছে, কিন্তু ইওল এবং রেজেক্স ছাড়াই।

var r=(x)=>(+x).toString(2).split('').reduce((p,c)=>p+ +c)
[28943,825,11746,16375,32425,19944,21826,15752,15342,3944,28436].sort((x,y)=>r(x)-r(y));

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

2

জাভাস্ক্রিপ্ট (82)

a.sort(function(b,c){q=0;while(b|c){b%2?c%2?0:q++:c%2?q--:0;b>>=1;c>>=1}return q})

2

পোস্টস্ক্রিপ্ট, 126

যেহেতু মানগুলির তালিকা অনুসারে আমরা সাজিয়েছি তা আগে থেকেই জানা এবং খুব সীমাবদ্ধ (32), এই কাজটি সহজেই সম্পন্ন করা যায় এমনকি যদি বাছাইয়ের জন্য অন্তর্নির্মিত না থাকে তবে 1..32 এর সাথে মিলে যাওয়া মানগুলি বাছাই করে। (এটি ও (32 এন)? সম্ভবত)

প্রক্রিয়া স্ট্যাকের অ্যারে প্রত্যাশা করে এবং 'সাজানো' অ্যারে প্রদান করে।

/sort_by_bit_count {
    [ exch
    32 -1 1 {
        1 index
        {
            dup 2 32 string cvrs
            0 exch
            {48 sub add} forall
            2 index eq 
            {3 1 roll} {pop} ifelse
        } forall
        pop
    } for
    pop ]
} def

অথবা, শ্বেত স্থান এবং পাঠযোগ্যতার সাথে আনুষ্ঠানিকভাবে ছিনিয়ে নেওয়া:

/s{[exch 32 -1 1{1 index{dup 2 32 string cvrs 0 exch{48 sub add}forall 2 index eq{3 1 roll}{pop}ifelse}forall pop}for pop]}def

তারপরে, bits.psএটিতে সংরক্ষণ করা হলে এটি ব্যবহার করা যেতে পারে:

gs -q -dBATCH bits.ps -c '[(%stdin)(r)file 1000 string readline pop cvx exec] s =='
825 3944 11746 15342 15752 16375 19944 21826 28436 28943 32425
[16375 15342 32425 11746 19944 28436 28943 3944 15752 825 21826]

আমি মনে করি এটি কার্যকরভাবে এই পার্লের সমান (এখানে পার্ল এখনও নেই):

sub f{map{$i=$_;grep{$i==(()=(sprintf'%b',$_)=~/1/g)}@_}reverse 1..32}

যদিও এটি পোস্টস্ক্রিপ্টের বিপরীতে সহজেই গল্ফ করা যায়:

sub f{sort{j($b)-j($a)}@_}sub j{$_=sprintf'%b',@_;()=/1/g}

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

2

সি - 124 111

একটি পদ্ধতি হিসাবে প্রয়োগ করা হয়েছে এবং বাছাইয়ের জন্য স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করা হচ্ছে। অ্যারেতে একটি পয়েন্টার এবং আকারটি পরামিতি হিসাবে পাস করা উচিত। এটি কেবল 32-বিট পয়েন্টারযুক্ত সিস্টেমে কাজ করবে। -৪-বিট সিস্টেমে কিছু অক্ষর পয়েন্টার সংজ্ঞা নির্দিষ্ট করে ব্যয় করতে হয়।

পঠনযোগ্যতার জন্য সূচক

c(int*a,int*b){
    int d,e,i;
    for(d=e=i=0;i-32;){
        d+=*a>>i&1;e+=*b>>i++&1;
    }
    return d>e?-1:d<e;
}
o(r,s){qsort(r,s,4,c);}

নমুনা কল:

main() {
    static int a[] ={1, 2, 3, 4, 5, 6, 7, 8, 9};
    o(a, 9);
}

2

জাভা 8: 144

static void main(String[]a){System.out.print(Stream.of(a).mapToInt(Integer::decode).sorted(Comparable.comparing(Integer::bitCount)).toArray());}

প্রসারিত আকারে:

static void main(String[] args){
    System.out.print(
        Stream.of(args).mapToInt(Integer::decode)
              .sorted(Comparable.comparing(Integer::bitCount))
              .toArray()
        );
}

যেহেতু আপনি দেখতে পারেন, এই রূপান্তর করে কাজ করে argsএকটি থেকে Stream<String>, তারপর রূপান্তর একটি থেকে Stream<Integer>সঙ্গে Integer::decode(চেয়ে খাটো ফাংশন রেফারেন্স parseIntবা valueOf), এবং তারপর দ্বারা বাছাইInteger::bitCount , তারপর একটি অ্যারের এটি নির্বাণ, এবং এটি মুদ্রণ।

স্ট্রিম সবকিছু সহজ করে তোলে।

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