Вкажіть хеш із змінною довжиною


10

У мене з другом є ця гра, в яку ми граємо словами. Це веселе проведення часу і воно передбачає "скасування" букв словом, поки не залишиться нічого. Мені справді набридло йому бути набагато швидшим за мене, тому ваша робота - це реалізувати це, і дозвольте мені остаточно його перемогти. Очевидно, оскільки я маю зробити так, щоб програма була якомога легшою, щоб її приховати, вона повинна бути невеликою.

Як працює ця гра?

Гра - досить простий алгоритм. Він зменшує алфавітний рядок, поки його більше не можна зменшити, тим самим зробивши його своєрідним хешем. Справжню гру, яку ми робимо, люди дуже важко реалізувати, але її можна спростити за допомогою наступного алгоритму:

Ви починаєте, склавши алфавіт навпіл і вишикувавши такі шматки, як:

a b c d e f g h i j k l m
z y x w v u t s r p q o n

Потім, починаючи з середини, ви присвоюєте додатні цілі числа верхній половині, а від’ємні - нижній:

a  b  c  d  e f g h i j k l m
13 12 11 10 9 8 7 6 5 4 3 2 1

z   y   x   w   v  u  t  s  r  p  q  o  n
-13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

Потім ви берете свій рядок (ми будемо використовувати hello world) і ігноруючи будь-які неабетичні символи, перекладіть його:

h e l l  o w   o  r  l d
6 9 2 2 -2 -10 -2 -5 2 10

Потім ви підсумовуєте літерні значення. Ті, що викладені на попередній діаграмі (наприклад, dі w, lі o), скасують, а інші додадуть.

sum(6 9 2 2 -2 -10 -2 -5 2 10 )=12

12 - це число для b, тому хеш hello worldєb

Для слова , які повністю врівноважує (наприклад love), то вивести «0 символ»: -. Зауважте, що вхідні дані -все ще не враховуються. Має значення лише у виході.

Якщо величина чисельності більша за 13, тоді ви починаєте подвоюватися на a"s" і z"s" Ви в основному берете стільки a"s" або z"fit" в число, і берете все, що залишилося в останній букві, як так:

code golf: 43.

Підходить 3 a-х і має 4:

aaa 4: j
result: aaaj

Підказка: Ця частина в основному виключається divmodза винятком того, що вона закручується до нуля, а не -infinity(наприклад, -43 стане 3 z-м і, а -4це pтак zzzp).

Примітка: тире не підходить, якщо a«або z» ідеально вписується, лише якщо це точно 0.

Роз'яснення:

  • Хеш випадок в чутливий
  • Стандартні лазівки заборонені
  • Введення / виведення може бути у будь-якому форматі, який не надто чужий, stdin, stdout, аргумент командного рядка, функція тощо
  • Це тому найкоротший розмір виграє в байтах .

Приклади:

hello world  -->  b

love  -->  -

this is an example -->  aak

