Поверніть перевернуту версію номера


18

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

enter image description here

А коли повертається горизонтально, це виглядає так:

enter image description here

Таким чином, дзеркальне зображення 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, то
перекид

6
6, 9 обертаються на 180 градусів, 2, 5 перевертаються горизонтально, а 1, 3 насправді є відображеннями себе по вертикалі.
jimmy23013

22
Переклади, визначені у питанні, взагалі не узгоджуються. Чому 2 і 5 перевертаються, а 3 - ні?
Рінант

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 .


1
Не можу повірити, що я про це не думав ...
Денніс




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

БЕФУНГ 93 - 18 14 20 байт

Я думаю, що коментатори мають рацію, хоча Befunge, будучи двома мовними рядками, дещо відрізняється. Все-таки в цю мить коментатори мають рацію.

&1g01g-.  
! &  #* )'

Кроки:

&

Читає введення як числове значення x і натискає на стек.

1g

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

01g-.

Прочитує значення символу комірки 0,1 (33), віднімає її з c та виводить її як числове значення.


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

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.


2
Цікаво, але ваша відповідь GolfScript все одно виграє. Якщо в питанні не вказано інше, довжина вимірюється в байтах.
Денніс

@Dennis Це була моя третя чи четверта відповідь на цьому сайті. Я не знав. І я думаю, APL - виняток.
jimmy23013

@Dennis І більшість людей не люблять слізкі. :)
jimmy23013

Насправді не виняток, ми просто дозволяємо людям обирати кодування. Ця відповідь набрала б 22 байти, оскільки це її розмір за допомогою UTF-16. APL використовує лише 256 різних символів, і там є кодова сторінка APL, де один раз символ - це точно один байт.
Денніс

@Dennis Ах, ти правий.
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
...

3

CJam - 14

Версія вводу / виводу:

"0 5  29 86"q#

Версія стека (припускає, що число знаходиться в стеку):

[0W5WWY9W8 6]=

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


Немає статті у Вікіпедії про CJAM, і посилання просто переходить до порожнього скрипта. Де ви могли б знайти інформацію про мову та її встановлені випуски?
Panzercrisis

Схоже, це так: sourceforge.net/projects/cjam
Panzercrisis

@Panzercrisis cjam.aditsu.net має "CJam", пов’язаний зі сторінкою sourceforge
aditsu

3

Перл, 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

Марбельний 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.


2

МАТЛАБ - 35

Я б зафіксував це у функції з nєдиним параметром.

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

35 символів.


2

ECMAScript 6, 24

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

Використовуючи звичайний JavaScript, це було б 33:

alert(~-++'0n5nn29n86'[prompt()])

2

TI-BASIC, 24 22

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

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


Це майже напевно можна пограти в гольф до 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);}

1
Нічого собі, у мене не було поняття вбудованих літеральних масивів на кшталт цього. Дуже приємна перша відповідь, і ласкаво просимо до PPCG! (Немає необхідності додавати подання функції вводу / виводу , цілком справедливі .)
Мартін Ендер

1

Пітон - 34

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

1
33 f=lambda n:ord(" "[n])-3робота з космічними кодамиkkulptor.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;}

Ви можете зробити свій код трохи коротшим, якщо ви додасте 1 до кожного значення масиву та після [i] субстрату 1.
barteks2x

@ Barteks2x Хороший момент; дякую
Ypnypn


1

С - 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 <номер>

EDIT

Відповідно до пропозиції @ bebe, ось приклад, який замість цього приймає дані STDIN:

C - 68 51 байт

main(){printf("%d","106003:097"[getchar()-48]-49);}

використання 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')"


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.

0®5®®Y9®8 6¹@повинні також працювати.
Емінья

@Emigna я не мав уявлення, дякую!
Ерік Аутгольфер

Гарне мислення с @. Не часто ви бачите, що використовували :)
Емінья,

@Emigna Байт коротший за )¹èабо )sè.
Ерік Аутгольфер


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.