সাউন্ডেক্স ফাংশন


13

আমেরিকান সাউন্ডেক্স কোড উত্সের জন্য কেবলমাত্র বড় হাতের অক্ষর AZ রয়েছে এমন সংক্ষিপ্ত বিবরণ লিখুন । আপনার ফাংশনটিতে অবশ্যই লিঙ্কযুক্ত সমস্ত পৃষ্ঠার উদাহরণের সাথে সামঞ্জস্য আউটপুট উত্পাদন করতে হবে (নীচে দেওয়া), যদিও এটির প্রয়োজন নেই এবং উপসর্গগুলি অপসারণ করা উচিত নয়। আউটপুটে হাইফেনগুলি alচ্ছিক। আনন্দ কর!

দ্রষ্টব্য: আপনি পিএইচপি অন্তর্ভুক্ত ফাংশন বা অন্যান্য প্রোগ্রামিং ভাষার সমতুল্য ব্যবহার করতে পারবেন নাsoundex()

উদাহরণ:

WASHINGTON W-252
LEE L-000
GUTIERREZ G-362
PFISTER P-236 
JACKSON J-250 
TYMCZAK T-522
VANDEUSEN V-532
ASHCRAFT A-261

উত্তর:


4

পার্ল, 143 150 টি অক্ষর

