Вернуть перевернутую версию числа

18

Когда число отображается на калькуляторе, можно рассмотреть, как будут выглядеть различные преобразования этого числа. Например, на семисегментном дисплее 2 отображается так:

введите описание изображения здесь

И при переворачивании по горизонтали это выглядит так:

введите описание изображения здесь

Таким образом, зеркальное отображение 2 равно 5.

Задача в этой задаче состоит в том, чтобы взять однозначное число и вернуть число, которое является его зеркальным отображением (если это возможно). Если его зеркальное отображение не похоже на число, верните число, повернутое на 180 градусов (если это возможно). Если ни один из этих случаев не верен, верните -1.

Вот полный список входов и выходов, которые ваша программа должна обработать:

Input   Output
0       0
1       -1
2       5
3       -1
4       -1
5       2
6       9
7       -1
8       8
9       6

Как вызов , выигрывает самый короткий код!

Джеймс Уильямс
источник
17
Я не согласен с вашей последней точкой - 1 на 7-сегментном дисплее просто перевернется на другую сторону, поэтому 1 следует вздремнуть до 1.
Jwosty
29
Я не понимаю, как перевернуть каждую цифру. Если 2 становится 5, то 6 должно стать обратным 9, а не 9. Но если 6 становится 9, то переворот - это просто вращение, поэтому 2 становится другим 2, а не 5.
kernigh
6
6, 9 повернуты на 180 градусов, 2, 5 перевернуты горизонтально, а 1, 3 фактически являются отражениями самих себя по вертикальной оси.
jimmy23013
22
Переводы, определенные в вопросе, не являются последовательными вообще. Почему 2 и 5 переворачивают, а 3 нет?
Rynant
4
Я заметил любопытный факт о переключаемых числах: они образуют противоположные двоичные структуры, то есть 2 = 010, 5 = 101. 6 = 0110, 9 = 1001. Кто-нибудь может использовать этот факт в своем решении?
Джек Эйдли

Ответы:

32

Хаскелл - 43 31

43 персонажа без всяких фантазий.

f 0=0
f 8=8
f 2=5
f 5=2
f 6=9
f 9=6
f _= -1

Получил до 31 символа, сделав его частичной функцией.

f=([0,-1,5,-1,-1,2,9,-1,8,6]!!)
Тейлор Фаусак
источник
4
Я смеялся. Есть +1.
seequ
6
+1 Для использования Haskell, чтобы сделать именно то, что спецификация. говорит!
recursion.ninja
1
Я не думаю, что вам нужно f=второе решение, так как оно является допустимым выражением
Cyoce
23

GolfScript, 15 14

Я снова прочитал спецификацию и обнаружил, что ввод должен быть строкой.

"0.5..29.86"\?

Бежать:

echo -n 2 | ruby golfscript.rb a.gs

Старая версия (которая имеет целочисленный ввод):

[0.5..2 9.8 6]?

Более новый (14 байт) несколько вдохновлен ответом CJam от aditsu .

jimmy23013
источник
1
Не могу поверить, что я не думал об этом ...
Деннис
14

Python 2.x - 28

'015..29.86'.find(`input()`)
Willem
источник
2
Python 2.x, в частности.
seequ
6
С Python 3 вы можете удалить `s и сохранить 2 символа.
Rynant
11

JavaScript 37 36

alert("0_5__29_86".search(prompt()))
DarkAjax
источник
использовать .search()и сохранить байт.
Исмаэль Мигель
@IsmaelMiguel Хороший, спасибо!
DarkAjax
8

CJam, 20 байтов

q25691347`"5296W"er~

Попробуйте онлайн.

Выход

$ for i in {0..9}; { cjam <(echo 'q25691347`"5296W"er~') <<< $i; echo; }
0
-1
5
-1
-1
2
9
-1
8
6

Как это устроено

