Вдохновленный злополучной сортировкой чисел без чисел без использования массива , но я подумал, что это делает гольф лучше, чем SO вопрос.
Учитывая положительное целое число, сортируйте цифры в этом целом числе.
Самый низкий балл побеждает!
- Начните с 0 баллов.
- Добавьте одно очко за каждого персонажа.
- Добавьте 20 точек для каждого массива, который вы используете.
- Добавьте 10 баллов за каждую многосимвольную строку в вашем коде. (За исключением начального ввода, если он преобразуется в целое число без каких-либо других операций над ним.)
- Добавьте 32 балла, если максимальное количество цифр, которое может обработать ваша программа, ограничено вашей программой (в отличие от машины).
- Вычтите 10 баллов, если ваш код может изменить направление сортировки при заданном другом аргументе (что угодно, но, например, 0 для сортировки по убыванию и 1 для возрастания.)
Каждый язык индивидуален, но идея состоит в том, чтобы избежать любого вида взлома с многозначными числами.
Пример:
Ввод : 52146729
Выход : 97654221 или 12245679
Примечания:
- Используйте любые встроенные возможности сортировки, которые обеспечивает ваш язык программирования, но если эта функция сортировки включает строки или массивы, возьмите штраф!
- Вы можете написать решение как функцию, которая принимает целое число напрямую, или как программу, которая принимает аргумент из argv, файла или потока и преобразует его в целое число. До тех пор, пока вы немедленно преобразуете его в целое число и отбрасываете исходный ввод char * без каких-либо дополнительных операций с ним, штраф не применяется.
- Штрафы применяются не только к строковым литералам в тексте вашей программы, но и к любой части функции вашей программы, которая может вводить или выводить строку или итерацию. Например, JavaScript
String.prototype.split
имеет по крайней мере одну строку в качестве input (this
) и Array в качестве вывода, поэтому +30 за использование этого. - Я пытался заставить эти правила руководствоваться принципом разработки алгоритма, а не начальным / конечным вводом / выводом (следовательно, примечание № 2). Я не думаю, что наказание должно применяться,
int(input())
даже еслиinput
подпись говорит, что она возвращает строку, если это выражение является начальной точкой входа в программу. Аналогично, если конечный результат программы являетсяprint(x)
иx
должен быть строкой, штраф не применяется к операции приведения строки последнего шага. Несмотря на все сказанное, я явно никогда не говорил, что это должна быть программа или откуда ввод / вывод. Функция, которая принимаетint
и возвращает,int
будет служить, и не будет страдать от этих двусмысленностей.
code-challenge
sorting
Кодзиро
источник
источник
" "
рассчитывать как мульти строку символов? Один персонаж не будет считаться «мульти» ...Ответы:
GolfScript,
114(4 + 10 (строка) - 10 (обратная опция))
Ввод на STDIN.
Формат ввода такой:
1
сортировать нормально,-1
чтобы поменять. 4 символа - 10 для обратного варианта = оценка -6.Технически это строка, поэтому я не уверен, считается ли это +10. Я интерпретирую правило как «строку, объявленную в вашей программе» (так как она говорит «в вашем коде»).
Старый ответ (оценка 11):
источник
~
немедленно преобразует в целое число. Но затем он преобразуется обратно в строку с`
. Есть ли преобразование в число строк? Потому что иногда строка может быть неchr
), это нормально.Haskell 106
пример:
Ответ, который не уклоняется от вопроса.
Было запрошено объяснение, здесь оно не разгадано. Это очень неэффективная пузырьковая сортировка.
В Haskell существуют более короткие ответы, эквивалентные другим опубликованным, например:
... оценка 52 + 20 = 72, или 45, 20 = 65:
... но суть вопроса - без массивов, строк или символов - более интересна.
источник
Integer.MAX_VALUE
-it принимаетint
. Mine, и некоторые другие, принимать любой размер ввода-тип входного сигналаs
ISInteger
, что эквивалентно вBigDecimal
языке Java. Это не то, что я принял за вопрос, хотя, я думал, что это наказание за ответы, которые «сортируют» только однозначные числа.C + x86 сборка, 636
Я знаю, что это не победит, но это было настолько неестественно и извращено, что я должен был поделиться этим. Нет массивов или строк (если вы не учитываете входные аргументы). Количество цифр ограничено 32-битным диапазоном.
Итак, вот небольшое объяснение того, что я сделал:
Я думал, что сделаю это без использования каких-либо массивов или строк, и тогда в голову пришла рекурсия, но, конечно, с рекурсией я не смог бы поменять значения с других рекурсивных вызовов ... и тогда я понял, что был способ. Связывая мою C-программу с функцией сборки, я могу подпрыгнуть в стеке и вернуть указатель на базовый указатель нужного вызова, это то, что делает функция «recursionStackAt». Конечно, recursionStackAt - очень уродливая функция, ее результат зависит не только от состояния ввода или программы, но и от самого вызывающего. Обратите внимание, что именно это заставило меня изменить индексы с 0 на 1.
Без дальнейших церемоний, вот код:
И, конечно, код сборки x86 (AT & T sintax, btw) для функции recursionStackAt:
Некоторые примеры на выходе: (1 означает увеличение и 0 уменьшение)
Вот запутанная версия (которая не читается, но работает нормально):
http://pastebin.com/XkYt9DLy (код C) http://pastebin.com/h0S0dfeU (код x86)
Так что, если LibreOffice не врет, мой запутанный код состоит из 646 символов (без пробелов, я должен их считать?), И при выполнении всех остальных условий я получаю -10 для увеличивающегося / уменьшающегося выбора.
О, и для компиляции вы должны это сделать (на Unix-подобных системах)
Обратите внимание, что флаг -m32 используется только в том случае, если вы работаете на 64-битной машине. Вам также нужны 32-битные библиотеки для его компиляции.
источник
Баш (эхо) (0 + 7 + 0 + 0 + 32-10) = 29
Сорта:
Использование:
Используйте "-e" для сортировки в обратном порядке:
РЕДАКТИРОВАТЬ: изменил «кошка» на «эхо», чтобы он действительно работал. РЕДАКТИРОВАТЬ 2: Добавил "$ *" и поместил его в сценарий "Сорта"
источник
-e
может использоваться в качестве аргумента для обратного вывода.python3
Возможности моего скрипта:
Нет массивов
Нет строки
Сложность - O (n): я использовал счетную сортировку (измененную мной, чтобы не использовать массивы, а простые числа для подсчета вхождений)
Нет ограничений по размеру
Персонажи:
260234источник
P
можно написатьlambda l:((((29-6*l%2,19-2*l%2)[l<9],13-2*l%2)[l<7],2*l-1)[l<5],2)[l==1]
, сбрив довольно много символов. Возможно, я немного испортил это, но идея состоит в том, чтобы использовать вложенную версию старой школы Python (до того, как у Python была тройка)(false_result, true_result)[boolean]
.Bash + coreutils, 14 (24 символа - 10 для реверса)
Я думаю, что это может немного нарушить правила, но здесь пятница ...
Я предполагаю, что использование стандартных библиотек разрешено. Моя интерпретация стандартной библиотеки для
bash
IScoreutils
:Ввод от стандартного ввода. В использовании:
источник
bash
идеей целых чисел (объявите -i). Ред.tr
не нравится ваш синтаксис, который стоил бы вам одного символа в этих системах.) В любом случае, я бы сказал, что в глубине души это все еще строковые операции.declare -i
не делает имя целым числом, оно просто заставляет оболочку использовать арифметический контекст для него в правой части выражений присваивания.C - 64 символа, 64 балла
Вы можете удивиться, как я могу заставить это работать без заголовков. Просто, скомпилируйте с:
Un-golfed:
Я также решил включить сортировку символов, просто потому, что мог.
Тестовые прогоны:
источник
main(int a,char**b){b++;qsort(*b,strlen(*b),1,strcmp);puts(*b);}
что в любом случае короче.c(*a
, моя версия gcc настаивала на том, что нам нужно было сделатьc(char*a
вместо этого.функция c (арка с прямым порядком байтов),
131108 символовНи одна задача сортировки не обходится без ответа спящего . Этот возврат займет до 10 секунд, но он работает, и я думаю, что он полностью соответствует спецификации. Эта функция принимает один параметр типа int и возвращает int с отсортированными десятичными цифрами:
добавлены новые строки и отступы для удобства чтения
Звоните следующим образом:
источник
?:
вместоif-else
.fork()?c++:(sleep(d),exit(d));
(,)
.Ява: 262 балла
Да, да, я знаю, это безнадежно, но все же ..
Анализ (маркировка):
StringBuffer
(я использовал его , потому что это меньше , чемStringBuilder
) (оценка = 262 + 10 = 272)Использование:
Когда вы пытаетесь скомпилировать
G.java
файл в командной строке, он создает чертовски много проблем (ошибок). Итак, решение?Затем этот класс должен вызываться
main()
методом из любого другого класса (или даже самого этого класса). Я помещаю это в другой класс, так что я не добавляю его в число своих персонажей. Скомпилируйте другой класс аналогичным образом (без использованияcmd
). Теперьmain()
метод в другом классе должен выглядеть примерно так:Исключая ненужные пробелы, комментарии и разрывы строк, это еще 93 символа. Я не добавляю это к своему персонажу, потому что это только для демонстрации через консоль.
Выход:
НОЛЬ, т.е.
0
считается. Предположим, что внешний класс естьHelper.java
, и он был успешно скомпилирован, несколько примеров через консоль:Когда изменено на
0
то есть, по убыванию ...ПРИМЕЧАНИЯ:
G.java
. Это основной класс.Integer.MAX_VALUE
потому что это максимальный размер любого массива может содержать (в Java).источник
TeX / LaTeX (332)
Если фактический код помещен в пакет
s
, то основной файл LaTeX выглядит красиво и легко. Число просто дано как математика. Если число отрицательное, порядок сортировки меняется на противоположный. Код пакетаs
может также использоваться с простым TeX, пример ниже.Пакет
s
(одна строка, конец строки не нужен):Результат:
Оценка: безнадежно
Используя обычный TeX с
etex
илиpdftex
, файл может быть уменьшен до:<contents of s.sty>\rm\shipout\hbox{$<number>$}\bye
Байт: 318 байт (
s.sty
) + 24 байта для остатка без номераМассивы не используются: 0
Я не вижу многосимвольных строк: 0
Количество не ограничено алгоритмом. Наибольшее число TeX составляет 2 31 - 1 = 2147483647. В примере используется 66-значный номер, намного больше: 0
Если задан минус, то порядок сортировки возвращается к убыванию: −10
0 + 318 + 24 + 0 + 0 - 10 = 332
Алгоритм:
Цифры становятся активными символами в математическом режиме. Каждая цифра запоминает и собирает каждое использование в макросе. После математического режима макросы выводятся с цифрами в порядке возрастания.
Изменение направления осуществляется с помощью текста справа налево, функции e-TeX.
Degolfed версия кода в
s.sty
Размножение
Есть несколько онлайн-компиляторов LaTeX, список которых можно найти здесь . Я попробовал первый элемент в списке, сервлет LaTeX на Sciencesoft.at . Его можно использовать без подписи, а также создавать постоянные URL-адреса: источник и результат в виде изображения .
источник
С - 65
Проницательный наблюдатель заметит, что этот алгоритм сортировки выполняется за O (n) по числу цифр в
n
.Прагматичный наблюдатель заметит, что этот алгоритм сортировки работает во времени, пропорциональном диапазону целых чисел со знаком на платформе, что он изменяет глобальное состояние, которое должно быть повторно инициализировано между прогонами, и что многие другие жертвы были сделаны в пользу краткости.
Версия без заглатывания не совсем эквивалентна, но лучше передает действительный алгоритм.
Вот тестовый комплект для функции:
источник
Haskell - 96
96 символов, без массивов, без строк, без целочисленного ограничения, не может изменить
Примеры:
Это сортировка вставкой, выполняемая непосредственно над самими целыми числами. Это похоже на другую запись в Haskell, которая является пузырьковой сортировкой, хотя я клянусь, что работал над ней до того, как увидел ее.
Краткое руководство:
d
делит число на единицы и десятки, то есть:d 135
это пара(13,5)
a%x
сортируется вставка цифрыa
в номерx
a&x
сортируетx
, вставляя цифру единиц вa
и возвращая на результат и остатокs x
сортирует х, начиная&
рекурсию на 0 иx
Хитрость в том, что второй аргумент
%
и&
неx
напрямую, аx
divMod используетd
источник
Python3,3 61 балл
Эта программа принимает входные данные в виде строки, которая считается строкой, поскольку она не изменяется сразу на целое число. +10
Строка сортируется в массив +10
Этот массив объединен в строку +10
Примечание:
''
используется для объединения содержимого буев не несколько строк символа, поэтому +10 не добавляются к счету.Программа состоит из 31 символа. +31
31 + 10 + 10 + 10 = 61 балл
источник
print(int(''.join(sorted(input()))))
, но приведение к целому числу только добавило точек и не заставило код следовать правилам ближе. Я действительно не остался верным вызову, я полагаю. Но он утверждает, что ввод может быть строкой, а вывод - строкой (для операторов print), и ничего не говорит о промежуточном:]J, 10 символов (+ 1 строка) = 20
Использование:
Работает для всех 32-битных чисел.
Объяснение:
/:~
отсортировать&.
по":
формату. Моя предыдущая версия также использовала массив, но он дорогостоящий, поэтому теперь мне нужно просто использовать строку и отсортировать символы по алфавиту.":
преобразует число, которое вводится в строку и/:~
сортирует цифры в порядке возрастания. Поскольку сортировка выполняется в формате «под», по завершении сортировки строка преобразуется обратно в число. Добавление возможности обратного хода, вероятно, будет стоить дороже, чем экономит, поэтому я не стал беспокоиться.Можно привести аргумент, что, поскольку J, как и APL и K, является языком на основе массива, единственный вход - это массив из 1 элемента, но я решил не использовать такой резкий взгляд при расчете моей оценки.
32-битный лимит налагается J, а не моей программой. Чуть выше и J переводит числа в научную запись. Из вопроса не ясно, применяется ли 32-очковое наказание в этом случае, но даже если применяются оба предыдущих наказания (я не думаю, что они должны), счет возрастает до 72 и все еще комфортно превосходит подавляющее большинство других ответы.
источник
Python 2.7: 174
Он работает путем создания словаря, отображающего все 10 цифр в 0. Затем он выполняет итерацию по длине числа (
log10(i)
), извлекая каждую цифру ((i / (10 ** c)) % 10
) и увеличивая счетчик для этой цифры в словаре. Наконец, он создает строку, созданную путем перебора всех 10 цифр и для каждой цифры, дающей один экземпляр цифры в виде строки.Я мог бы изменить последнюю строку на
print"".join(d[n]*str(n)for n in xrange(10))
16 символов меньше, но использовал бы многосимвольные строки.источник
i=int(input())
может быть так же,i=input()
какinput()
автоматически убирает номер.C (до C90)
или C ++,7866 балловФункция так сортировать целое число называется
s
.Подсчет очков:
int
) (+0)Старая версия (78 баллов, работает также с C ++ и более современными версиями C)
источник
C # - 179
Un-golfed
Тестовое задание
Обычный:
Перевернутый:
Баллы: (надеюсь, я правильно понял систему баллов - не стесняйтесь исправлять)
C # с LINQPAD - 123
Тестовое задание
Обычный:
Перевернутый:
Точки:
источник
Java 1469
Решение без строк и массивов в Java. 1437 символов + 32, потому что в качестве входных данных используется только значение Long.MAX_VALUE. Используя Double, я мог использовать более 300 цифр, но это было бы слишком утомительно для реализации. Для чего-то большего, чем это, потребуются BigInteger и AFAIK, которые используют массивы внутри. Если вы используете менее 19 цифр для входа, выход будет иметь начальные нули. Отрицательный ввод даст все нули, а все, что не является числом, вызовет исключение.
Для того, что я использовал, я использовал самый простой способ, так что он довольно неэффективен. (должно быть O (n * n))
Я знаю, что это не совсем то же самое, что решения на других языках, но я чувствую, что это, по крайней мере, самое короткое, что я могу получить на Java. (если кто-нибудь знает, как сделать это еще короче, не стесняйтесь редактировать / комментировать)
источник
AWK - 101
Файл 'x':
Бег:
Единственным используемым массивом является ARGV, и это не помогает в сортировке, это только доступ к параметрам командной строки, и эти значения находятся в переменных, не являющихся массивами, где фактически необходимо для вычислений. Я думаю, что это не считается против этого решения. Следующий расчет не учитывает ARGV-массив:
111 (символы) - 10 (можно сделать наоборот)
источник
Я ничего не вижу в сортировке функций в вопросе, так что ... (я собираюсь удалить ответ, если он изменит или нарушит правила, дайте мне знать)
JavaScript
5696JavaScript
69109 (обратимый)Может быть немного проигран, используя функции стрелок EcmaScript 6 :
ES6
5090ES6
63103 (реверсивный) (73-10)источник
prompt
возвращает строку (которую вы не сразу конвертируете в целое число): +10;split
возвращает массив: +20;sort
выполняет сортировку на месте (так что это все тот же массив);join
возвращает новую строку, +10. Всего: 96.САС 67 символов (оценка 67 или 107)
Это использует пузырьковую сортировку для краткости. Оценка будет равна 107, если каждый шаблон регулярного выражения и замена будут считаться строкой (т.е. 67 + (10 * 4))
Количество обрабатываемых цифр ограничено памятью (и, возможно, терпением)
источник
Лямбда-функция Python (обратимая), 69
n
(входные) и''.join(...)
(+20)sorted(...)
(+20)d
(-10)Лямбда-функция Python (необратимая), 67
РЕДАКТИРОВАТЬ: ввод должен быть строкой. Я рассматриваю наказание за использование этой строки напрямую.
источник
raw_input([prompt]) -> string
, чтоsorted(raw_input())
равно +10. Тожеsorted -> new sorted list
так +20. ТогдаS.join -> string
снова +10. Нотация среза также подразумевает строки, поэтому +10 (все остальное, поддерживающее нотацию среза, возможно, будет +20). Поэтому я рассчитываю 73 и 108 соответственно.print
s вместоreturn
ing?lambda
здесь.)print
она короче и не требует упаковщиков. Я не знал, что вы позволите лямбда-функции. Что-то вроде лица, когда я читал это. Теперь это правильно?''.join(sorted(str(n)))
Не могли бы вы сказать мне, почему это не будет рассматриваться как ответ? Я новичокCommon Lisp - 126
Негольфифицированная (стилистически, а также лексически, но функционально идентична) версия:
Цифры отрицательного числа обрабатываются как имеющие отрицательное значение, а цифры сортируются с наименьшей значимостью вначале (т. Е. С прямым порядком байтов). Примеры:
В версии для гольфа есть 136 символов, включая пробелы. Он не использует строк и массивов и обрабатывает целые числа произвольной точности, включая отрицательные целые. Сортировка параметризована на двоичном предикате, который определяет общее упорядочение целых чисел
[-9, 9]
, включая, но не ограничиваясь,<
и>
:Это дает оценку 126.
источник
JavaScript 416/185
Нет массивов, нет строк, нет ограничений произвольной длины ...
Но для сортировки вверх / вниз потребовалось бы более 10 символов ^^ Но мне показалась интересной идея подсчета цифр и их печати - может быть, кто-то сможет использовать эту идею в GolfScript и выиграть приз ;-)
Тот же код короче, с использованием eval: (но это, вероятно, будет рассматриваться с использованием строк ...)
источник
С (222)
Точки:
-10 (сортирует в обратном порядке, если число (argv [1]) отрицательно)
= 222 балла
Флаги, необходимые для избавления от 1000 предупреждений компилятора:
gcc -Wno-implicit-function-declaration -Wno-return-type -Wno-implicit-int -Wno-char-subscripts -o count2 counta2.c
«Лучше» читабельно:
Немного негольфя
источник
"%""i"
вместо"%i"
? Они сводятся к одному и тому же, так что вы просто тратите два символа.Есть ли причина, по которой я не вижу это решение уже?
Рубин
Я не уверен, как это оценить. Разделение будет генерировать массив, но кроме этого не уверен .. 38 символов + 2x20 для массивов? Или он должен включать все массивы, которые сортировка может создавать внутри?
источник
VBScript - 76 (96?)
66 символов + 10 для использования строки
n
(не знаю, считается ли использование
replace
функции иstring
функции, которая возвращает n символов x, дополнительной строкой).Он подсчитывает количество определенной цифры, сравнивая длину исходной строки с той же строкой с заменой определенной цифры. Затем он присоединяет это количество цифр к n.
источник
Python 3 для сна (168)
С абсолютно без списка или цикла, только генераторы.
возможно, может быть улучшено.
источник
Ракетка 97
97 баллов (87 +20 для двух строк, -10 для сортировки, без массивов)
Здесь используются списки символов, поэтому вам нужно назначить ему функцию сравнения символов, например
char<?
илиchar>?
. Я чувствую, что это также выглядит как безвкусица, так как это не так много, как добавить пробелы и увеличить имена переменных. Моя старая версия, возможно, более почетная :)Старая версия без строк:
110 точек (120 байт (utf-8) - 10 для изменения порядка сортировки. Он не использует ни строк, ни массивов)
Ungolfed:
Я проверил это с сотым тысячным числом Фибоначчи:
И то же самое в обратном порядке:
источник