স্ট্রিং দূরত্ব


28

চ্যালেঞ্জ

একটি সমস্ত-ছোট হাতের স্ট্রিংয়ের একটি ইনপুট দেওয়া হয়েছে [a-z], অক্ষরের মধ্যে মোট দূরত্ব আউটপুট দেয়।

উদাহরণ

Input: golf

Distance from g to o : 8
Distance from o to l : 3
Distance from l to f : 6

Output: 17

বিধি

  • স্ট্যান্ডার্ড লুফোলস নিষিদ্ধ
  • এটি - বাইট জয়ের সংক্ষিপ্ত উত্তর।
  • বর্ণমালাটি উভয় দিক থেকে অতিক্রম করা যেতে পারে। আপনার অবশ্যই সর্বদা সংক্ষিপ্ততম পথটি ব্যবহার করা উচিত। (DISTANCE অর্থাৎ মধ্যবর্তী xএবং c5)।

1

পরীক্ষার মামলা

Input: aa
Output: 0

Input: stack
Output: 18

Input: zaza
Output: 3

Input: valleys
Output: 35

উত্তর:


11

জেলি , 11 8 বাইট

OIæ%13AS

সংরক্ষিত 3 @ ধন্যবাদ বাইট মার্টিন Ender

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন।

ব্যাখ্যা

OIæ%13AS  Input: string Z
O         Ordinal. Convert each char in Z to its ASCII value
 I        Increments. Find the difference between each pair of values
  æ%13    Symmetric mod. Maps each to the interval (-13, 13]
      A   Absolute value of each
       S  Sum
          Return implicitly

6
æ%অন্য দিন বিল্ট-ইনগুলি পড়ার সময় আমি এসে পৌঁছেছিলাম এবং এটি (ধরণের) সমস্যার জন্য এটি বেশ তৈরি হয়েছিল:OIæ%13AS
মার্টিন এন্ডার

আমি মনে করি এটি 9 বাইট ( æদুটি হয়)।
আলেক্সেই জাব্রোডস্কি

1
@ এলমিগ্রান্টো জেলি এর একটি কোডপেজ রয়েছে যা এর প্রতিটি চরিত্রকে একটি বাইটে এনকোড করে দেয়: github.com/DennisMitchell/jelly/wiki/Code-page
Ruds

10

হাস্কেল, 57 56 বাইট

q=map$(-)13.abs
sum.q.q.(zipWith(-)=<<tail).map fromEnum

ব্যবহারের উদাহরণ: sum.q.q.(zipWith(-)=<<tail).map fromEnum $ "valleys"-> 35

কিভাবে এটা কাজ করে:

q=map$(-)13.abs                -- helper function.
                               -- Non-pointfree: q l = map (\e -> 13 - abs e) l
                               -- foreach element e in list l: subtract the
                               -- absolute value of e from 13

               map fromEnum    -- convert to ascii values
      zipWith(-)=<<tail        -- build differences of neighbor elements
  q.q                          -- apply q twice on every element
sum                            -- sum it up

সম্পাদনা করুন: @ ড্যামিয়েন একটি বাইট সংরক্ষণ করেছেন। ধন্যবাদ!



বাহ ভাল এক! আপনি এক বাইট mapq
ড্যামিয়েন

@ ডামিয়েন: ভাল দাগযুক্ত। ধন্যবাদ!
নিমি

8

এমএটিএল , 14 , 10 বাইট

dt_v26\X<s

এটি অনলাইন চেষ্টা করুন!

4 বাইট বাঁচানোর জন্য @ স্যুভারকে ধন্যবাদ !

ব্যাখ্যা:

d           % Take the difference between consecutive characters
 t_         % Make a copy of this array, and take the negative of each element
   v        % Join these two arrays together into a matrix with height 2
    26\     % Mod 26 of each element
       X<   % Grab the minimum of each column
         s  % Sum these. Implicitly print

পূর্ববর্তী সংস্করণ:

d26\t13>26*-|s

6

পাইথন 3, 69 68 বাইট

lambda s:sum([13-abs(13-abs(ord(a)-ord(b)))for a,b in zip(s,s[1:])])

ভাঙ্গন:

lambda s:
         sum(                                                      )
             [                             for a,b in zip(s,s[1:])]
              13-abs(13-abs(ord(a)-ord(b)))