q          " Read from STDIN. The leaves a string on the stack.            ";
25691347`  " Push the string '25691347'.                                   ";
"5296W"    " Push the string '5296W'.                                      ";
er         " Perform character transliteration.                            ";
~          " Evaluate the result. Examples: '2' returns 2, 'W' returns -1. ";
Деннис
источник
8

BEFUNGE 93 - 18 14 20 байт

Я думаю, что комментаторы правы, хотя Befunge, будучи двумерным языком, немного отличается. Тем не менее, в этот момент комментаторы правы.

&1g01g-.  
! &  #* )'

шаги:

&

Считывает ввод как числовое значение x и помещает его в стек.

1g

Получает значение символа c (например, '!' = 33 или '*' = 42. Пустая ячейка = 32) в позиции x, 1.

01g-.

Считывает символьное значение ячейки 0,1 (33), вычитает его из c и выводит его как числовое значение.

AndoDaan
источник
2
Довольно мило. Есть +1.
seequ
Пожалуйста, исправьте длину: это 20 байт
har-wradim
1
Вы на самом деле считали свои байты неправильно. Вы использовали 19 байтов. Мы считаем, новые строки и пробелы. Но если вы переключитесь на Befunge 98, вы можете сохранить его; изменить 1-ую строку на:&1g'!-.
Джастин
8

Ява - 49

long f(int a){return(0x790a300601L>>(a*4)&15)-1;}

Здесь 0x790a300601- значение, заполненное желаемыми результатами, с одним добавленным, чтобы сделать их положительными. Значения хранятся в клочьях внутри значения, поэтому для их выталкивания требуется немного смещения и маскировки.

Java - 100 (веселый вариант)

int f(int a){Random r=new Random(0x2000A2F47D6Fl);int b=0;for(;a>=0;a--)b=r.nextInt(11)-1;
return b;}

Не самый маленький вариант, но немного веселья. Я нашел случайное начальное число, которое выдает правильные значения при вызове X раз (где 0> = X <= 9).

Дункан Джонс
источник
Умная. +1
Cyoce
8

JavaScript (ECMAScript 6) 25

x=>'1060039097'[x]-(x!=6)

JavaScript (ECMAScript 5) 43

function f(x){return'1060039097'[x]-(x!=6)}

ОБНОВЛЕНИЕ: edc65 предложил гораздо лучшую технику. зубная щетка предложила намного лучший язык. На данный момент мой основной вклад отладки и догадки.

Кин
источник
1
Если вы измените его на ECMAScript 6 (поддерживается в Firefox), вы можете просто сделать это x=>[0,-1,5,-1,-1,2,9,-1,8,6][x].
Зубная щетка
Сначала я чуть не опубликовал function(x)[0,-1,5,-1,-1,2,9,-1,8,6][x], также благодаря Firefox. В любом случае я не собирался побеждать, поэтому я решил, что просто буду придерживаться ответа с наивысшей совместимостью. Если я начну переключать языки для краткости, то со временем я начну определять свой собственный язык для каждой задачи, которую я выполняю. Но я все равно упомяну версию ECMAScript 6, поскольку вы ее предложили
Keen
1
Та же концепция, но короче (пока, запятые): x => '106003907' [x] - (x! = 6)
edc65
@ edc65 Знаете, я хотел использовать строку, и я полностью упустил тот факт, что могу привести результат обратно к числу. Странная ошибка. И все же я бы все равно не придумал -(x!=6). Спасибо.
Кин
6

Баш 29

tr 1-9 x5xx29x86|sed s/x/-1/g

например

$ echo 0 1 2 3 4 5 6 7 8 9 | tr 1-9 x5xx29x86|sed s/x/-1/g
0 -1 5 -1 -1 2 9 -1 8 6

источник
Вы можете опустить 'вокруг выражения sed. Также я думаю, что вы можете опустить это, gпотому что спецификация предоставляет только одну цифру за раз
Digital Trauma
Благодарю. Это только в примере, само представление не использует '. Любит gдля более длительного ввода!
4

Кона - 29

Эта функция возвращает элемент xиз массива0 -1 5...

f:{0 -1 5 -1 -1 2 9 -1 8 6@x}

Примеры:

> f 2
  5
> f 5
  2
> f 8
  8
Кайл Канос
источник
Действительно ли вектор сам по себе допустим?
seequ
@TheRare: Хм, он говорит «алгоритм», так что я полагаю, нет. Я изменю это и сделаю это больше как Ваш ...
Кайл Канос
Кажется лучше, есть +1.
seequ
4

JavaScript 36 37 41

alert('0x'+'65b558f5ec'[prompt()]-6)

как функция ES6 - 27:

f=v=>'0x'+'65b558f5ec'[v]-6
core1024
источник
2
28:f=v=>~-[1,,6,,,3,10,,9,7][v]
nderscore
@nderscore Вы просто любите улучшать коды людей, не так ли?
Seequ
3
@TheRare Я просто в поисках кратчайшего кода JavaScript. :) Если кто-то уже опубликовал хороший ответ, для меня имеет больше смысла находить в нем оптимизацию, а не публиковать новый, почти дублирующий ответ. Я здесь не для того, чтобы соревноваться, просто чтобы сотрудничать для достижения этой цели.
nderscore
@nderscore У меня такой же менталитет, если моя идея достаточно похожа. В любом случае, хороший.
seequ
@nderscore Вы действительно дали мне мотивацию. Я не уверен, смогу ли я сделать это короче, но я попробую :)
core1024
4

Скриптинг, 11 символов

걄럣뉥밈결⓷方分결剩貶

Наконец, я нашел компьютер Windows с установленной Visual Studio для создания интерпретатора. И это легко победило мой код GolfScript.

Он читает 18453063256\11\?/11%(в GolfScript.

jimmy23013
источник
2
Интересно, но ваш ответ на GolfScript все еще выигрывает. Если в вопросе не указано иное, длина измеряется в байтах.
Деннис
@Dennis Это был мой 3-й или 4-й ответ на этом сайте. Я не знал И я думаю, что APL является исключением.
jimmy23013
@Dennis И большинству людей не нравится Скриптинг. :)
jimmy23013
Не исключение, мы просто позволяем людям выбирать свою кодировку. Этот ответ оценил бы 22 байта, так как это - его размер, используя UTF-16. APL использует только 256 различных символов, и есть кодовая страница APL, где один символ равен ровно одному байту.
Деннис
@ Денис Ах, ты прав.
jimmy23013
3

J - 28 27 байт

Вы знаете, что мне нравится? Простота (28 байт). Обратите внимание, что в J _1отрицательный (-1).

f=:{&0 _1 5 _1 _1 2 9 _1 8 6

Добавьте немного сложности, и у вас есть 27 байтов.

f=:-{&0 2 _3 4 5 3 _3 8 0 3

Пример:

   f 2
5
   f 6
9
   f 5
2
...
seequ
источник
3

CJam - 14

Версия ввода / вывода:

"0 5  29 86"q#

Версия стека (предполагается, что число находится в стеке):

[0W5WWY9W8 6]=

Попробуйте их на http://cjam.aditsu.net/

aditsu
источник
Там нет статьи в Википедии о CJAM, и ссылка просто идет на пустой скрипач. Где вы найдете информацию о языке и его официальных версиях?
Panzercrisis
Похоже, вот оно: sourceforge.net/projects/cjam
Panzercrisis
@Panzercrisis cjam.aditsu.net имеет "CJam", связанный со страницей sourceforge
aditsu
3

Perl, 27 26

Граф включает в себя p флаг

y/2569/5296/,s/[1347]/-1/

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

$ echo 7 | perl -pe y/2569/5296/,s/[1347]/-1/
-1

Подождите, Perl только что победил J? :)

Зайд
источник
+1 Я собирался опубликовать пост y+0-9+9a4aa70a13+;$_=9-hex, который такой же длины, но ваш более оригинальный;)
core1024
1
@ core1024: И это стало короче;)
Заид
Это не:echo 1 | perl -pe y/2569/5296/,s/[347]/-1/
core1024
@ core1024: Я неправильно прочитал спецификации, должно быть исправлено. Это все еще короче, чем решение J.
Заид
На самом деле нет краткого способа сделать это в J, поскольку значения строго типизированы, а числа не могут соответствовать строкам.
Seequ
3

Marbelous 34 байта

}0
=6=9=2=5=0=8?0
+3-3+3-3....--

Это не самое короткое решение, но и не самое длинное.

Как это устроено

}0порождает мрамор, представляющий первый ввод командной строки. Этот мрамор падает на следующий тик, на=6 клетку. =6это ячейка сравнения, она выталкивает любой мрамор со значением 6 вниз, а все остальные вправо. Эта цепочка ячеек сравнения толкает шарики вправо до тех пор, пока они не достигнут желаемого значения. 0 и 8 просто проваливаются и печатаются, когда они падают с нижней части доски, 6 и 2, а 9 и 5 сначала прибавляют к ним 3, вычитая из них соответственно. Если мрамор не равен ни одному из желаемых значений, он попадает в ?0ячейку, которая превращает любой мрамор в 0 мрамора 1 . Этот мрамор затем уменьшается и падает с доски.

1 А?n мрамор технически превращает любой мрамор в мраморе между 0 и п. Это имеет приятный побочный эффект, который ?0превращает все в 0.

overactor
источник
2

MATLAB - 35

Я бы обернул это в функцию с n единственным параметром.

f=[0,-1,5,-1,-1,2,9,-1,8,6];
f(n+1)

35 символов.

lukass
источник
2

ECMAScript 6, 24

f=x=>~-++'0n5nn29n86'[x]

При использовании обычного JavaScript это было бы 33:

alert(~-++'0n5nn29n86'[prompt()])
ShadowCat7
источник
2

TI-BASIC, 24 22

-1+int(11fPart(11^Ans.0954191904

Это кодирует возможные выходные данные в справочной таблице, хранящейся как число с плавающей запятой base-11; (N + 1) -я основа-11 после десятичной точки извлекается из таблицы, чтобы получить значение перевернутой цифры. В базе 11 число есть .106003A097, а цифры этого меньше единицы точно0,-1,5,-1,-1,2,9,-1,8,6 .

Трюк edc65 по вычитанию единицы в случае 6 приводит к этому 24-байтовому решению, где ⑩^(есть один однобайтовый токен:

-(Ans≠6)+int(10fPart(.1060039097⑩^(Ans

Строковый подход составляет 29 байтов:

-(Ans≠6)+expr(inString("1060039097",Ans+1,1

Подход массива (который также использовал Ypnpyn) составляет 30 байтов, при условии, что число хранится в X:

{1,0,6,0,0,3,10,0,9,7}-1:Ans(X+1

24 -> 22: убраны две лишние цифры точности в магической константе.

lirtosiast
источник
Это почти наверняка можно до 19, а возможно до 18; Тем не менее, мне нужно искать правильные номера.
lirtosiast
2

C - 47 байт [было 48 байт]

f(i){return(int[]){1,0,6,0,0,3,10,0,9,7}[i]-1;}

Чтобы добавить ввод / вывод (что не всегда выполняются другие ответы) для 86 байтов:

main(i){i=(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1;i<0?puts("-1"):putchar(i+48);}
NoSeatbelts
источник
1
Ух, у меня не было подсказок о литералах встроенного массива, как это было вещью. Очень хороший первый ответ, и добро пожаловать в PPCG! (Нет необходимости добавлять функции ввода / вывода, которые абсолютно действительны .)
Мартин Эндер
1

Python - 34

f=lambda n:ord("A@F@@CJ@IG"[n])-65

источник
1
33 f=lambda n:ord(" "[n])-3работы с космосом codeskulptor.org/#user34_Q7NbNvQy55_0.py
Дилан Мадисетти
Возможно, вы захотите объяснить, как и почему это работает
Riot
Используя таблицу ascii asciitable.com, выбранные пробелы можно распечатать на python. на самом деле это выглядит примерно так &#002;&#002;&#008;&#002;&#002;&#005;&#012;&#002;&#011;&#009;: минус 3 по той причине, что -1 оставляет нулевой символ, который не годится, а минус 2 оставляет перевод строки, зарезервированный в python
Dylan Madisetti
1

Ява, 58 59

int f(int i){int[]a={1,0,6,0,0,3,10,0,9,7};return a[i]-1;}

ИЛИ

int f(int i){return new int[]{1,0,6,0,0,3,10,0,9,7}[i]-1;}
Ypnypn
источник
Вы можете сделать свой код немного короче, если добавите 1 к каждому значению в массиве и после [i] вычтите 1.
barteks2x
@ Barteks2x Хороший вопрос; спасибо
Ypnypn
1

JavaScript 42 37

Запустите его на консоли вашего браузера

alert(~-[1,,6,,,3,10,,9,7][prompt()])
Уильям Барбоза
источник
1

C - 117 108 106 77 76 байтов

a[]={1,0,6,0,0,3,10,0,9,7};main(int c,char**b){printf("%d",a[*b[1]-48]-1);}

Не лучший язык для игры в гольф, ну да ладно ...
Скомпилируйте gcc progname.c -o progname. (Игнорировать предупреждения или добавить-include stdio.h в команду компиляции.)

Использование: ./progname <номер>

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

В соответствии с предложением @ bebe, вот пример, который принимает входные данные от STDIN:

C - 68 51 байт

main(){printf("%d","106003:097"[getchar()-48]-49);}
BenjiWiebe
источник
Использование d=*b[1]-48может быть хорошей идеей
bebe
@bebe Ах да, спасибо!
BenjiWiebe
1
main(){printf("%d",(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1);}извините, что беспокою вас так сильно, но я считаю это немного короче.
bebe
Вы можете сохранить другой символ, сделав массив глобальным, чтобы вам не требовалось приведение. a[]={1,0,6,0,0,3,10,0,9,7};main(){printf("%d",a[getchar()-48]-1);}
Allbeert
2
main(){printf("%d","106003:097"[getchar()-48]-49);}51 байт
bebe
1

J (24, функция)

(Панель ввода не играет хорошо. Вставьте следующее в интерпретатор Python, и мой ответ будет раскрыт :)

print "f=:{&(_3+3 u:'^C^B^B^E^L^B^K\t')"
ɐɔıʇǝɥʇuʎs
источник
1

05AB1E , 13 байт (не конкурирующих)

0®5®®Y9®8 6¹@

Попробуйте онлайн!

-3 спасибо Эмигне .

Объяснение:

0®5®®Y9®8 6¹@ Takes an integer from STDIN.
0®5®®Y9®8 6   Push 0, r=-1, 5, r=-1, r=-1, Y=2, 9, r=-1, 8, 6.
           ¹  Push first input item.
            @ Pop and push the 0-indexed stack item at the respective index.
Эрик Outgolfer
источник
0®5®®Y9®8 6¹@должно работать так же.
Эминья,
@ Emigna Я понятия не имел, спасибо!
Эрик Outgolfer
Хорошо думать с @. Не часто вы видите, что использовали :)
Emigna
@Emigna Байт короче )¹èили )sè.
Эрик Аутгольфер
1

Желе , 14 байт (не конкурирует)

ị“-5--29-860”V

Попробуйте онлайн!

Объяснение:

ị“-5--29-860”V Takes argument as an integer.
 “-5--29-860”  "-5--29-860" (1-indexed string).
ị              Return the xth char of the string above (y) (x=argument).
             V Eval. - is the same as -1.
Эрик Outgolfer
источник
ịV = žh‡в 05AB1E
Волшебная Осьминог Урна