একটি পরিবর্তনশীল দৈর্ঘ্যের হ্যাশ প্রয়োগ করুন


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এবং zএর মুলত আপনি মূলত সংখ্যায় অনেকগুলি aবা z'ফিট' নিয়ে যান এবং যা শেষ অক্ষরে রেখে যায় তা তেমন গ্রহণ করুন:

code golf: 43.

3 টি ফিট করে aএবং 4 টি বাকি রয়েছে:

aaa 4: j
result: aaaj

ইঙ্গিত: এই অংশটি মূলত divmodশূন্যের দিকে -infinityগোলাকার ব্যতীত (উদাহরণস্বরূপ -৩৩ 3 z'এর হয়ে উঠবে এবং -4যা pতাই zzzp)।

নোট: ড্যাশ যদি আসে না a's অথবা z' পুরোপুরি মধ্যে গুলি হইয়া, শুধুমাত্র যদি এটা ঠিক 0

ব্যাখ্যা:

  • হ্যাশ ক্ষেত্রে দেখা যায় এর মধ্যে সংবেদনশীল
  • স্ট্যান্ডার্ড লুফোলগুলি অনুমোদিত নয়
  • আই / ও যে কোনও ফর্ম্যাটে থাকতে পারে যা খুব বেশি বিদেশী, স্টিডিন, স্টডআউট, কমান্ড-লাইন আরগ, ফাংশন ইত্যাদি নয় in
  • এটি তাই বাইট জিতে সংক্ষিপ্ত আকার ।

উদাহরণ:

hello world  -->  b

love  -->  -

this is an example -->  aak

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

good bye --> ae

root users --> zzs

3
loveখালি ...
জাস্টিন

উত্তর:


4

সিজেম, 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

@ ফ্রাইআম দ্য এজিগম্যান কুল, আমি কোন ছেদটি সম্পর্কে জানতাম না @!
orlp


1

আর, 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,"-",""))}

এটি সর্বদা গ্রোসেস্ট আর কোড হতে হবে। আমি অনুভব করেছি যে এটি একটি উপযুক্ত পছন্দ হতে পারে কারণ এটি বিল্ট-ইন গ্লোবাল ভেরিয়েবল হিসাবে "এ" মাধ্যমে "জেড" এর মাধ্যমে সমস্ত অক্ষরের একটি ভেক্টর রয়েছে। তবে দেখা যাচ্ছে বাকিটা একটা গণ্ডগোল।

অবহেলিত + ব্যাখ্যা:

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

হাস্কেল, 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মুদ্রণের উপর নির্ভর করে -বা সম্ভবত প্রথমে কিছু aগুলি বা zগুলি এবং অবশেষে (বিপরীত) চিঠিটি দেখে l


1

আর - 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, আমার আর উত্তরের চেয়ে অবশ্যই ভাল। চমৎকার কাজ!
অ্যালেক্স এ।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.