1
এর আগে স্থানটি সরিয়ে আপনি একটি বাইট হারাতে পারেনfor
ড্যানিয়েল

@ ডপাপ ওহ হ্যাঁ, ধন্যবাদ!
বুসুক্সুয়ান

2
আপনি অক্ষরগুলির তালিকা হিসাবে ইনপুটটি নিতে পারেন এবং 3 বাইট সংরক্ষণ করতে পুনরাবৃত্তিটি ব্যবহার করতে পারেন:f=lambda a,b,*s:13-abs(13-abs(ord(a)-ord(b)))+(s and f(b,*s)or 0)
জোনাথন অ্যালান

5

জাভা, 126 120 117 বাইট

int f(String s){byte[]z=s.getBytes();int r=0,i=0,e;for(;++i<z.length;r+=(e=(26+z[i]-z[i-1])%26)<14?e:26-e);return r;}

আসল সংস্করণে একটি বাগ চিহ্নিত করার জন্য এবং লুপটি ফাঁকা করার পরামর্শ দেওয়ার জন্য @ কেভিন ক্রুজসেনকে ধন্যবাদ।

এর (26 + z[i] - z[i - 1]) % 26)উত্তরটি উত্তরটির উত্তর @ নীলের একটি মন্তব্য থেকে অনুপ্রাণিত হয়েছে। কারণ (26 + ...)%26হিসাবে একই উদ্দেশ্যে কাজ করে ।Math.abs(...)...? e : 26 - e

অসমাপ্ত :

int f(String s) {
    byte[]z = s.getBytes();
    int r = 0, i = 0, e;
    for (; ++i < z.length; r += (e = (26 + z[i] - z[i - 1]) % 26) < 14 ? e : 26 - e);
    return r;
}

সাইটে স্বাগতম! এই কি ভাষা? এটি কতটি অক্ষর / বাইট? আপনি উচিত [edit] those details into the top of your post, with this markdown: #Language, এন bytes`
DJMcMayhem

ঠিক আছে. ধন্যবাদ। আমি এটি সম্পাদনা করেছি। কোন উন্নতি? :)
টডিল

1
আপনি আপনার অলংগ সংস্করণে -একটি হারিয়ে eযাচ্ছেন।
নীল

2
পিপিসিজিতে আপনাকে স্বাগতম! হুম, আমি একটি "টাইপ মেলাম্প: এন্টার থেকে বাইটে রূপান্তর করতে পারি না" ত্রুটিতে ত্রুটি হয় e=z[i]-z[i-1];তাই আপনার হয় কাস্টের প্রয়োজন হয় (byte)বা এতে পরিবর্তন করতে eপারেন int। : উপরন্তু, আপনি ভিতরে জন্য-লুপ, ভালো সবকিছু স্থাপন দ্বারা জন্য-লুপ বন্ধনী অপসারণ করতে পারেন int f(String s){byte[]z=s.getBytes();int r=0,i=0,e;for(;++i<z.length;r+=(e=z[i]-z[i-1])>0?e<14?e:26-e:-e<14?-e:e+26);return r;}(দ্রষ্টব্য: বিপরীত জন্য-লুপ দুর্ভাগ্যবশত একই দৈর্ঘ্য হল: int f(String s){byte[]z=s.getBytes();int r=0,i=z.length-1,e;for(;i>0;r+=(e=z[i]-z[--i])>0?e<14?e:26-e:-e<14?-e:e+26);return r;}
কেভিন Cruijssen

1
অনেক ধন্যবাদ @ কেভিন ক্রুজসেন: ডি। আপনার পরামর্শটি অনেক সাহায্য করেছে।
todeale

3

জাভাস্ক্রিপ্ট (ES6), 84 82 79 বাইট

সাইয়েসকে 3 বাইট সংরক্ষণ করা হয়েছে:

f=([d,...s],p=parseInt,v=(26+p(s[0],36)-p(d,36))%26)=>s[0]?f(s)+(v>13?26-v:v):0

ব্যাখ্যা:

f=(
  [d,...s],                    //Destructured input, separates first char from the rest
  p=parseInt,                  //p used as parseInt
  v=(26+p(s[0],36)-p(d,36))%26 //v is the absolute value of the difference using base 36 to get number from char
  )
)=>
  s[0]?                        //If there is at least two char in the input
    f(s)                       //sum recursive call
    +                          //added to
    (v>13?26-v:v)              //the current shortest path
  :                            //else
    0                          //ends the recursion, returns 0

