Процитирую этот вопрос на SO (Spoiler alert!):
Этот вопрос был задан в интервью Oracle.
Как бы вы поделили число на 3 без использования операторов *, /, +, -,%?
Номер может быть подписан или не подписан.
Задача решаема, но посмотрите, сможете ли вы написать кратчайший код.
Правила:
- Выполните необходимое целочисленное деление (
/3
) - Не использовать операторы , не основанные на тексте
*
,/
,+
,-
, или%
(или их эквиваленты, такие как__div__
илиadd()
). Это также относится к операторам увеличения и уменьшения, напримерi++
илиi--
. Использование операторов для объединения строк и форматирования в порядке. Использование этих символов для разных операторов, таких как унарный-
оператор для отрицательных чисел, или*
для представления указателя в C, тоже нормально. - Входное значение может быть сколь угодно большим (независимо от того, что ваша система может обработать), как положительным, так и отрицательным
- Ввод может быть на STDIN или ARGV или введен любым другим способом
- Создайте кратчайший код, который вы можете сделать выше
Ответы:
J,
45 4410 символов".,&'r3'":
Работает с негативами:
":
- форматировать как текст,&'r3'
- дописатьr3
до конца".
- выполнить строку, например15r3
источник
3 3 3 #: 9
. Похоже, вам нужно знать, как долго будет длиться ваше троичное число._3]\i.
также возможная отправная точка для чего-то, но я не знаю, будет ли это короче, чем ваше решение здесь. Проблема#_3]\i.
в том, что она есть, в том, что она всегда округляется вверх, а не вниз.##~3=_3#\i.
для 11 персонажей?##~0 0 1$~
.3#.}:(#:~$&3)
но он все еще длиннее и не устраняет проблему отрицательного числа.^:
или Agenda@.
для заменыif
илиif...else
замены. В этом случае вы можете использовать@.
два глагола, связанные с символом «» (герундия на J-языке), чтобы выбрать один или другой в зависимости от условия.С 167503724710
Вот мое решение проблемы. Я признаю, что вряд ли он выиграет в жестком соревновании по коду, но он не использует никаких хитростей для косвенного вызова встроенной функциональности деления, он написан на переносимом языке C (как и требовался оригинальный вопрос переполнения стека), он работает отлично для отрицательных чисел, и код является исключительно ясным и явным.
Моя программа выводит следующий скрипт:
Количество символов: 71 + 39 * 2 ** 32 + 95 = 167503724710
Ориентиры
Был задан вопрос, сколько времени это займет и сколько памяти он будет использовать, поэтому вот некоторые критерии:
./test.py | pv --buffer-size=1M --average-rate > /dev/null
течение около 30 секунд дает скорость около 14,8 МБ / с. Можно предположить, что скорость вывода приблизительно постоянна, поэтому время выполнения до завершения должно составлять около 167503724710 B / (14,8 * 1048576 B / s) ≈ 10794 с../test.py | tcc -c - -o /dev/stdout | pv --buffer-size=1M --average-rate > /dev/null
, но, похоже,tcc
ничего не выводится, пока не прочитает весь исходный файл.источник
a[b]
это синтаксический сахар*(a + b)
, который делает дополнение.Ruby 28
Чтобы разделить на 3, нам просто нужно удалить конечный ноль в базовом числе 3:
120 -> 11110 -> 1111 -> 40
Работает с негативами:
Руби,
6045В качестве альтернативы, без использования базового преобразования:
d = -> n {x = n.abs; r = (0..1.0 / 0) .step (3) .take (x) .index x; n> 0? r: -r}источник
/
оператор, гдеFloat::INFINITY
стал1.0/0
. С Ruby 2.1 можно играть(0..1.0/0).step(3)
в гольф0.step(p,3)
, удаляя/
. Большая проблема в том, что-r
используется-
для отрицания. Это стоит 5 символов , чтобы изменить-r
к~r.pred
, злоупотребляя Integer # пред вычитать 1 без оператора вычитания.Mathematica, 13 символов
источник
&
и использовать обычную переменную (другие тоже делают это).JavaScript, 56
Создает строку длины
n
повторения,
s и заменяет,,,
на1
. Затем он измеряет полученную длину строки. (Надеюсь, унарный-
допускается!)источник
-
оператор отрицания.-~
наparseInt()
-~prompt()
единицу больше, чемparseInt(prompt())
. Не уверен, как ты справишься с этим.alert(Array(parseInt(prompt())).slice(1).join().replace(/,,,/g,1).length)
Питон,
4138xrange
кажется, может обрабатывать большие числа (я думаю, что предел такой же, как для длинной в C) почти мгновенно.источник
10/3
равно 3, а не 4.print" -"[x<0]+
len (range (2, abs (x), 3)) `` сбрит его до 39 символовlen()
качестве сокращения дляrepr()
range
, потому что это на самом деле создаст список.xrange
просто притворяется, поэтому он может обрабатывать огромные числа, не тратя время и память.Хаскелл, 90
106Создает бесконечный (ленивый) список поиска
[(0,0),(0,0),(-1,0),(1,0),(-2,0),(2,0),(-3,-1),(3,1), ...]
, обрезает все элементы, которые не совпадаютn
(/=
это неравенство в Haskell), и возвращает первый, который соответствует.Это становится намного проще, если нет отрицательных чисел:
25
27просто возвращает
n
элемент th списка[0,0,0,1,1,1,2, ...]
.источник
C #, 232 байта
Мой первый гольф-код ... И поскольку не было никакого C #, и я хотел попробовать другой метод, который здесь не пробовал, подумал, что я попробую. Как и некоторые другие здесь, только неотрицательные числа.
Ungolfed
источник
string[] g
, превратив его вstring[]g
.Add
?Perl (
2622)Эта версия (ab) использует движок регулярных выражений Perl. Он читает число как последний аргумент командной строки (
pop
) и создает строку3
s этой длины ("3" x $number
). Оператор подстановки регулярных выражений (s///
здесь пишется с разными разделителями из-за правил головоломки и сg
флагом lobal) заменяет три символа пустой строкой и возвращает количество подстановок, которое представляет собой входное число, деленное целым числом на три. Можно даже написать без3
, но вышеприведенная версия выглядит смешнее.источник
$_=3x pop;say s|333||g
.'$_=3x pop;say s|333||g||0
. Медленно с большими числами, такими как 99999999, и не работает с отрицательными числами.-p
в командной строке, и вы можете сделать:$_=3x$_;$_=0|s|...||g
в общей сложности 22, в том числе охват 0, 1 или 2 входа.C 160 символов
Символьное решение с длинным делением с использованием справочных таблиц, т.е. без строки atoi () или printf () для преобразования между строками 10 и целыми числами.
Выходные данные иногда включают ведущий ноль - часть его очарования.
Примечание:
Тестирование:
источник
Python 42
Так как каждое решение, опубликованное здесь, которое я проверил, усекает десятичные дроби здесь, это мое решение, которое делает это.
Python
5051Поскольку python выполняет разделение по полу, вот мое решение, которое реализует это.
Входное целое число находится в переменной x.
Протестировано в Python 2.7, но я подозреваю, что оно работает и в 3.
источник
-3
это правильный ответ-10/3
.JavaScript, 55
Если никто не может использовать
-1
, то вот версия, заменяющая его~0
(спасибо, Питер Тейлор!).источник
~
- побитовый оператор, который инвертирует биты операнда (сначала преобразуя его в число). Это самый короткий способ преобразовать строку в число (насколько я знаю).~~
преобразуется в целое число, в отличие от+
.Символы C 83
Число для деления передается через stdin и возвращает его как код выхода из
main()
(% ERRORLEVEL% в CMD). Этот код злоупотребляет некоторыми версиями MinGW тем, что, когда оптимизация не включена, он обрабатывает последнее значение присваивания как оператор возврата. Вероятно, это может быть немного уменьшено. Поддерживает все номера, которые могут вписаться вint
Если унарное отрицание (-) не разрешено: (129)
Если унарный NEGATE IS разрешается: (123)
РЕДАКТИРОВАТЬ: Угорен указал мне, что - ~ это приращение ...
83 символа, если разрешено унарное отрицание: D
источник
x+3
есть-~-~-~x
.С, 139 символов
Запустить с номером в качестве аргумента командной строки
Тестирование:
Редактирование:
источник
A
, моя функция просто проверяет бит i в числе n. Стандарт C позволяет опускать объявления типов или это что-то компиляторное?ЗШ -
3120/21Для отрицательных чисел:
С отрицательными числами (ZSH +
bc
) -6261Я, вероятно, не должен давать в качестве ответа две программы, поэтому вот одна, которая работает для любого знака числа:
Здесь используется тот же базовый трюк преобразования, что и в ответе Артема Айса .
источник
C
8173 символаПоддерживает только неотрицательные числа.
Идея состоит в том, чтобы использовать арифметику указателя. Число читается в указатель
x
, который никуда не указывает.&x[~2]
=&x[-3]
=x-3
используется для вычитания 3. Это повторяется до тех пор, пока число больше 2.i
подсчитывает, сколько раз это было сделано (&i[1]
=i+1
).источник
Ява
8679Предположим, что целое число находится в y:
Преобразует в строку в базе 3, удаляет последний символ (правый сдвиг «>>» в базе 3), затем преобразует обратно в целое число.
Работает на отрицательные числа.
Если число, у, <3 или> -3, то это дает 0.
Впервые выложить на код гольф. =) Так что пока не могу комментировать.
Спасибо Кевину Круйссену за советы.
источник
&&
до&
и 2 разаInteger
доLong
. (Кроме того, почему вы используете~2
вместо просто-3
? Они имеют тот же счетчик байтов.)-
, но я не знаю, считается ли это унарным отрицанием.Python2,6 (
29) (71) (57) (52) (43)Edit - только что понял, что мы должны обрабатывать и отрицательные целые числа. Это исправлю позже
Edit2 - исправлено
Edit3 - сохранил 5 символов, следуя советам Джоэла Корнетта
Edit4 - так как ввод не обязательно должен быть из STDIN или ARGV, сохраненные 9 символов, не принимая никакого ввода из STDIN
источник
abs()
print z if x==abs(x) else -z
print (z,-z)[x<0]
Javascript,
4729Используется
eval
для динамического создания/
. Используется+
только для объединения строк, а не для сложения.РЕДАКТИРОВАТЬ: используется
"\57"
вместоString.fromCharCode(47)
источник
alert(eval(prompt()+"\573"))
?Рубин (
432217)Не только гольф, но и элегантность :)
Выход будет как
(41/1)
. Если оно должно быть целым числом, мы должны добавить.to_i
к результату, и если мы изменимto_i
на,to_f
то мы также можем получить выходные данные для чисел с плавающей запятой.источник
rational
строки require на Ruby 1.9.3. Пропуск скобок экономит еще один символ .TI-Basic, 8 байтов
Победитель? :)
PS Округляет бесконечность для отрицательных чисел (см. Здесь, почему). Вместо округления до нуля замените
int(
наiPart(
для каких - либо изменений байт.Контрольные примеры
источник
Python 2.x,
545351print' -'[x<0],len(range(*(2,-2,x,x,3,-3)[x<0::2]))
Где
_
дивиденд и вводится как таковой.Примечание: Не уверен, разрешено ли использование интерактивного переводчика, но согласно ОП: «Ввод может быть на STDIN или ARGV или введен любым другим способом»
Редактировать: теперь для Python 3 (работает в 2.x, но печатает кортеж). Работает с негативами.
источник
__len__
достаточно.len(range(100,1000))
дает900
в 3.2.3 на Linux.len(xrange(0,_,3))
любом случае короче и намного быстрее.С ++, 191
С основным и включает, его 246, без основного и включает, это только 178. Новые строки засчитываются как 1 символ. Обрабатывает все числа как без знака. Я не получаю предупреждений о том, что main возвращает unsigned int, так что это честная игра.
Моя первая в истории подача кодагола.
использует сдвиги для повторного деления числа на 4 и вычисления суммы (которая сходится к 1/3)
псевдокод:
Кроме того, я мог бы исключить метод main, назвав d main и заставив его взять символ ** и используя в качестве выходных данных программы возвращаемое значение. Он вернет число аргументов командной строки, разделенное на три, округленное в меньшую сторону. Это приводит его длину к рекламируемому 191:
источник
Golfscript - 13 символов
источник
s/seem to //
:(. Мне нужно подумать об этомPowerShell 57 или 46
В 57 символов используется
%
в качестве оператора foreach PowerShell, а не по модулю. Это решение может принимать положительные или отрицательные целые числа.Если
*
в качестве оператора повторения строк допустимо использовать 46 символов , не умножайте. Эта опция требует положительных целых чисел в качестве входных значений.источник
р
Они работают только с положительными целыми числами:
Или же:
Или же:
Или же:
[[EDIT]] И уродливый:
[[EDIT2]] Плюс, наверное, лучший - вдохновлен кодом Matlab выше Эллиотом G:
источник
wrong sign in 'by' argument
SmileBASIC,
585136 байт (без математических функций!)Объяснение:
Программа плавно перемещает фоновый слой на 3 кадра, а затем получает угол после 1 кадра, когда он прошел 1/3 своего общего расстояния.
Версия деления поплавка, 38 байт:
Объяснение:
источник
Haskell
4139 символовРаботает с полным набором положительных и отрицательных целых чисел
Сначала создается список 1 или (-1) (в зависимости от знака ввода) для каждого третьего целого числа от 0 до ввода
n
.abs(n)
для отрицательных чисел включительно.например
n=8 -> [0,3,6]
Затем он возвращает сумму этого списка.
источник
Clojure, 87; работает с негативами; основанный на lazyseqs
Ungolfed:
источник
Тетрадь мудреца (21)
источник