Найкоротший спосіб повернути число


31

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

Для прикладу наведено 76543 повернення 34567


6
Поверніться до часу, коли число було рядком, а потім
оберніть

2
Ідея "найкоротшого алгоритму" дещо розумна, особливо якщо ви дозволите "будь-яку мову". Придумайте алгоритм, і я дам вам DSL з відповідним оператором "~" ...

3
Лише зауваження: будь-яке число, що закінчується на 0, стає
зменшеним

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
Смішно і в google transate . @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
Ви можете використовувати зворотні посилання (для 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 

Це пітон, але це можна зробити будь-якою мовою, тому що це просто математичний метод.


Якщо замінити modз %, вона діє на Python;)
phihag

Ви маєте рацію, насправді :) 10x

3
Не найкоротший, але найпоширеніший і універсальний.
Кирил Кіров

3
y=y*10+x%10....
st0le

1
BrainFuck не робить, хоча це можна порахувати. Будь-яка мова, яка її не має, може використовувати a - (n * int(a/n))замість a mod n. Крім того, якщо подивитися тут , операція з модулем реалізується по-різному в кожній мові. (Дивіться таблицю праворуч.)
mbomb007

13

Перл 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: -ве значення в послідовності, щоб ми могли мати вираз із закритою формою для вирішення всієї задачі. На жаль, мені не вдалося знайти такого виразу ... але схоже, що це повинно бути можливим. :(

Так, так, не стільки кодовий гольф, скільки математична цікавість, але якщо є вираз із закритою формою вищезазначеної послідовності, це може бути корисним у правильних поданнях про гольф 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

Scala - 33 ч

def r(a:Int)=(a+"").reverse.toInt

1
+1 для scala, приємно бачити щось інше, ніж python / ruby ​​/ perl
lhk

Це не вдасться при негативному Int. -123 має повернутися -321
samach

6

Рубін (14)

x = 13456
x.to_s.reverse

3
"ні" не визначено. Я думаю, ти мав намір поставити туди "х".
Девід Ріверс

3
123456.to_s.reverse ще коротше.
Steffen Roller

@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

Гольфскрипт, 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; тоді як [$ X! = 0]; зроби Y = $ ((Y * 10 + X% 10)); X = $ ((X / 10)); зроблено; echo $ Y
Бастіан Бітторф

3

Ніби пізно, але

APL, 3

⍎⌽⍞

Якщо ви наполягаєте на функції

⍎∘⌽∘⍕

Добре виглядає, що я не міг помітити дублікат вище ... (через те, що він знаходиться на 2-й сторінці)
TwiNight

Мені прикро, що ніхто не дав рішення про мозковий * k або пробіл :( (ще один голос, і ви на першій сторінці)
Кирило Кіров

@KirilKirov У мене є роздум * k рішення: codegolf.stackexchange.com/a/32826/24829
rpax

3

Математика, 14 байт

IntegerReverse

Це не конкурує, тому що ця функція була додана лише у випуску 10.3 минулого тижня, але для повноти я подумав, що я би додав єдиний (коли я думаю?) Вбудований для цього завдання.


2

Ви можете зробити наступне на Java. Зауважте, що це перетворюється на String і back і не є математичним рішенням.

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
Це математичне рішення. Математика - це не числа, не арифметика. Математика також займається рядками символів. І в цьому спеціальному випадку перетворення в рядок і з нього є лише перетворенням до базової та 10.
Р. Мартіньо Фернандес

Що я мав на увазі під "не математичним рішенням", це те, що ми самі не займаємось математикою. Методи роблять для нас весь аналіз і математику. На відміну, наприклад, від відповіді Кирила Кірова.
Віктор

Переповниться ...
st0le

2

Луа

Числа і рядки взаємозамінні, тому це банально

string.reverse(12345)

2

Цей АКТУАЛЬНО приймає вклад, на відміну від деяких інших:

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

Пітон btw.



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.