Створення ймовірностей навколо Numpad


12

Натхненний цим питанням раніше сьогодні , я хотів би побачити цікаві способи, як різні мови програмування можуть перетворити нумерацію в імовірність. Зазвичай ігри на основі плитки дозволять використовувати numpad для переміщення в будь-якому напрямку залежно від того, де знаходиться ваш персонаж. Коли виготовлення AI для цих ігор Math.random() * 8недостатньо, тому мені довелося проявити трохи творчості, щоб рух виглядав і відчував себе дещо природним.

Цифрова цифра визначається як така:

7 | 8 | 9
- - - - -
4 | x | 6
- - - - -
1 | 2 | 3

Зверніть увагу, що номер 5 - це недійсне число, оскільки ви не можете перейти на себе.

Усі приклади будуть використовувати ці ймовірності: [50, 40, 30, 20, 10]

Якби я хотів генерувати ймовірності навколо 8, це виглядало б приблизно так:

40 | 50 | 40 
-- | -- | --
30 | xx | 30
-- | -- | --
20 | 10 | 20

Вихід буде [20, 10, 20, 30, 30, 40, 50, 40](з 5 пропущеними) або [20, 10, 20, 30, null, 30, 40, 50, 40](при 5 присутніх)

Якби я хотів генерувати їх навколо 1, це виглядало б приблизно так:

30 | 20 | 10
-- | -- | --
40 | xx | 20
-- | -- | --
50 | 40 | 30

Вихід буде [50, 40, 30, 40, 20, 30, 20, 10](з 5 пропущеними) або [50, 40, 30, 40, null, 20, 30, 20, 10](при 5 присутніх)

Ви можете написати повну програму, яка приймає введення будь-яким звичним способом (командний рядок, stdin) і друкує вихід, або ви можете написати функцію з аргументом числа, який друкує або повертає вихід. Ваша програма або функція повинна приймати одне число - позицію для генерації навколо. Ви повинні використовувати такі ймовірності: [50, 40, 30, 20, 10](вони не повинні бути жорстко кодованими).

Виграє найкоротший код у байтах. Стандартні лазівки заборонені. Відповіді, розміщені у пов'язаній темі, заборонені. Доступні пробіли або провідні місця. Ви можете ставитися до положення 4як відсутнього або порожнього, залежно від ваших уподобань. Я не надто вибагливий у вихідному форматі - друкуйте його у вигляді розділених комами рядків або у вигляді масиву.

(Це моє перше запитання, будь ласка, просто!)

Відповіді:


5

CJam, 27 байт

12369874s_$\_r#m<f{#4-z)0S}

Спробуйте його в Інтернеті в інтерпретаторі CJam .

Ідея

Якщо ми проходимо через цифри навколо 5 проти годинникової стрілки, отримуємо рядок 12369874або будь-яке його обертання (залежно від початкової точки).

Після обертання цього рядка таким чином, щоб цифра вводу n була в крайньому лівому положенні, цифри в обертовій рядку мають такі ймовірності:

50 40 30 20 10 20 30 40

Якщо розглядати індекси цих цифр, які є

 0  1  2  3  4  5  6  7

відняти 4 з кожного, щоб отримати вихід

-4 -3 -2 -1  0  1  2  3

і приймати абсолютні значення для отримання

 4  3  2  1  0  1  2  3

нам залишається лише додати 1 і додати 0, щоб отримати бажані ймовірності.

Код

12369874s                   e# Push "12369874".
         _$                 e# Push a sorted copy, i.e., "12346789".
           \                e# Swap it with the unsorted original.
            _r#             e# Find the index of the input in an unsorted copy.
               m<           e# Rotate the unsorted original that many units left.
                 f{       } e# For each character C in "12346789":
                            e#   Push the rotated string.
                   #        e#   Find the index of C.
                    4-      e#   Subtract 4.
                      z     e#   Compute the absolute value.
                       )    e#   Add 1.
                        0S  e#   Push a 0 and a space.

2

Пролог, 166 байт

a(A,R):-I:J:K:L:M=50:40:30:20:10,B is abs(5-A),member(B:S,[4:[I,J,K,J,L,K,L,M],3:[J,I,J,K,K,L,M,L],2:[K,J,I,L,J,M,L,K],1:[J,K,L,I,M,J,K,L]]),(A/5>1,reverse(S,R);S=R).

Для цього використовується той факт, що результат для 9 - це зворотний результат для 1, однаковий для 2 і 8, 3 і 7 і 4 і 6. Існують впізнавані шаблони, що переходять від результату 1 до результатів 2,3 і 4, але я впевнений, що це буде довше кодувати це, ніж жорстке кодування послідовностей від 1 до 4, що я і зробив.

Приклад: a(7,R).виходи R = [30, 20, 10, 40, 20, 50, 40, 30].


Дійсна стратегія, хоча я сподіваюся, що деякі мови полегшують алгоритмічне виконання, ніж було б жорстке кодування. Я думаю, ми побачимо.
Сейрія

@Seiyria Я припускаю, що мови, орієнтовані на масив, зроблять саме це. Ви, на жаль, зазвичай не можете перестановити елементи списків у невеликій кількості байтів у Prolog.
Фаталізувати

0

Пітон - 115

a=[50,40,30,20,10,20,30,40]
b=[0,1,2,7,8,3,6,5,4]
def v(n):
 c=8-b[n-1]
 return[(a[c:]+a[:c])[e]for e in b if e-8]

aявляє собою масив зі значеннями в порядку навколо нумерації (проти годинникової стрілки від 1), і bвідображає числа на цифровій панелі в позиціях навколо неї. Виходячи з кількості пробілів навколо цифрової клавіатури для вхідного номера (визначається за допомогою b), він створює масив з тим, що багато елементів переміщуються від передньої частини aдо кінця, а потім bзнову використовують для перестановки елементів на відповідність номерам цифр.


Ви можете значно заощадити, зробивши /10і потім помістивши *10свій цикл.
Мальтісен

Це не (a[c:]+a[:c])[e]так, a[(c+e)%8]чи a[c+e-8]? А потім підключення cспрощує вираз.
xnor

0

Pyth - 38 байт

Використовує такий же прийом, як і відповідь Python, за винятком стиснення бази для двох масивів.

J_jC"3ê"T*RTm@.<jC"<àR"T-8@JtQd.DJ4

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


Що ê і à роблять?
фаза

@phase згадане вище стиснення бази: codegolf.stackexchange.com/questions/40039/…
Maltysen

Ці короткі відповіді ніколи не перестануть мене дивувати.
Сейрія

@Seiyria Я дійсно можу запропонувати вивчити Pyth - ці програми виглядають набагато складніше, ніж є :)
orlp

0

Ява, 190

void g(int n){int i[]={8,0,1,2,7,8,3,6,5,4};String v="54321234",s="";n=i[n];if(n>0)v=v.substring(8-n)+v.substring(0,8-n);for(n=0;n++<9;s=", ")if(n!=5)System.out.print(s+v.charAt(i[n])+"0");}

String v утримує ймовірності (ділиться на 10) у порядку годинникової стрілки, введення = 1 за замовчуванням 50.

int[]iпереводить вхідні дані в індекс в v. Наприклад, v.charAt(i[1])є 5. Введення 0 і 5 є недійсними, тому і i [0], і i [5] мають значення заповнювача 8, що є індексом для '\ 0' в кінці v.

Я обертаю числа v v праворуч на значення i [n], а потім друкую ймовірності у вигляді рядків, розділених комами.

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