Кратчайший способ изменить номер

31

Напишите функцию (или эквивалентную подпрограмму), которая будет принимать один целочисленный аргумент и возвращать найденное (аналогично типизированное) значение путем изменения порядка десятизначных цифр аргумента.

Например, дано 76543, возврат 34567.

dmckee
источник
6
Вернитесь к тому времени, когда число было строкой, затем переверните строку
pmg
2
Идея «кратчайшего алгоритма» несколько призрачна, особенно если вы разрешите «любой язык». Придумайте алгоритм, и я дам вам DSL с соответствующим оператором «~» ...
3
Просто обратите внимание: любое число, заканчивающееся на 0, при обращении становится короче числа цифр ...
powtac
44
Я знаю алгоритм, который совсем не требует времени , но работает только с палиндромными числами;)
schnaader
Нашел время заняться переписыванием сам. Я надеюсь, что это останется загадкой, которую Элтонд хотел изложить.
dmckee

Ответы:

85

HTML 21 7 символов (1 символ, если я дерзкий ...)

‮n

заменить nна свой номер

Грифон
источник
1
Это просто гений. Я бы пошел за один символ. Или 2, поскольку он кодирует два байта в UTF-16: P
tomsmeding
17
Хахаха Я сделал поиск Google по этому тегу и был вознагражден Your search -‮ - не соответствует ни одному документу.
JoeFish
Вы можете попробовать эту ссылку в браузере:data:text/html,&%238238;egnahcxEkcatS olleH
F. Hauri
3
Смешно в гугл трансат тоже. @JoeFish: я не могу воспроизвести, пожалуйста, разместите ссылку!
F. Hauri
1
@JoeFish Когда я смотрю на комментарий, ваше имя пользователя переворачивается и после него появляется текст. txet emos si ereH
Stefnotch
32

питон

int(str(76543)[::-1])

РЕДАКТИРОВАТЬ:

Более короткое решение, предложенное @gnibbler:

int(`76543`[::-1])

или, если выше неясно:

x=76543
int(`x`[::-1])
Вейдер
источник
4
s[::-1]намного быстрее чем''.join(reversed(s))
riza
4
Вы можете использовать backticks (для repr) вместо использования str
gnibbler
@gnibbler Спасибо за предложение. Я обновил свой ответ.
Вейдер
2
TBH, это не функция / процедура / как бы вы это ни называли, а спецификации этого требуют.
Томас Эдинг
Кроме того, он даже не принимает значение ...
Exelian
28

Универсальный ( независимый от языка / независимый )

Если вы хотите использовать только числа (избегайте преобразования числа в строку) и не хотите использовать какую-то определенную библиотеку (универсально для любого языка):

x = 76543 # or whatever is your number
y = 0
while x > 0:
    y *= 10
    y += ( x %10 )
    x /= 10 # int division 

Это python, но это можно сделать на любом языке, потому что это всего лишь математический метод.

Кирилл Киров
источник
Если вы замените modна %, это действительно Python;)
phihag
Вы правы, на самом деле :) 10x
3
Не самый короткий, но самый распространенный и универсальный.
Кирилл Киров
3
y=y*10+x%10....
st0le
1
BrainFuck нет, хотя это можно рассчитать. Любой язык, который не имеет его, может использовать a - (n * int(a/n))вместо a mod n. Кроме того, если вы посмотрите здесь , операция модуля реализована по-разному в каждом языке. (См. Таблицу справа.)
mbomb007
13

Perl 6

+$n.flip

или:

$n.flip

для динамически типизированного кода.

Числа получили строковые методы из-за языкового дизайна.

Мин-Tang
источник
10

J - 6 символов + переменная

".|.":y

Где у ваша ценность

MPelletier
источник
2
Как функция: |.&.":«реверс под до», что в значительной степени является буквальным переводом задачи.
FireFly
9

APL (3)

⍎⌽⍕

Использование:

⍎⌽⍕12345 => 54321
Мэринус
источник
8

PHP, 9 символов

(int)strrev(123);

Коротко говоря, где Nконстанта:

strrev(N)
powtac
источник
8

Befunge (3 персонажа)

Полная работоспособная программа:

N.@

Где Nтвой номер Правила гласят: «принять один целочисленный аргумент»; В Befunge вы можете вводить только целые числа от 0 до 9.

daniero
источник
3
Это единственные литералы , но могут быть представлены и другие числа. В противном случае, победившим ответом будет Brainfuck с пустой программой. ;-)
FireFly
8

Независимый от языка / математика

