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


31

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

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


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

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

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


10

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

".|.":y

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


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


8

PHP, 9 символов

(int)strrev(123);

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

strrev(N)

8

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

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

N.@

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


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

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 являются мошенничеством или, по крайней мере, дешевыми из-за использования жестко закодированного ввода и / или не полностью отвечающего требованиям.


5

Golfscript, 5 символов

`-1%~

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

{`-1%~}:r

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

5

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

  echo "your number"|rev

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


хороший! не знал, что Баш способен на это тоже!
Пранит Баува

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

⍎⌽⍞

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

⍎∘⌽∘⍕

Похоже, я не смог найти дубликат выше ... (из-за того, что он был на 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)

2

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

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

Кстати, Python



2

Groovy

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

assert r(1234) == 4321
assert r(345678987654567898765) == 567898765456789876543
assert r(345346457.24654654) == 45645642.754643543

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

К, 3 байта:

.|$

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

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

  .|$76543
34567

2

RS , 20 байт

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

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

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

Объяснение:

#

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

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

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

#/

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.