sub f{$_="$_[0]000";/./;$t=$&;s/(?<=.)[HW]//g;s/[BFPV]+/1/g;s/[CGJKQSXZ]+/2/g;s/[DT]+/3/g;s/L+/4/g;s/[MN]+/5/g;s/R+/6/g;s/(?<=.)\D//g;/.(...)/;"$t$1"}

এই সমাধানটিতে কেবল নিয়মিত এক্সপ্রেশন থাকে যা একের পর এক প্রয়োগ করা হয়। দুর্ভাগ্যক্রমে আমি লুপের সাথে সংক্ষিপ্ত উপস্থাপনাটি খুঁজে পাইনি তাই আমি স্ক্রিপ্টে সমস্ত কলকে হার্ড কোডড করেছিলাম।

একই সংস্করণ তবে আরও কিছুটা পাঠযোগ্য:

sub f{
  $_="$_[0]000";        # take first argument and append "000"
  /./;$t=$&;            # save first char to variable $t
  s/(?<=.)[HW]//g;      # remove and H or W but not the first one
  s/[BFPV]+/1/g;        # replace one or more BFPV by 1
  s/[CGJKQSXZ]+/2/g;    # replace one or more CGJKQSXZ by 2
  s/[DT]+/3/g;          # replace one or more DT by 3
  s/L+/4/g;             # replace one or more L by 4
  s/[MN]+/5/g;          # replace one or more MN by 5
  s/R+/6/g;             # replace one or more R by 6
  s/(?<=.)\D//g;        # remove and non-digit from the result but not the first char
  /.(...)/;"$t$1"       # take $t plus the characters 2 to 4 from result
}

সম্পাদনা 1: এখন সমাধানটি একটি ফাংশন আকারে লেখা হয়। আগেরটি পড়া / লেখা থেকে STDIN / STDOUT এ ছিল was এর চারপাশে কাজ করতে আমার জন্য সাতটি চরিত্রের ব্যয় হয়েছে।


2

eTeX, 377।

\let\E\expandafter
\def\x#1;#2#3{\def\s##1#2{##1\s#3}\edef\t{\s#1\iffalse#2\fi}\E\x\t;}
\def\a[#1#2]{\if{{\fi\uppercase{\x#1,#2};B1F1P1V1C2G2J2K2Q2S2X2Z2D3T3L4M5N5R6A7E7I7O7U7
    H{}W{}Y{}{11}1{22}2{33}3{44}4{55}5{66}6{{}\toks0\bgroup}!}\E\$\t0000!#1}}
\def\$#1,#2{\if#1#2\relax\E\%\else\E\%\E#2\fi}
\def\%{\catcode`79 \scantokens\bgroup\^}
\def\^#1#2#3#4!#5{\message{#5#1#2#3}\end}
\E\a

হিসাবে চালান etex filename.tex [Ashcraft]


2

পাইথন, 274 285 241 235 225 200 190 183 179 174 166 161

- স্থির সর্বশেষ ধারা (ব্যঞ্জন বিভাজক হিসাবে এইচ বা ডাব্লু)। অ্যাশক্র্যাটের এখন সঠিক ফলাফল রয়েছে has - মেড অভি ছোট - Formating ছোট (পাইথন 2.6 প্রয়োজন হয় না) - জন্য সহজ অভি অনুসন্ধান k থেকে পরিবর্তিত স্বরবর্ণ মান - '*'থেকে ''এবং .appendথেকে +=[i] সরানো কল - তালিকা ধী FTW এর - upper: ডি

আমি আর গল্ফ করতে পারি না। আসলে আমি করেছি। এখন আমি মনে করি আমি আর গল্ফ করতে পারি না! আবারো করেছি...

অনুবাদ টেবিল ব্যবহার:

def f(n):z=n.translate(65*'_'+'#123#12_#22455#12623#1_2#2'+165*'_').replace('_','');return n[0]+(''.join(('',j)[j>'#']for i,j in zip(z[0]+z,z)if i!=j)+'000')[:3]

পুরানো তালিকা বোঝার কোড:

x=dict(zip('CGJKQSXZDTLMNRBFPV','2'*8+'3345561111'))
def f(n):z=[x.get(i,'')for i in n if i not in'HW'];return n[0]+(''.join(j for i,j in zip([x.get(n[0])]+z,z)if i!=j)+'000')[:3]

পুরানো কোড:

x=dict(zip('CGJKQSXZDTLMNRBFPV','2'*8+'3345561111'))
def f(n):
 e=a=[];k=n[0]in x
 for i in[x.get(i,'')for i in n.upper()if i not in'HW']:
  if i!=a:e+=[i]
  a=i
 return n[0]+(''.join(e)+'000')[k:3+k]

টেস্ট:

[f(i) for i in ['WASHINGTON', 'LEE', 'GUTIERREZ', 'PFSTER', 'JACKSON',
                'TYMCZAK', 'VANDEUSEN', 'ASHCRAFT']]

দেয়:

['W252', 'L000', 'G362', 'P236', 'J250', 'T522', 'V532', 'A261']

প্রত্যাশিত.


গ্রেট। আপনার ইনপুটটি বড় হাতের মধ্যে রূপান্তর করতে হবে না; আপনি ইতিমধ্যে এটি ধরে নিতে পারেন।
স্ট্যান্ড করুন

»আমি আর গল্ফ করতে পারছি না« এই শব্দগুলি খুব কমই উপযুক্ত :-)
জয়ে

@ জোয়ে পাইথন কোড গল্ফের জন্য সেরা ভাষা নয় ... কেবল যদি পার্ল হিসাবে এটি প্রথম শ্রেণীর রেজেক্স থাকে ...
জবার্নার্ডো

এটি বেশি দীর্ঘ শনাক্তকারীদের সাথে ভুগছে, ইমো। সাধারণত আমি পাইথনকে পাওয়ারশেলের সাহায্যে পরাজিত করতে পারি তবে তালিকার বোঝাটি বীট করা কঠিন y
জোয়

@ জোয় এখন পাওয়ারশেলের সাথে পাইথনকে হারাতে আপনাকে আরও কিছুটা কাজ করতে হবে: পি
জেবার্নার্ডো

2

পার্ল, 110

sub f{$_="$_[0]000";/./;$t=$&;s/(?<=.)[HW]//g;y/A-Z/:123:12_:22455:12623:1_2:2/s;s/(?<=.)\D//g;/.(...)/;$t.$1}

আমি আমার অনুবাদ টেবিলের সাথে হাওয়ার্ডের সমাধানটি ব্যবহার করছি ( y/A-Z/table/sপ্রত্যেকের পরিবর্তে s/[ABC]+/N/g)


2

জে - 99

{.,([:-.&' '@":3{.!.0[:(#~1,}.~:}:)^:#,@(;:@]>:@I.@:(e.&>"0 _~)[#~e.))&'BFPV CGJKQSXZ DT L MN R'@}.

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

  sndx=: {.,([:-.&' '@":3{.!.0[:(#~1,}.~:}:)^:#,@(;:@]>:@I.@:(e.&>"0 _~)[#~e.))&'BFPV CGJKQSXZ DT L MN R'@}.
  test=: ;: 'JACKSON PFISTER TYMCZAK GUTIERREZ ASHCRAFT ASHCROFT VANDEUSEN ROBERT RUPERT RUBIN WASHINGTON LEE'
  (,. sndx&.>) test


+-------+-------+-------+---------+--------+--------+---------+------+------+-----+----------+----+
|JACKSON|PFISTER|TYMCZAK|GUTIERREZ|ASHCRAFT|ASHCROFT|VANDEUSEN|ROBERT|RUPERT|RUBIN|WASHINGTON|LEE |
+-------+-------+-------+---------+--------+--------+---------+------+------+-----+----------+----+
|J250   |P123   |T520   |G362     |A261    |A261    |V532     |R163  |R163  |R150 |W252      |L000|
+-------+-------+-------+---------+--------+--------+---------+------+------+-----+----------+----+

1

গল্ফস্ক্রিপ্ট (rs 74 টি)

এই বাস্তবায়নটিতে একটি যাদু স্ট্রিং ব্যবহার করা হয়েছে যার মুদ্রণযোগ্য অক্ষর রয়েছে। ইন xxdআউটপুট ফর্ম এটা

0000000: 7b2e 313c 5c5b 7b36 3326 2741 4c15 c252  {.1<\[{63&'AL..R
0000010: d056 4c1e 8227 3235 3662 6173 6520 3862  .VL..'256base 8b
0000020: 6173 653d 7d25 7b2e 373d 2432 243d 7b3b  ase=}%{.7=$2$={;
0000030: 7d2a 7d2a 5d31 3e31 2c2d 5b30 2e2e 5d2b  }*}*]1>1,-[0..]+
0000040: 333c 7b2b 7d2f 7d3a 533b                 3<{+}/}:S;

3-বিট সংখ্যার একটি তালিকা সঙ্কুচিত করতে বেস পরিবর্তনগুলি ব্যবহার না করে, এটি হবে

{.1<\[{63&[1 0 1 2 3 0 1 2 7 0 2 2 4 5 5 0 1 2 6 2 3 0 1 7 2 0 2]=}%{.7=$2$={;}*}*]1>1,-[0..]+3<{+}/}:S;

অনলাইন পরীক্ষা

এটি মূলত বিরক্তিকর লুপগুলির একটি গুচ্ছ, তবে একটি আকর্ষণীয় কৌশল আছে:

.7=$2$=

এটি এমন ভাঁজের ভিতরে রয়েছে যার উদ্দেশ্য ডাবল অক্ষরগুলি পরিচালনা করা। একই কোড সহ সংলগ্ন বর্ণগুলি একটি Hবা এক দ্বারা পৃথক করা হলেও একটি ইউনিটে একত্রীকরণ করা হয় W। তবে স্ট্রিং থেকে সমস্ত Hগুলি ও সরানোর মাধ্যমে এটাকে তুচ্ছভাবে বাস্তবায়ন করা যায় না W, কারণ (বাস্তব জীবনে স্বীকৃত সম্ভাবনা নেই, তবে বিশেষায়িত হয়ে যায় না) ক্ষেত্রে প্রথম অক্ষরটি Hবা Wদ্বিতীয় বর্ণটি ব্যঞ্জনবর্ণ যখন আমরা প্রথম অক্ষরটি সরিয়ে ফেলি তখন আমাদের সেই ব্যঞ্জনবর্ণের দরকার নেই। (আমি একটি পরীক্ষার কেস যুক্ত করেছি WMযা W500এটি যাচাই করা উচিত )।

সুতরাং আমি যেভাবে হ্যান্ডেল করি তা হ'ল একটি ভাঁজ করা এবং প্রথমটি বাদ দিয়ে প্রতিটি অক্ষর মুছে ফেলা (ভাঁজ ব্যবহারের একটি সুবিধাজনক পার্শ্ব-প্রতিক্রিয়া) যা পূর্ববর্তীটির সমান বা এর সমান 7, এর অভ্যন্তরীণ কোড Hএবং W

দেওয়া হয়েছে aএবং bস্ট্যাকের উপর, এটি কিনা a == b || b == 7তা যাচাই করার নির্দোষ উপায়

.2$=1$7=+

তবে একটি গণিত অনুলিপি থেকে স্ট্যাক ব্যবহার করে একটি 2-চরিত্রের সঞ্চয় রয়েছে:

.7=$

যদি bসমান হয় 7তবে এটি অনুলিপি করে a; অন্যথায় এটি অনুলিপি b। আমি তখন সঙ্গে তুলনা করে aআমরা নিশ্চিত truthy মান পেতে যদি bছিল 7মূল্য নির্বিশেষে a। (কোনও পেডেন্টস ওজনের আগে, গল্ফস্ক্রিপ্টে ন্যান থাকে না)


0

পাওয়ারশেল, 150 161

প্রথমে চেষ্টা করুন এবং আমি নিশ্চিত যে আরও কিছুটা গল্ফ করা যেতে পারে।

filter s{$s=-join$_[1..9]
1..6+'$1','',$_[0]|%{$s=$s-replace('2[bfpv]2[cgjkqsxz]2[dt]2l2[mn]2r2(.)\1+2\D|^.2^'-split2)[++$a],$_}
-join"${s}000"[0..3]}

সংযুক্ত পৃষ্ঠা এবং উইকিপিডিয়া নিবন্ধ উভয় থেকে পরীক্ষার কেসগুলির সাথে সঠিকভাবে কাজ করে:

জ্যাকসন, ফাইস্টার, টিমজাক, গুটিরেজ, অ্যাশক্র্যাফট, অ্যাশক্রফ্ট, ভ্যানডিউসন, রবার্ট, রুপার্ট, রুবিন, ওয়াশিংটন, লি


0

রুবি 140

আমি রুবি ২.০ ব্যবহার করছি তবে আমি মনে করি এটি আগের সংস্করণগুলির সাথেও কাজ করা উচিত।

def f s
a=s[i=0]
%w(HW BFPV CGJKQSXZ DT L MN R).each{|x|s.gsub!(/[#{x}]+/){i>0&&$`[0]?i: ''};i+=1}
a+(s[1..-1].gsub(/\D/,'')+'000')[0,3]
end

উদাহরণ:

puts f "PFISTER" => P236


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.