Вдохновленный ответом Кирилла Кирова выше. Мне стало любопытно узнать о математических свойствах обращения числа, поэтому я решил немного исследовать.

Оказывается, если вы строите различие n - rev(n)для натуральных чисел nв некоторой базе r, вы получаете шаблоны, подобные этой ( (n - rev(n)) / (r - 1)для r=10, обернутый в rстолбцы, красный обозначает отрицательное число):

таблица различий

Эта последовательность может быть сгенерирована как таковая (псевдокод):

for i=1 to r:
  output 0

for m=0, 1, …
  for k=1 to (r-1):
    for d=1 to r^m:
      for i=0 to (r-1):
        output (r-1) * (r+1)^m * (k - i)

Если вы храните эти значения в списке / массиве, n - arr[n]вы получите обратную форму n. Теперь, чтобы «математически сыграть» в это, в идеале нам нужно выражение в закрытой форме, которое дает нам значение n: th в последовательности, чтобы мы могли иметь выражение в закрытой форме для решения всей задачи. К сожалению, я не смог найти такое выражение ... но похоже, что это возможно. :(

Так что да, не столько код-гольф, сколько математическое любопытство, но если есть выражение в закрытой форме вышеуказанной последовательности, это может быть действительно полезно в правильных представлениях PL-гольфа.

Светляк
источник
7

Haskell, 28 24 персонажа

f=read.reverse.show.(+0)
Хаммар
источник
2
Как насчет f=read.reverse.show.(+0)?
FUZxxl
2
(+0): Легит мужик! Хотя технически вам вообще не нужно .(+0), так как fэто будет более полиморфным, чем то, что требуется для проблемы (разрешено возвращать «аналогично типизированный» вывод). Я бы сбрил эти 5 персонажей.
Томас Эдинг
7

напор

17 символов

:se ri<CR>C<C-R>"
Эрик Фортис
источник
Я бы сказал, что это 10 символов (нажатия клавиш), если вы вводите команду непосредственно в vim. Кстати, сегодня я узнал что-то новое в vim, спасибо :)
daniero
6

Скала - 33 символа

def r(a:Int)=(a+"").reverse.toInt
Лалитх
источник
1
+1 за scala, приятно видеть что-то еще, кроме python / ruby ​​/ perl
lhk
Это не удастся на отрицательном Int. -123 должен вернуться -321
Самак
6

Рубин (14)

x = 13456
x.to_s.reverse
Bodacious
источник
3
«нет» не определено. Я думаю, что вы хотели поставить "х" там.
Дэвид Риверс
3
123456.to_s.reverse еще короче.
Штеффен Роллер
@mmdemirbas - спасибо за исправление опечатки
бодрый
3
Должно быть .to_s.reverse.to_iсоответствовать спец.
гистократ
Число, начинающееся с 0, похоже, не работает. 0112.to_s.reverse.to_i => 47
Джоэл
5

Можно преобразовать число в строку, затем перевернуть строку и затем преобразовать эту строку обратно в число. Эта функция доступна, вероятно, на всех языках. Если вы ищете более математический метод, это может помочь:

int n = 76543;
int r = 0;

while (n > 0) {
    r *= 10;
    r += n % 10;
    n /= 10;
}

источник
5
Мой абсолютно такой же (:
Да, единственное отличие - ваш код выглядит как Python.
Этот метод переполнен на языках с ограниченной точностью. попробуйте1111111119
st0le
5

Python 3+

Форма функции: 28 символов

r=lambda i:int(str(i)[::-1])

(Под) форма программы: 25 символов

print(input()[::-1])

Я считаю, что некоторые из других примеров Python являются мошенничеством или, по крайней мере, дешевыми из-за использования жестко закодированного ввода и / или не полностью отвечающего требованиям.

JAB
источник
5

Golfscript, 5 символов

`-1%~

Это принимает аргумент в стеке и оставляет результат в стеке. Я использую опцию «подпрограмма» в спецификации: если вы настаиваете на функции, это еще четыре символа, оставляя ее в стеке:

{`-1%~}:r
Питер Тейлор
источник
Я думаю, что вы, `-1%~скорее всего, имели в виду , чем `-1$~(и я позволил себе сказать, что так и есть).
Илмари Каронен
5

В сценариях оболочки:

  echo "your number"|rev

Надеюсь, это было полезно :)

