Добро пожаловать в кофемолку.
Ваша задача - превратить большие камни в маленькие, размолоть их.
Возьмите вход большого размера n > 3
и размолоть его.
Продолжайте шлифовать камни, бросая их в кофемолку, пока размер всех камней не станет равным 2
.
камни всегда измельчаются в равные ровные половины. Если результат помола нечетный, принять результат - 1.
Распечатайте результаты каждого измельчения, как вы продолжаете.
Примеры
вход: 5
выход: 22
В результате получились два камня размером 2
вход: 50
выход:
2424 //two rocks of size 24
12121212 //four rocks of size 12
66666666 //8 rocks of size 6
2222222222222222
результат - 16 камней размером 2
вход: 30
выход:
1414
6666
22222222
результат - 8 камней размером 2
Это код-гольф, поэтому выигрывает самый короткий код! Удачи и удачи!
code-golf
math
arithmetic
jacksonecac
источник
источник
Ответы:
TSQL,
6159 байтПопробуйте это
источник
COW,
297291 байтПопробуйте онлайн!
Код печатает каждое число в отдельной строке и разделяет итерации дополнительной новой строкой. Он также печатает первую итерацию, за которой следует новая строка. Таким образом, ввод 5 даст вывод, который будет выглядеть,
5 2 2
за исключением символов новой строки вместо пробелов. Пример вывода для50
приведен ниже.Дерево объяснений:
Пример вывода для ввода 50:
источник
05AB1E ,
1211 байтПопробуйте онлайн!
объяснение
источник
Python 2,
5553 байтаРазделите на 4 и сдвиг влево на 1, чтобы получить специальное деление
источник
Haskell,
75 71 60 5047 байтовПопробуйте онлайн! Редактировать: так как вывод теперь может быть списком, включающим ввод, можно сохранить
1013 байтов.Использование:
Оригинальная 60-байтовая версия:
Попробуйте онлайн! Спасибо Кристиану Сиверсу за указание на более короткую формулу.
Использование:
источник
z<-2*div n 4
.JavaScript (ES6)
645957 байтисточник
f=
но только для демонстрацииPython 2,
4847 байтисточник
s=s/4*2
будет работать на 1 байт сохранения.Java, 85 байт
Тестирование и разгул
Примечание: я не знаю почему, Ideone продолжает выдавать внутреннюю ошибку, поэтому тестирование на ней является проблемой. Чтобы проверить, просто скопируйте / вставьте и запустите в вашей стандартной Java IDE. (Там работает, я в этом убедился;))
источник
n=n/4*2
трюк. :)C #,
888683 байтаСохранено 3 байта благодаря Skorm
Сохраненная другие байты путем изменения
while
кfor
цикле , который включает в себя объявления переменныхСохранено 1 байт благодаря Yodle
Анонимная функция, которая возвращает строку, составленную из результата каждого измельчения.
Полная программа с методом ungolfed и контрольными примерами [перед последним редактированием!]:
источник
for(i=0;i++<c;)
for (i = 0; i++ < c;)
n=>{var r="";for(int i,c=2;n>2;c*=2,r+="\n")for(i=0,n=n/4*2;i++<c;)r+=n;return r;}
CJam , 21 байт
Попробуйте онлайн!(Как набор тестов.)
объяснение
источник
Pyth,
181613 байтов*
\n
это новая строкаОбъяснение:
Попробуй здесь
источник
MATL , 13 байт
Попробуйте онлайн!
источник
PHP,
726764 байтаПринимает аргумент из командной строки. Беги с
-r
.источник
Желе ,
13 1211 байтTryItOnline!
Примечание: ОП заявил, что вход также может быть на выходе.
Как?
Версия без ввода отображается для 12 байтов:
:4Ḥḟ0x2µÐĿḊG
источник
Perl,
403530 + 1 = 31 байтБеги с
-n
флагом-4 байта благодаря @Dada
Попробуйте онлайн!
Perl автоматически считывает ввод в переменную,
$_
когда-n
она установлена.$.
это специальная переменная, установленная1
интерпретатором в начале программы, поэтому я могу использовать ее как основу для удвоения. Каждая итерацияwhile
цикла сдвигает бит$_
вниз и выполняет логическое И против самого себя минус один, чтобы исключить биты.источник
perl -nE 'say$_ x($.*=2)while$_=$_>>1&~1'
сыграть в гольф до 31 байта: (возможно, это может быть сделано еще дальше, я не тратил на это много времени).PowerShell 3+,
5854 байтаСпасибо TimmyD за то, что сэкономили мне 4 байта!
Слегка разгромленный (форматирование)
объяснение
Я использую то же умножение на 4, умножение на 2, как и во многих других ответах, но столкнулся с проблемой. PowerShell преобразует числа в числа с плавающей запятой, если это необходимо во время деления, и для игры в гольф это раздражает, потому что
$v/4*2
становится чем-то вроде непристойности[int]($v/4)*2
. Я обошел это, используя битшифтинг для разделения с-shr
.Для расчета количества раз, чтобы напечатать итерацию, я просто выбрал,
(2^$i)-1
которая работает хорошо и имеет дополнительный эффект пропуска входного значения. Попытка просто умножить на 2 была проблематичной, потому что начиная с 0 затрудняет увеличение значения с помощью просто,$i*=2
а начиная с 1 требуется слишком много коррекции, чтобы получить правильное число.Поскольку PowerShell не имеет оператора для этого, и я хотел избежать
[Math]::Pow()
, я снова полагался на сдвиг битов для своих степеней 2.источник
Python 2, 47 байт
Поскольку ОП сказал, что одномерный массив, включающий входные данные, был в порядке, я придумал эту рекурсивную функцию, которая, к сожалению, связана только с текущим победителем Python.
источник
f=lambda r,n=1:[r]*n+(r>3and f(r/4*2,n*2)or[])
для 46Perl, 47 байт
На этот раз без параметров командной строки (необычно для Perl). Основная идея состоит в том, что, поскольку все камни на любом данном этапе имеют одинаковый размер, мы просто записываем размер (в
$a
) и число (в$_
), а не записываем весь список. Я не мог найти способ избавиться от места (или+
) послеsay
; Вы можете переместить,2*
но он не будет анализироваться правильно, если за ним следует открывающая скобка.Я не могу удержаться от ощущения, что это невозможно, но я не понимаю, как это сделать.
источник
die
явно чувствует себя неоптимальным. Но мы по- прежнему нужен способ , чтобы проверить , если нам нужно , чтобы остановить или нет -> а решение использовать какое - то время вместоfor
:while$a>1
. Но нам нужно найти замену$_
: любая унитаризованная переменная может это сделать: заменить1<<$_
на1<<++$x
. Так что теперь$_
можно свободно использовать, затем мы можем использовать-n
и заменить каждое$a
на a$_
, и первая инструкция становится$_>>=1
. Поскольку у нас есть-n
,$.
установлено, поэтому мы можем заменить1<<++$l
на$.*=2
.perl -nE '$_>>=1;say 2*($_>>=1)x($.*=2)while$_>1'
(39 байт). Затем обратите внимание, что$_>>=1
это делается дважды, поэтому мы можем попытаться избавиться от одного (первого). Пытаясь от него избавиться, я получилsay$_ x($.*=2)while($_>>=1)/2>1
(поместил их обоих вwhile
состояние). Но результат неправильный ($_
может быть нечетным), и, пытаясь убедиться, что он четный, я получаю в итогеwhile$_=$_>>1&~1
. Так что код сейчасsay$_ x($.*=2)while($_=$_>>1&~1)
.Vim
6154 байтаTryItOnline!
непечатные:
К счастью, vim автоматически обрезает х / 2.
источник
JavaScript,
71635958 байтНу, я придумал это решение для JavaScript. Абсолютно новичок в гольфе, но я считаю, что это увлекательное испытание
Сохранено 4 байта благодаря предложению Titus с использованием цикла for.
Нежелательная основа:
Гольф версия
Я открыт для предложений, как улучшить его / научиться играть в гольф
тестер ввода
Показать фрагмент кода
источник
for
контуром:for(o=i=30;i>2;console.log(...)){...}
. И, объединив два шлифовальных инструмента в одно, вы можете удалить фигурные скобки:i=i/4<<1;
(-5). Не уверен,i=i/4*2;
что сделаю то же самое.BASH, 81 байт
источник
Swift, 84 байта
Ungolfed
источник
Befunge, 45 байт
Попробуйте онлайн!
объяснение
источник
Javascript, 106 байт
Первый код гольф, думал, что мне пора. (Это не очень хорошо).
Unminified:
источник