Цель
Напишите функцию или программу, отсортирующую массив целых чисел в порядке убывания по количеству единиц, присутствующих в их двоичном представлении. Никаких дополнительных условий сортировки не требуется.
Пример отсортированного списка
(используя 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-битных целых чисел.
Выход
Массив из тех же целых чисел отсортирован, как описано.
счет
Это код гольфа для наименьшего количества байтов, которые будут выбраны за одну неделю.
Ответы:
J (11)
Это функция, которая принимает список:
Если вы хотите дать ему имя, стоит один дополнительный символ:
Объяснение:
\:
: сортировать вниз+/
: сумма"1
: каждый ряд#:
: двоичное представлениеисточник
\:1#.#:
который экономит несколько байтов.JavaScript, 39
Обновление: теперь короче, чем Ruby.
40
Объяснение:
q - рекурсивная функция. Если x или y равны 0, возвращается
x-y
(отрицательное число, если x равно нулю, или положительное число, если y равно нулю). В противном случае он удаляет младший бит (x&x-1
) из x и y и повторяется.Предыдущая версия (42)
источник
~y
работать вместо-!y
?!x|-!y
становится ненулевым.~
на самом деле не подходит, так как он ненулевой для многих входов (включая ноль)Рубин 41
Тест:
источник
Python 3 (44):
источник
Common Lisp, 35
logcount
возвращает количество «битов» в числе. Для спискаl
у нас есть:Как отдельная функция, и на чем я буду основывать подсчет байтов:
источник
Python 3,
90777267 символов.Наше решение принимает входные данные из командной строки и печатает число в порядке убывания (67 символов) или в порядке возрастания (66).
В порядке убывания
Спасибо @daniero , за предложение использовать минус в числе 1, чтобы повернуть его вспять, вместо того, чтобы использовать ломтик, чтобы повернуть массив в конце! Это эффективно спасло 5 персонажей.
Просто чтобы опубликовать его, версия в порядке возрастания (которая была первой, которую мы сделали) будет занимать на один символ меньше.
Восходящий порядок :
Спасибо @Bakuriu за ключ = лямбда-х… предложение. ; D
источник
0
что всегда будет частью вашей продукции; Это не правильно.raw_input()
и не удалять некоторые символы?[]
внутриsorted
. Кроме того, результатом этой программы является число 1 в числах на входе, отсортированных, но вы должны вывести число, которое вы получили на входе, отсортированное по числу1
s. Что-то вроде:print(sorted(input().split(), key=lambda x:bin(int(x)).count('1')))
было бы правильно.JavaScript [76 байт]
где
a
входной массив чисел.Тест:
источник
..
работает? Насколько я понимаю, еслиx = 5
потомeval(x + r)
становитсяeval(5..toString(2).match(/1/g).length)
недействительным, я полагаю. Спасибо.'string'.length
или[1,2,3].pop()
. В случае чисел вы можете сделать то же самое, но вы должны иметь в виду, что после одной точки парсер будет искать дробную часть числа, ожидающего значение с плавающей запятой (как в123.45
). Если вы используете целое число , вы должны «сказать» парсер , что дробная часть пуста, установив дополнительную точку перед адресацию свойства:123..method()
.match(/1/g).length
наreplace(/0/g,"")
.a.sort(function(x,y){r='..toString(2).match(/1/g).length';return eval(y+r+-x+r)})
Mathematica 30
Использование:
источник
к [15 символов]
Пример 1
Пример 2 (все числа 2 ^ n -1)
источник
Mathematica 39
IntegerDigits[#,2]
преобразует число 10 в список 1 и 0.Tr
суммирует цифры.Прецедент
источник
Java 8 -
87/11381/11160/8060/74/48 символовЭто не полная Java-программа, это просто функция (точнее, метод).
Предполагается, что
java.util.List
иjava.lang.Long.bitCount
импортируются, и имеет 60 символов:Если никакие предварительно импортированные материалы не разрешены, здесь это с 74 символами:
Добавьте еще 7 символов, если это потребуется
static
.[4 года спустя] Или, если хотите, это может быть лямбда (спасибо @KevinCruijssen за предложение) с 48 байтами:
источник
Integer.bitCount(x)<Integer.bitCount(y)?-1:1;
? Вам нужно-1,0,1
поведение?<Integer>
с пробелом?Long
, чтобы сэкономить место :)a.sort((x,y)->Long.bitCount(x)-Long.bitCount(y));
Python 2.x - 65 символов (байт)
Это на самом деле 66 символов, 65, если мы сделаем это функцией (тогда вам нужно что-то, чтобы вызвать это, что ламернее представить).
Демо в Bash / CMD:
источник
sum(int(d)for d in bin(x)[2:])
наsum(map(int,bin(x)[2:]))
print sorted(input(),key=lambda x:-bin(x).count('1'))
Матлаб, 34
Ввод в «а»
Работает для неотрицательных чисел.
источник
C - 85 байт (
108106 байт)Портативная версия на GCC / Clang / везде, где
__builtin_popcount
есть (106 байт):Ультраконденсированная, непереносимая, едва функциональная версия только для MSVC (85 байт):
Первая новая строка включена в число байтов из-за
#define
, остальные не нужны.Функция для вызова в
s(array, length)
соответствии со спецификациями.Можно жестко закодировать
sizeof
в переносимой версии, чтобы сохранить еще 7 символов, как это сделали несколько других ответов на языке C. Я не уверен, какой из них стоит больше всего с точки зрения коэффициента полезного использования по длине, вы решаете.источник
sizeof l
сохраняет байт. Ужасно уродливый#define p-__builtin_popcount(
может помочь спасти другого.PowerShell v3,
615853ScriptBlock для
Sort-Object
командлета возвращает массив из 1 для каждого 1 в двоичном представлении числа.Sort-Object
сортирует список по длине массива, возвращаемого для каждого числа.Выполнить:
источник
$f={
является избыточным,while
->for
,-band1
->%2
,-des
->-d
и другие уловки гольфа. Ясно. Можете ли вы объяснить, как работать$args|sort{@(1,1,...,1)}
? Это работает! Как сортировка сравнивает массивы без явного.Count
? где почитать об этом? Благодарность!help Sort-Object -Parameter property
я не знаю, где определено свойство сортировки по умолчанию для типов, но для массивов это Count или Length.$args|sort{while($_){if($_-band1){$_};$_=$_-shr1}}-des
дает неверный результат. Поэтому это не такCount
. Это очень интересно. Еще раз спасибо.ECMAScript 6, 61
Предполагается
z
, что входТестовые данные
Спасибо, зубная щетка за более короткое решение.
источник
z.sort((a,b)=>{c=d=e=0;while(++c<32)d+=a>>c&1,e+=b>>c&1},e-d)
(и спасибо за голосование).R ,
1329694888475735351 байт-20 благодаря реализации J.Doe - еще 2 благодаря Giuseppe
Мой оригинальный пост:
Попробуйте онлайн!
Я попробовал несколько разных методов, прежде чем приступить к этому результату.
Матричный метод: создал матрицу из двух столбцов, один столбец с входным вектором, один из суммы двоичного представления, затем я отсортировал по сумме двоичного.
Нематричный: понял, что я мог бы выбросить матричную функцию и вместо этого создать вектор двоичных значений, суммировать их, упорядочить их, а затем использовать упорядоченные значения для изменения порядка входного вектора.
Небольшие изменения
Больше мелких изменений. Преобразование всего в одну строку кода вместо двух, разделенных точкой с запятой.
Метод Sum Вместо добавления столбцов с
colSums
созданной двоичной матрицейsapply
, я добавил элементы в столбец перед тем, какsapply
«закончить».Снижение к Rev I очень хотел сократить уменьшается, но R пронзительных у меня , если я пытаюсь сократить
decreasing
вorder
функции, которая необходима для того, чтобы получить заказ желательно , как поorder
умолчанию для увеличения, то я вспомнилrev
функцию обратного вектора. ЭВРИКА !!! Последнее изменение в окончательном решении состоялоfunction
в том,pryr::f
чтобы сохранить еще 2 байтаисточник
Хаскелл, 123C
Это первый способ решить эту проблему, но я уверен, что есть лучший способ сделать это. Кроме того, если кто-нибудь знает способ игры в гольф на Haskell, мне было бы очень интересно услышать об этом.
пример
Неуправляемая версия (с объяснениями)
источник
mod
,n`mod`2
? Он имеет тот же приоритет, что и умножение и деление.CoffeeScript (94)
Читаемый код (212):
Оптимизировано (213):
Обфусцирование (147):
Тернарные операторы чрезмерно длинные (129):
Слишком долго, прекрати кастовать (121):
Финал (94):
источник
Smalltalk (Smalltalk / X), 36 (или, может быть, 24)
ввод в; деструктивно сортирует в:
функциональная версия: возвращает новый отсортированный массив:
есть даже более короткий вариант (передача имени или функции в качестве аргумента) в 24 символа. Но (вздох) это будет сортировать самое высокое в прошлом. Как я понял, об этом не просили, поэтому я не воспринимаю это как результат игры в гольф:
источник
PHP 5.4+ 131
Я даже не знаю, почему я беспокоюсь о PHP, в этом случае:
Использование:
источник
Скала, 58
источник
DFSORT (продукт сортировки мэйнфреймов IBM) 288 (в каждой строке исходного текста 72 символа, в первой позиции должен быть пробел)
Просто для удовольствия и без математики.
Принимает файл (может быть выполнен из программы, которая использовала «массив») с целыми числами. Перед сортировкой он переводит целые числа в биты (в 16-символьном поле). Затем изменяет 0 в битах на ничто. Сортировка по убыванию по результату изменения битов. Создает отсортированный файл только с целыми числами.
источник
С
источник
C #,
8889Редактировать: по убыванию добавляет символ.
источник
Javascript 84
Вдохновлен другими ответами javascript, но без eval и regex.
источник
Javascript (82)
источник
Постскриптум, 126
Поскольку список значений, по которым мы сортируем, известен заранее и очень ограничен (32), эту задачу можно легко выполнить, даже если нет встроенной функции сортировки, путем выбора подходящих значений для 1..32. (Это O (32n)? Вероятно).
Процедура ожидает массив в стеке и возвращает отсортированный массив.
Или, ритуально лишенный пробелов и читабельности:
Затем, если он сохранен,
bits.ps
его можно использовать так:Я думаю, что он фактически такой же, как этот Perl (здесь еще нет Perl):
Хотя , что , в отличие от Postscript, может быть легко golfed:
источник
С -
124111Реализовано как метод и используется стандартная библиотека для сортировки. Указатель на массив и размер должны быть переданы в качестве параметров. Это будет работать только в системах с 32-разрядными указателями. В 64-битных системах некоторые символы должны быть потрачены на указание определений указателей.
Отступ для удобства чтения
Образец звонка:
источник
Ява 8: 144
В развернутом виде:
Как вы можете видеть, это работает путем преобразования в
args
aStream<String>
, затем преобразования в aStream<Integer>
соInteger::decode
ссылкой на функцию (корочеparseInt
или илиvalueOf
), а затем сортировкиInteger::bitCount
, затем помещая его в массив и распечатывая его.Потоки делают все проще.
источник