tusharmakkar08
источник
хороший! не знал, что Баш способен на это тоже!
Пранит Баува
1
Я думаю , технически это действительно возвращает аналогично типизированного «число» ... можно было бы сократить в дальнейшем с rev<<<yournumber, например rev<<<132(для Баш / Zsh, а не на POSIX , хотя)
FireFly
1
Просто revдостаточно, вопрос не сказать , что это имеет быть функцией. Вы можете сравнить revсо встроенной функцией, даже если она не одна.
nyuszika7h
это неверно: 'rev' - это не встроенный, а внешний вызов программы.
Бастиан Битторф
67-байтовая чистая оболочка POSIX: X = $ 1; while [$ X! = 0]; do Y = $ ((Y * 10 + X% 10)); X = $ ((X / 10)); готово; echo $ Y
Бастиан Битторф
3

Вроде поздно, но

APL, 3

⍎⌽⍞

Если вы настаиваете на функции

⍎∘⌽∘⍕
TwiNight
источник
Похоже, я не смог найти дубликат выше ... (из-за того, что он был на 2-й странице)
TwiNight
Мне грустно, что никто не дал brainfu * k или решение для пробелов :( (еще один голос, и вы на первой странице)
Кирилл Киров
@KirilKirov У меня есть мозговое решение * k: codegolf.stackexchange.com/a/32826/24829
rpax
3

Mathematica, 14 байтов

IntegerReverse

Это не конкурирует, потому что эта функция была добавлена ​​только в выпуске 10.3 на прошлой неделе, но для полноты я думал, что добавлю единственное когда-либо (я думаю?) Встроенное для этой задачи.

Мартин Эндер
источник
2

Вы можете сделать следующее в Java. Обратите внимание, что это преобразует в String и обратно и не является математическим решением.

public class test {
    public static int reverseInt(int i) {
        return Integer.valueOf((new StringBuffer(String.valueOf(i))).reverse().toString());
    }

    public static void main(String[] args) {
        int i = 1234;
        System.out.println("reverse("+i+") -> " + reverseInt(i));
    }
}
Виктор
источник
2
Это математическое решение. Математика - это не числа, это не арифметика. Математика также имеет дело со строками символов. И в этом особом случае преобразование в и из строки - это просто преобразование в и из base-10.
Р. Мартиньо Фернандес
Под «не математическим решением» я подразумевал, что мы сами не занимаемся математикой. Методы делают весь анализ и математику для нас. В отличие, например, от ответа Кирилла Кирова.
Виктор
Переполнится ...
st0le
2

Lua

Числа и строки взаимозаменяемы, так что это тривиально

string.reverse(12345)
Alex
источник
2

Этот на самом деле принимает входные данные, в отличие от некоторых остальных:

print`input()`[::-1]

Кстати, Python

Exelian
источник
2

Actionscript

43 персонажа. num в качестве параметра функции:

num.toString().split('').reverse().join('')
Кумсал Обуз
источник
2

Groovy

r={"$it".reverse() as BigDecimal}

assert r(1234) == 4321
assert r(345678987654567898765) == 567898765456789876543
assert r(345346457.24654654) == 45645642.754643543
Armand
источник
2

Perl, 11 символов

Для этого pнеобходим флаг, включенный в счетчик.

Использование:

$ echo 76543 | perl -pE '$_=reverse'
Зайд
источник
Я считаю 10 символов
Ф. Хаури
pФлаг включен в счете
Зайд
2

Clojure (42 символа)

#(->> % str reverse(apply str)read-string)

Пример использования:

(#(->> % str reverse(apply str)read-string) 98321)

возвращает 12389

Омар
источник
2

Common Lisp - 60 символов

(first(list(parse-integer(reverse(write-to-string '4279)))))

достанет вам 9724.

Крис Циммерман
источник
Почему (first(list? parse-integerуже возвращает номер.
Флориан Маргэйн
2

К, 3 байта:

.|$

Оцените ( .) обратное ( |) приведение к строке ( $).

Пример использования:

  .|$76543
34567
Johne
источник
2

RS , 20 байт

#
+#(.*)(.)/\2#\1
#/

Технически это не считается (rs был создан ранее в этом году), но я не видел никаких других основанных на регулярных выражениях ответов, и я подумал, что это аккуратно.

Живая демоверсия.

Объяснение:

#

Вставьте символ фунта в начале строки. Это используется в качестве маркера.

+#(.*)(.)/\2#\1

Непрерывно добавляйте последний символ основной строки в область перед маркером, пока не останется символов.

#/

Уберите маркер.

kirbyfan64sos
источник
2

MIRC 4,45 (35 байт)

$regsubex(12,/(.)/g,$mid(\A,-\n,1))
onkarjit
источник