hello *&*(&(*&%& world  -->  b

good bye --> ae

root users --> zzs

3
loveпорожній ...
Джастін

Відповіді:


4

CJam, 46 байт

Спробуйте в Інтернеті або спробуйте тестовий набір в Інтернеті .

lel{'n-_W>+_zE<*}%:+{_De<C~e>___0>-'n+'-?o-}h;

Пояснення

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

lel             "Read a line of input and convert all letters to lowercase.";
{               "Map each character:";
  'n-_W>+         "Map each character to its negated value by subtracting 'n'
                   and incrementing if the result is nonnegative.";
  _zE<*           "If the value is out of the letter range, use 0 instead.";
}%
:+              "Compute the sum of the mapped character values.";
{               "Do...";
  _De<C~e>        "Compute the sum clamped to the letter range.";
  __              "If the clamped sum is nonzero, ...";
  _0>-'n+         "... then produce the clamped sum mapped back to a letter by
                     decrementing if it is positive and adding 'n', ...";
  '-              "... else produce '-'.";
  ?
  o               "Output the character produced above.";
  -               "Subtract the clamped sum out of the sum.";
}h              "... while the sum is nonzero.";
;               "Clean up.";

4

Піта, 79 78 77 65 61 58

J+\-GK+0fTr13_14=ZsX@JzJKMe,pk*G/H13%H13@JxK?g\aZ>Z0_g\z_Z

Ви можете використовувати @Jzзамість f}YJzТам, мабуть, більше, але я повинен спати зараз. Удачі;)
FryAmTheEggman

@FryAmTheEggman Класно, я не знав про перетин @!
orlp


1

R, 258 байт

function(s){a=13;r=data.frame;z=strsplit(gsub("[^a-z]","",tolower(s)),"")[[1]];d=r(l=rev(letters),h=c(-1*a:1,1:a));m=merge(r(l=z),d);n=sum(m$h);q=abs(n);v=rep(ifelse(n>0,"a","z"),q%/%a);paste0(paste(v,collapse=""),d$l[d$h==sign(n)*q%%a],ifelse(n==0,"-",""))}

Це повинен бути найсуворіший R-код коли-небудь. Я вважав, що R може бути гідним вибором, оскільки він має вектор усіх літер "а" через "z" як вбудовану глобальну змінну. Але виявляється, решта - безлад.

Недоліковані + пояснення:

function(s) {
    a <- 13              # Store the value associated with a
    r <- data.frame      # Store the `data.frame` function

    # Split the input into a vector, ignoring case and non-letters
    z <- strsplit(gsub("[^a-z]", "", tolower(s)), "")[[1]]

    # Create a data frame where the first column is the letters
    # z through a and the second is the associated scores
    d <- data.frame(l=reverse(letters), h=c(-1*a:1, 1:a))

    # Merge the split vector with the data frame of scores
    m <- merge(data.frame(l=z), d)

    # Get the total score for the input
    n <- sum(m$h)
    q <- abs(n)

    # Pad the output with a or z as necessary
    v <- rep(ifelse(n > 0, "a", "z"), q %/% a)

    # Collapse the vector of a's or z's into a string
    out1 <- paste(v, collapse="")

    # Look up the letter associated with remainder
    out2 <- d$l[d$h == sign(n)*q%%a]

    # If n = 0, we still want a dash
    out3 <- ifelse(n == 0, "-", "")

    # Return the concatenation of all pieces of the output
    paste0(out1, out2, out3)
}

Це створює неназваний об'єкт функції, який приймає рядок як вхідний і повертає пов'язане хеш-значення. Щоб зателефонувати, дайте ім’я, наприклад f=function(s){...}.

Приклади:

> f("this is an example")
[1] "aak"

> f("root users")
[1] "zzs"

> f("love")
[1] "-"

> f("People like grapes.")
[1] "aaag"

Спробуйте в Інтернеті!

Питання? Я із задоволенням надам будь-яке подальше пояснення. Пропозиції? Пропозиції більш ніж вітаються!


1

Haskell, 171 байт

import Data.Char
m=13
l=zip['a'..'z'][-i|i<-[-m..m],i/=0]
p 0="-"
p n|n>m='a':p(n-m)|n<(-m)='z':p(n+m)|1<2=[c|(c,i)<-l,i==n]
f n=p$sum[y|Just y<-[lookup(toLower x)l|x<-n]]

Пробіг:

> map f ["hello world", "love", "this is an example", "hello *&*(&(*&%& world", "good bye", "root users"]
["b","-","aak","b","ae","zzs"]

Як це працює: lце таблиця пошуку від букв до відповідного значення. Знайдіть усі символи з вхідного рядка та відкиньте не знайдені. Підсумуйте отриманий список. Залежно від суми pдрукує -або, можливо, спочатку деякий as або zs і нарешті (зворотний-) шукає лист від l.


1

R - 200

function(s){l=letters
N=setNames
x=strsplit(tolower(s),'')[[1]]
n=(13:-13)[-14]
v=sum(N(n,l)[x[x%in%l]])
o=''
while(v){d=min(max(v,-13),13)
o=paste0(o,N(l,n)[as.character(d)])
v=v-d}
if(o=='')o='-'
o}

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