উদাহরণ:
কল: f('golf')
আউটপুট:17


পূর্ববর্তী সমাধান:

82 নাইটকে ধন্যবাদ বাইটস:

f=([d,...s],v=(26+parseInt(s[0],36)-parseInt(d,36))%26)=>s[0]?f(s)+(v>13?26-v:v):0

84 বাইট:

f=([d,...s],v=Math.abs(parseInt(s[0],36)-parseInt(d,36)))=>s[0]?f(s)+(v>13?26-v:v):0

1
পরিবর্তে Math.abs(...)আপনি ব্যবহার করতে পারেন (26+...)%26; এটি কাজ করে কারণ আপনি 13 এর উপরে মানগুলি উল্টাচ্ছেন। (আমি মনে করি এমএটিএল উত্তরটি এভাবেই কাজ করে))
নীল

1
মাধ্যমে কোডের prepending কিছু বাইট সংরক্ষণ p=parseInt;এবং তারপর ব্যবহার p()পরিবর্তেparseInt()
Cyoce

3

রুবি, 73 বাইট

->x{eval x.chars.each_cons(2).map{|a,b|13-(13-(a.ord-b.ord).abs).abs}*?+}


2

05 এ বি 1 ই , 12 বাইট

SÇ¥YFÄ5Ø-}(O

ব্যাখ্যা

SÇ                   # convert to list of ascii values
  ¥                  # take delta's
   YF    }           # 2 times do
     Ä5Ø-            # for x in list: abs(x) - 13
          (O         # negate and sum

এটি অনলাইন চেষ্টা করুন!


এটি 12 টি প্রতীক, বাইট নয়। ইউটিএফ -8 এর বাইট দৈর্ঘ্য 16 হবে।
আলেকসেই জ্যাব্রোডস্কি

@ এলমিগ্রান্তো: আসলেই। ইউটিএফ -8 এ ক্ষেত্রে এটি হতে পারে তবে 05AB1E সিপি -1222 ব্যবহার করে যেখানে এটি 12 বাইট।
Emigna

2

পার্ল, 46 বাইট

জন্য +3 অন্তর্ভুক্ত -p(কোড রয়েছে ')

চূড়ান্ত নিউলাইন ছাড়াই STDIN এ ইনপুট দিন:

echo -n zaza | stringd.pl

stringd.pl:

#!/usr/bin/perl -p
s%.%$\+=13-abs 13-abs ord($&)-ord$'.$&%eg}{

2

রেকেট 119 বাইট

(λ(s)(for/sum((i(sub1(string-length s))))(abs(-(char->integer
(string-ref s i))(char->integer(string-ref s(+ 1 i)))))))

পরীক্ষামূলক:

(f "golf")

আউটপুট:

17

বিস্তারিত সংস্করণ:

(define(f s)
  (for/sum((i(sub1(string-length s))))
    (abs(-(char->integer(string-ref s i))
          (char->integer(string-ref s(+ 1 i)))))))

আপনি প্রতিস্থাপন (define(f s)করতে পারেন (lambda(s), 2 বাইট সংক্ষিপ্ত (বেনামে ফাংশনগুলি ভাল)।
ফেডারেশন এস।

1
অপেক্ষা করুন, র‌্যাকেটটিও গ্রহণ করা উচিত (λ(s), যা যদি ইউটিএফ 8-তে 6 বাইট হয় তবে আমি মনে করি
ফেডারেশন এস।

এটা করো. ধন্যবাদ।
rnso

2

সি #, 87 85 বাইট

উন্নত সমাধান - 2 বাইট সংরক্ষণ করার জন্য অ্যাড & মডুলো ট্রিকের সাথে ম্যাথ.এবস () প্রতিস্থাপন করুন:

s=>{int l=0,d,i=0;for(;i<s.Length-1;)l+=(d=(s[i]-s[++i]+26)%26)>13?26-d:d;return l;};

প্রাথমিক সমাধান:

s=>{int l=0,d,i=0;for(;i<s.Length-1;)l+=(d=Math.Abs(s[i]-s[++i]))>13?26-d:d;return l;};

এটি অনলাইন চেষ্টা করুন!

পরীক্ষার কেস সহ পুরো উত্স:

using System;

namespace StringDistance
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<string,int>f= s=>{int l=0,d,i=0;for(;i<s.Length-1;)l+=(d=Math.Abs(s[i]-s[++i]))>13?26-d:d;return l;};

            Console.WriteLine(f("golf"));   //17
            Console.WriteLine(f("aa"));     //0
            Console.WriteLine(f("stack"));  //18
            Console.WriteLine(f("zaza"));   //3
            Console.WriteLine(f("valleys"));//35
        }
    }
}

2

আসলে, 21 বাইট

আংশিকভাবে সিআইআরানা এর রুবি উত্তরের উপর ভিত্তি করে ।

এখানে একটি বাগ রয়েছে O(এক্ষেত্রে মানচিত্রের অর্ডার () একটি স্ট্রিংয়ের উপরে) যেখানে এটি প্রথমে মানচিত্রে কোনও তালিকায় রূপান্তর না করে d(ডিকু নীচের উপাদান) এবং p(পপ প্রথম উপাদান) দিয়ে কাজ করবে না #। এই বাগটি ঠিক করা হয়েছে, তবে যেহেতু এই চ্যালেঞ্জটি তার চেয়ে নতুনতর তাই এটি আমি রেখেছি #

সম্পাদনা করুন: এবং সেপ্টেম্বর থেকে বাইট গণনাটি ভুল। উপস।

গল্ফিং পরামর্শ স্বাগত জানাই। এটি অনলাইন চেষ্টা করুন!

O#;dX@pX♀-`A;úl-km`MΣ

Ungolfing

         Implicit input string.
          The string should already be enclosed in quotation marks.
O#       Map ord() over the string and convert the map to a list. Call it ords.
;        Duplicate ords.
dX       Dequeue the last element and discard it.
@        Swap the with the duplicate ords.
pX       Pop the last element and discard it. Stack: ords[:-1], ords[1:]
♀-       Subtract each element of the second list from each element of the first list.
          This subtraction is equivalent to getting the first differences of ords.
`...`M   Map the following function over the first differences. Variable i.
  A;       abs(i) and duplicate.
  úl       Push the lowercase alphabet and get its length. A golfy way to push 26.
  -        26-i
  k        Pop all elements from stack and convert to list. Stack: [i, 26-i]
  m        min([i, 26-i])
Σ        Sum the result of the map.
         Implicit return.

1

জাভা 7,128 বাইট

 int f(String s){char[]c=s.toCharArray();int t=0;for(int i=1,a;i<c.length;a=Math.abs(c[i]-c[i++-1]),t+=26-a<a?26-a:a);return t;}

Ungolfed

 int f(String s){
 char[]c=s.toCharArray();
 int t=0;
 for(int i=1,a;
     i<c.length;
   a=Math.abs(c[i]-c[i++-1]),t+=26-a<a?26-a:a);
return t;
 }

1

পাইথ, 20 বাইট

Lm-13.adbsyy-M.:CMQ2

একটি প্রোগ্রাম যা STDIN এ একটি উদ্ধৃত স্ট্রিংয়ের ইনপুট নেয় এবং ফলাফল মুদ্রণ করে।

এটি অনলাইনে চেষ্টা করুন

কিভাবে এটা কাজ করে

Lm-13.adbsyy-M.:CMQ2  Program. Input: Q
L                     def y(b) ->
 m      b              Map over b with variable d:
  -13                   13-
     .ad                abs(d)
                CMQ   Map code-point over Q
              .:   2  All length 2 sublists of that
            -M        Map subtraction over that
          yy          y(y(that))
         s            Sum of that
                      Implicitly print

1

ডিসি + ওড, 65 বাইট

od -tuC|dc -e'?dsN0sT[lNrdsNr-d*vdD[26-]sS<Sd*vlT+sTd0<R]dsRxlTp'

ব্যাখ্যা:

কারণ এ ডিসি আপনি একটি স্ট্রিং এর অক্ষর অ্যাক্সেস করতে পারছি না, আমি ব্যবহার আদ্যাশক্তি ASCII মান জন্য। এগুলি এর মতো স্ট্যাক (লিফো ধারক) থেকে বিপরীত ক্রমে প্রক্রিয়া করা হবে:

dsN0sT             # initialize N (neighbor) = top ASCII value, and T (total) = 0
[lNrdsNr-          # loop 'R': calculate difference between current value and N,
                   #updating N (on the first iteration the difference is 0)
   d*vdD[26-]sS<S  # get absolute value (d*v), push 13 (D) and call 'S' to subtract
                   #26 if the difference is greater than 13
   d*vlT+sT        # get absolute value again and add it to T
d0<R]dsR           # repeat loop for the rest of the ASCII values
xlTp               # the main: call 'R' and print T at the end

চালান:

echo -n "golf" | ./string_distance.sh

আউটপুট:

17

1

সি, 82 86 83 76 বাইট

t,u;f(char*s){for(t=0;*++s;u=*s-s[-1],t+=(u=u<0?-u:u)>13?26-u:u);return t;}

ধরে নিই ইনপুট স্ট্রিং কমপক্ষে একটি অক্ষর দীর্ঘ। এটির প্রয়োজন নেই#include<stdlib.h>

সম্পাদনা: আরগ, ক্রম পয়েন্ট!

আইডিয়নে চেষ্টা করে দেখুন


আদর্শ সংকলনে স্ট্রিং "nwlrbb" এবং সমস্ত র‌্যান্ড স্ট্রিং আমি চেষ্টা করি 6 টি লেন ফিরে
আসি

হ্যাঁ এখন এটি ঠিক আছে বলে মনে হচ্ছে ...
RosLuP

1

সি, 70 বাইট 76 বাইট

k,i;f(char *s){for(i=0;*++s;i+=(k=abs(*s-s[-1]))>13?26-k:k);return i;}

1

স্কালা, 68 বাইট

def f(s:String)=(for(i<-0 to s.length-2)yield (s(i)-s(i+1)).abs).sum

সমালোচনা স্বাগত।


1

সি #, 217 বাইট

Golfed:

IEnumerable<int>g(string k){Func<Char,int>x=(c)=>int.Parse(""+Convert.ToByte(c))-97;for(int i=0;i<k.Length-1;i++){var f=x(k[i]);var s=x(k[i+1]);var d=Math.Abs(f-s);yield return d>13?26-Math.Max(f,s)+Math.Min(f,s):d;}}

Ungolfed:

IEnumerable<int> g(string k)
{
  Func<Char, int> x = (c) => int.Parse("" + Convert.ToByte(c)) - 97;
  for (int i = 0; i < k.Length - 1; i++)
  {
    var f = x(k[i]);
    var s = x(k[i + 1]);
    var d = Math.Abs(f - s);
    yield return d > 13 ? 26 - Math.Max(f, s) + Math.Min(f, s) : d;
  }
}

আউটপুট:

aa: 0
stack: 18
zaza: 3
valleys: 35

বাইটে রূপান্তরিত হলে 'এ' 97 হয়, সুতরাং প্রতিটির থেকে 97 টি বিয়োগ হয়। যদি পার্থক্যটি 13 এর চেয়ে বেশি হয় (অর্থাত্ বর্ণমালার অর্ধেক), তবে প্রতিটি অক্ষরের মধ্যে পার্থক্য (বাইট মান) ২ from থেকে বিয়োগ করুন "


1
দুটি অকেজো সাদা স্থান: দু'জনের আগেই '
Yytsi

0

পাইথন 3, 126 বাইট

তালিকা সঙ্গে ধী।

d=input()
print(sum([min(abs(x-y),x+26-y)for x,y in[map(lambda x:(ord(x)-97),sorted(d[i:i+2]))for i in range(len(d))][:-1]]))

চমৎকার উত্তর. আপনি প্রতিস্থাপন করতে পারে abs(x-y)দ্বারা y-xকল যেহেতু sortedকরতে x < y
টডিল


0

জাভা, 109 বাইট

int f(String s){int x=0,t,a=0;for(byte b:s.getBytes()){t=a>0?(a-b+26)%26:0;t=t>13?26-t:t;x+=t;a=b;}return x;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.