Генерация вероятностей вокруг цифровой клавиатуры


12

Вдохновленный этим вопросом ранее сегодня , я хотел бы увидеть интересные способы, которыми различные языки программирования могут превратить цифровую цифру в вероятности. Как правило, игры на основе плиток позволяют вам использовать цифровую клавиатуру для перемещения в любом направлении в зависимости от того, где находится ваш персонаж. При создании ИИ для этих игр Math.random() * 8этого недостаточно, поэтому мне пришлось проявить немного креативности, чтобы движение выглядело и ощущалось несколько естественным.

Numpad определяется так:

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].


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

@ Seyria Я предполагаю, что ориентированные на массивы языки сделают именно это. К сожалению, вы обычно не можете переставлять элементы списков в коротком количестве байтов в Прологе.
Роковая

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в свой цикл.
Maltysen

Разве это не (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) в порядке против часовой стрелки с input = 1 по умолчанию 50.

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

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

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