Soundex 기능


13

대문자 AZ 만 포함하는성에 대한 American Soundex 코드 를 생성하는 가장 짧은 함수를 작성하십시오 . 접두사를 제거 할 필요는없고 제거하지 않아야하지만 함수는 링크 된 모든 페이지의 예제와 일치하는 출력을 생성해야합니다 (아래 제공됨). 출력의 하이픈은 선택 사항입니다. 즐기세요!

참고 : PHP에 포함 된 기능이나 다른 프로그래밍 언어 의 기능은 사용할 수 없습니다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

펄, 143150

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에서 읽고 쓰는 중이었습니다. 그 문제를 해결하려면 7 명의 캐릭터가 필요했습니다.


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

-마지막 절 (자음 구분자로 H 또는 W)을 수정했습니다. Ashcraft는 이제 올바른 결과를 얻었습니다. - DICT 작게 - 포맷하기가 (파이썬 2.6을 필요로하지 않습니다) 작은 -에 대한 간단한 DICT 검색 k 에서 변경된 모음 값 - '*'''.append+=[i] 제거 전화 - FTW 목록의 이해 - upper: D

더 이상 골프를 칠 수 없습니다. 실제로 나는했다. 이제는 더 이상 골프를 칠 수 없다고 생각합니다! 그것을 다시했다...

변환 표 사용하기 :

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

예상대로.


큰. 입력을 대문자로 변환 할 필요는 없습니다. 이미 있다고 가정 할 수 있습니다.
PleaseStand

»더 이상 골프를 칠 수 없습니다«그 단어는 거의 적합하지 않습니다 :-)
Joey

@Joey Python은 코드 골프를위한 최고의 언어가 아닙니다 ...
퍼블 (

너무 긴 식별자로 인해 어려움을 겪습니다. 일반적으로 PowerShell을 사용하여 Python을 이길 수는 있지만 목록 이해는 이길 수 없습니다.
Joey

@Joey 이제 PowerShell을 사용하여 Python을 이길 수 있도록 조금 더 노력해야합니다 .P
JBernardo

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}

번역 테이블과 함께 Howard의 솔루션을 사용하고 있습니다 ( y/A-Z/table/s모든 대신 s/[ABC]+/N/g)


2

J-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

GolfScript (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. 그러나 이것은 문자열에서 모든 Hs와 Ws를 제거하여 사소하게 구현할 수 없습니다 . 왜냐하면 (실제에서는 가능성이 없지만 사양에서 배제되지 않았 음) 첫 번째 문자가 H또는 W두 번째 문자가 자음이기 때문입니다. 첫 글자를 제거 할 때 자음을 제거 할 필요는 없습니다. (이것을 확인하기 WM위해 테스트 케이스 를 추가했습니다 W500).

그래서 내가 처리하는 방식은 접기를 수행 하고 이전의 것과 같거나 내부 코드 와 같은 첫 번째 (접기 사용의 편리한 부작용) 이외의 각 문자를 삭제 하는 것입니다 .7HW

주어 ab스택에, 순진한 방법이 있는지 여부를 확인하는 a == b || b == 7

.2$=1$7=+

그러나 계산 된 스택에서 복사를 사용하면 2 문자를 절약 할 수 있습니다.

.7=$

하면 b된다 동일 7후 복사 a; 그렇지 않으면 복사 b합니다. 그럼으로 비교 a하면 우리 보장 truthy 값을 얻을 수 b있었다 7관계없이 값 a. (농장의 무게가 나가기 전에 GolfScript에는 NaN이 없습니다).


0

PowerShell, 150161

먼저 시도해 보면 골프가 더 많이있을 수 있다고 확신합니다.

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

링크 된 페이지와 Wikipedia 기사의 테스트 케이스에서 올바르게 작동합니다.

Jackson, Pfister, Tymczak, Gutierrez, Ashcraft, Ashcroft, VanDeusen, Robert, Rupert, Rubin, Washington, Lee


0

루비 140

Ruby 2.0을 사용하고 있지만 이전 버전에서도 작동해야한다고 생각합니다.

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


0

APL (83)

{(⊃⍵),,/⍕¨3↑0~⍨1↓K/⍨~K=1⌽K←0,⍨{7|+/' '=S↑⍨⍵⍳⍨S←' BFPV CGJKQSXZ DT L MN R'}¨⍵~'HW'}⍞
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.