Golf thực tế - Hoa Kỳ [đóng cửa]


11

Gia đình tôi có một doanh nghiệp thương mại điện tử. Trên trang web riêng của chúng tôi, chúng tôi buộc mọi người chọn trạng thái của họ từ menu thả xuống khi họ nhập địa chỉ của họ, nhưng thông qua một số kênh khác mà chúng tôi sử dụng, khách hàng có thể nhập bất cứ điều gì họ muốn vào hộp.

Mẹ tôi thích các mẫu hóa đơn tôi đã tạo cho bà, được tạo tự động. Nhưng bởi vì chúng rất đẹp và cân đối, cô ấy không thể chịu đựng được khi mọi người VIẾT RA tên của các tiểu bang của họ, hoặc tệ hơn, viết một cái gì đó như "áo mới". Cô nói rằng nó phá hỏng cái nhìn.

Bố tôi thích mã để được nhẹ. Vì vậy, thay vì sử dụng khối chuyển đổi trường hợp, anh ta muốn một giải pháp gọn gàng hơn.

Vì vậy, thách thức là tạo ra một hàm ngắn lấy các đầu vào có thể và trả về một chữ viết tắt hai chữ cái (viết hoa, cho mẹ). Chúng tôi sẽ đưa ra một giả định (bị lỗi) rằng người dùng của chúng tôi có thể đánh vần và luôn đặt một khoảng trắng trong tên (khi cần) hoặc chuyển thành chữ viết tắt chính xác. Phạm vi là 50 tiểu bang của Hoa Kỳ.

  • Newyork
  • Newyork
  • NY
  • ny

là tất cả các đầu vào chấp nhận được cho New York và nên xuất NY.

Nếu một cái gì đó như New Yrok được truyền vào, hàm có thể trả về giá trị ban đầu.

Bạn có thể sử dụng bất kỳ ngôn ngữ phổ biến. Đây là một cuộc thi phổ biến, vì vậy người nào có nhiều phiếu nhất vào cuối tuần sẽ chiến thắng. Tôi cho rằng điều này sẽ ủng hộ sự mới lạ và tiện ích.

EDIT: Mô tả là câu chuyện lộn xộn, nhưng tôi đã làm một dự án tương tự và nghĩ rằng phải có một cách thú vị hơn để làm điều đó. Tôi có thể tự thực hiện dự án (đã làm) nhưng tôi nghĩ đây là một nơi tốt cho một thử thách thú vị hơn. Bằng "Bất kỳ ngôn ngữ chung" nào, tôi đã loại trừ các ngôn ngữ / thư viện tùy chỉnh được thiết kế cho thử thách này - tôi đã cố gắng tìm kiếm các phương pháp mới, thay vì trợ giúp mã miễn phí. Tôi nghĩ rằng mọi người đã làm điều này tại một số điểm, nhưng sẽ rất vui nếu làm điều đó theo một cách khác thường. Tôi thấy rằng các dự án thú vị nhất là những dự án mà bạn giải quyết các công việc hàng ngày theo những cách mới và thú vị - đó là lý do tại sao đây là một cuộc thi phổ biến hơn là golf.


14
Tôi không chắc tại sao đây là một cuộc thi phổ biến thay vì chơi golf mã (đặc biệt là vì tên này bao gồm 'golf' và bố bạn thích mã ngắn).
Geobits

5
@Claudiu Đúng, nhưng trang web này không dành cho mã sản xuất ...
Geobits

3
@Claudiu Tôi thành thật cho rằng đó là "câu chuyện xáo trộn" thuộc loại thường xảy ra với những thử thách này. Dù bằng cách nào, khi tôi nói "trang web này ..." tôi có nghĩa là PP & CG, vì hầu hết mã ở đây rõ ràng không có ý định sử dụng trong sản xuất. Thành thật mà nói, nếu anh ta đang tìm kiếm mã thực tế để sử dụng trên trang web của mình, sẽ là đạo đức hơn để tự làm hoặc ký hợp đồng với nó;)
Geobits

8
@chilemagic you can use any code... vậy OP sẽ viết lại trang web của anh ấy để sử dụng giải pháp APL / CJAM / GolfScript của bạn? Đó là một thử thách dựa trên một câu chuyện có thật. Tôi bỏ phiếu lên
edc65

4
Đó là một nhiệm vụ khá nhỏ, tại sao OP sẽ nỗ lực hết sức để gõ một câu hỏi khi việc tự viết mã sẽ dễ dàng hơn? Dù bằng cách nào, tôi rất thích cho nó đi.
James Williams

Câu trả lời:


27

Hồng ngọc

Nghĩ rằng sẽ rất thú vị khi trích xuất các chữ viết tắt trạng thái mà không viết bất kỳ tên hoặc chữ viết tắt nào một cách rõ ràng. Điều này không xem xét sai chính tả của đầu vào, bởi vì chúng ta không quan tâm đến điều đó ở đây trên codegolf.SE, rihgt ?

def f(s)
  [
    /(.).* (.)/,              # two words
    /^([CDGHKLPV]).*(.)$/,    # first and last letter
    /^(.).*([ZVX])/,          # unique letter
    /^([NFOUW])(.)/,          # two first letters
    /^(.)([DNR])/,            # unique second letter
    /^(.).*(L|N)\2/,          # double letters
    /^(.).SS(A|O)/,           # double S before the one used
    /^(.).*?[SNW](.)/,        # identified by the letters before them
    /(.)(.)/                  # two first letters

  ].find { |r| r =~ s.upcase }
  $1+$2
end

Phải mất một thời gian cụ thể để tìm ra các mẫu thông minh để phù hợp với tất cả các trạng thái. Thứ tự của các mẫu rất quan trọng - mỗi mẫu liên tiếp áp dụng cho các trạng thái còn lại không khớp với mẫu trước đó:

Tất cả các trạng thái có hai từ trong đó sử dụng các chữ cái đầu của hai từ:

N ew H ampshire, N ew J ersey, N ew M exico, N ew Y ork, N orth C arolina, N orth D Akota, R hode tôi sland, S outh C arolina, S outh D Akota, W est V irginia

Tất cả các trạng thái cầu xin với bất kỳ chữ cái nào trong { CDGHKLPV} đều sử dụng chữ cái đầu tiên và cuối cùng trong tên:

C aliforniai a , C olorad o , C onnecticu t , D elawar e , G eorgi a , H awai i , K ansa s , K entuck y , L ouisian a , P ennsylvani a , V irgini a , V ermon t

Trong số các trạng thái còn lại, các chữ cái { ZVX} là duy nhất:

A ri z ona, N e v ada, T e x như

Tất cả các trạng thái còn lại bắt đầu bằng { FNOUW} sử dụng hai chữ cái đầu tiên.

Fl orida, Ne braska, Oh io, Ok lahoma, Hoặc egon, Ut ah, Wa shington, Wi sconsin, Wy oming

Sau đó, { DNR} là duy nhất dưới dạng chữ cái thứ hai:

Ar k Kansas, In diana, Id aho

Thật sự rất khó để tạo ra các mẫu chung, nhưng ...

Chỉ có ba trạng thái còn lại sử dụng gấp đôi Nhoặc L, và chữ kép được sử dụng trong tên viết tắt của trạng thái:

T en n essee, M in n esota, I l l inois

Ahoặc Osau double S là duy nhất để

M ass một chusetts và M iss o uri

Bất cứ khi nào { SNW} xuất hiện trước các chữ cái khác trong các tên trạng thái còn lại, các chữ cái sau chúng được sử dụng trong các chữ viết tắt:

A las k a, M arylan d , M ain e , Ms ngayippi, M trên t ana, tôi nợ a

Hai trái. Chúng sử dụng hai chữ cái đầu tiên:

Al abama, Mi chigan


Nó có thể được đánh gôn tất nhiên:

Ruby 2 - 191 165 154 ký tự

Thêm 26 ký tự bằng cách làm xấu đi các biểu thức chính quy một chút. Ngoài ra, một trong những regex ban đầu hóa ra là dư thừa!

gets;[/.* (.)/,/^[CDGHKLPV].*(.)$/,/.*([ZVX])/,/^[NFOUW](.)/,/^.([DNR])/,/.*(L|N)\1/,
/.*SS(A|O)/,/.*?[SNW](.)/,/.(.)/].find{|r|$_.upcase=~r}
puts $&[0]+$1

"Hiện tại chưa đến một phần ba kích thước của mục Golfscript!" : P Hãy ghi nhớ, Golfscript không sử dụng Regexes.
Josiah Winslow

Và tôi đã thay đổi kích thước. : P
Josiah Winslow

1
(@JosiahWinslow và oh, hãy tạo ra 3.9575757575 ...: P)
daniero

6
lol cho regex ngực trong lời giải thích không tồn tại nén
masterX244

1
Tôi thích câu trả lời này, nhưng nó không hợp lệ vì nó không thể phát hiện ra đầu vào không hợp lệ (như bạn nói). Thậm chí còn có một ví dụ cụ thểIf something like New Yrok is passed in, the function should return the original value.
edc65

4

C #

Tôi đã sử dụng các ký tự đã ở trạng thái cho các chữ viết tắt để rút ngắn chuỗi trạng thái.

public string GetAbbr(string state)
            {

                var states =
                    new[] {
                        "AlasKa", "ALabama", "AriZona", "ARkansas", "CAlifornia", "COlorado", "ConnecticuT",
                        "DElaware", "FLorida", "GeorgiA", "HawaiI", "IDaho", "ILlinois", "INdiana", "IowA", "KansaS",
                        "KentuckY", "LouisianA", "MainE", "MarylanD", "MAssachusetts", "MIchigan", "MinNnesota",
                        "MiSsissippi", "MissOuri", "MonTana", "NEbraska", "NeVada", "New Hampshire", "New Jersey",
                        "New Mexico", "New York", "North Carolina", "North Dakota", "OHio", "OKlahoma", "ORegon",
                        "PennsylvaniA", "Rhode Island", "South Carolina", "South Dakota", "TeNnessee", "TeXas", "UTah",
                        "VermonT", "VirginiA", "WAshington", "washington D.C.", "West Virginia", "WIsconsin", "WYoming"
                    };
                var all = states.ToDictionary(st => string.Concat(st.Where(char.IsUpper)));

                var wanted = all.FirstOrDefault(pair => state.ToUpper().Equals(pair.Value.ToUpper()) || state.ToUpper().Equals(pair.Key));

                return wanted.Key ?? state;
            }

1
Cách giải quyết tốt đẹp!
Beta Decay

2

JavaScript (E6)

Ở đây phần lớn là danh sách các tên, sử dụng thủ thuật camelCase để rút ngắn một chút. Đã đánh gôn, 617 byte.

F=i=>
  "AkAlAzArCaCoCtDeFlGaHiIdIlInIaKsKyLaMeMdMaMiMnMsMoMtNeNvNhNjNmNyNcNdOhOkOrPaRiScSdTnTxUtVtVaWaWvWiWyAlaskaAlabamaArizonaArkansasCaliforniaColoradoConnecticutDelawareFloridaGeorgiaHawaiiIdahoIllinoisIndianaIowaKansasKentuckyLouisianaMaineMarylandMassachusettsMichiganMinnesotaMississippiMissouriMontanaNebraskaNevadaNew hampshireNew jerseyNew mexicoNew yorkNorth carolinaNorth dakotaOhioOklahomaOregonPennsylvaniaRhode islandSouth carolinaSouth dakotaTennesseeTexasUtahVermontVirginiaWashingtonWest virginiaWisconsinWyoming"
  .match(/.[^A-Z]*/g).map((w,q)=>U(w,U(w)==U(i)?p=q%50:p),U=s=>s.toUpperCase(),p=-1)[p]||i

0

Con trăn

Quyết định chỉ để làm điều này như là một thách thức mã golf. Giảm xuống 906 713 694 ký tự với sự trợ giúp của daniero và hsl:

s='AK,AL,AZ,AR,CA,CO,CT,DE,FL,GA,HI,ID,IL,IN,IA,KS,KY,LA,ME,MD,MA,MI,MN,MS,MO,MT,NE,NV,NH,NJ,NM,NY,NC,ND,OH,OK,OR,PA,RI,SC,SD,TN,TX,UT,VT,VA,WA,WV,WI,WY,ALASKA,ALABAMA,ARIZONA,ARKANSAS,CALIFORNIA,COLORADO,CONNECTICUT,DELAWARE,FLORIDA,GEORGIA,HAWAII,IDAHO,ILLINOIS,INDIANA,IOWA,KANSAS,KENTUCKY,LOUISIANA,MAINE,MARYLAND,MASSACHUSETTS,MICHIGAN,MINNESOTA,MISSISSIPPI,MISSOURI,MONTANA,NEBRASKA,NEVADA,NEW HAMPSHIRE,NEW JERSEY,NEW MEXICO,NEW YORK,NORTH CAROLINA,NORTH DAKOTA,OHIO,OKLAHOMA,OREGON,PENNSYLVANIA,RHODE ISLAND,SOUTH CAROLINA,SOUTH DAKOTA,TENNESSEE,TEXAS,UTAH,VERMONT,VIRGINIA,WASHINGTON,WEST VIRGINIA,WISCONSIN,WYOMING'.split(",")
x=input().upper()
print(s[s.index(x)%50]if x in s else x)

Tuy nhiên, nếu các mô-đun được cho phép (như mô-đun chúng tôi ), tôi có thể giảm xuống còn 130 ký tự:

import us
i=raw_input()
x=us.states.lookup(i)
print x.abbr if x else i

Và nếu bạn không phải trả về giá trị ban đầu khi trạng thái không tồn tại, tôi có thể giảm xuống còn 50 ký tự:

import us
print us.states.lookup(raw_input()).abbr

Bạn có thể lưu khoảng 200 ký tự trên cái đầu tiên bằng cách để smột chuỗi lớn, sau đó phân tách nó thành dấu phẩy ( ,); Không cần cho tất cả các dấu ngoặc đơn.
daniero

@daniero Không thể tin rằng tôi đã không nghĩ về điều đó! Sẽ làm ngay bây giờ.
James Williams

Bạn có thể xóa Washington, DC, vì đó không phải là tiểu bang của Hoa Kỳ.
NinjaBearMonkey

@hsl Cảm ơn. Tôi lấy danh sách từ danh sách các tiểu bang tôi tìm thấy trên mạng, không nhận ra Washington DC đang ở đó.
James Williams

0

bash + sed, 291 byte

Chuyển đổi không biết xấu hổ của giải pháp Ruby của Danier sang sed:

echo $*|tr a-z A-Z|sed -e\
"/\(.\).* \(.\).*/b1;/^\([CDGHKLPV]\).*\(.\)$/b1;/^\(.\).*\([ZVX]\).*/b1;\
/^\([NFOUW]\)\(.\).*/b1;/^\(.\)\([DNR]\).*/b1;/^\(.\).*\([LN]\)[LN].*/b1;\
/^\(.\).*SS\([AO]\).*/b1;/^\(.\).*\([ED])\)$/b1;/^\(.\).*[SNW]\(.\).*/b1;\
/\(.\)\(.\).*/b1;:1 s//\1\2/"

0

Golfscript - 750 653

Phần lớn là trong tên tiểu bang và viết tắt.

{.96>32*-}%.,2>{"ALABAMA,AL,ALASKA,AK,ARIZONA,AZ,ARKANSAS,AR,CALIFORNIA,CA,COLORADO,CO,CONNECTICUT,CT,DELAWARE,DE,FLORIDA,FL,GEORGIA,GA,HAWAII,HI,IDAHO,ID,ILLINOIS,IL,INDIANA,IN,IOWA,IA,KANSAS,KS,KENTUCKY,KY,LOUISIANA,LA,MAINE,ME,MARYLAND,MD,MASSACHUSETTS,MA,MICHIGAN,MI,MINNESOTA,MN,MISSISSIPPI,MS,MISSOURI,MO,MONTANA,MT,NEBRASKA,NE,NEVADA,NV,NEW HAMPSHIRE,NH,NEW JERSEY,NJ,NEW MEXICO,NM,NEW YORK,NY,NORTH CAROLINA,NC,NORTH DAKOTA,ND,OHIO,OH,OKLAHOMA,OK,OREGON,OR,PENNSYLVANIA,PA,RHODE ISLAND,RI,SOUTH CAROLINA,SC,SOUTH DAKOTA,SD,TENNESSEE,TN,TEXAS,TX,UTAH,UT,VERMONT,VT,VIRGINIA,VA,WASHINGTON,WA,WEST VIRGINIA,WV,WISCONSIN,WI,WYOMING,WY"","/.@?)=}{}if

Giải trình:

{        }%                         Map this to every character in the input string:
 .96>32*-                             Subtract 32 from the ASCII value if it's from "a" onwards.
                                      This turns every lowercase letter into an uppercase letter.
           .,2>                     Check if the input length is greater than 2.
               {              }     If it is, they inputted the full name.
                "..."                 Our string is in the form "STATE NAME,STATE ABBREVIATION".
                     ","/             We split the string at every comma to turn it into an array.
                         .@?          Then we see where the input string is in the array...
                            )=        ...then we return the value right next to it.
                               {}   If not, they inputted the abbreviation.
                                      ...do nothing.
                                 if EndIf
                                    (implied) Print the abbreviation

Xin lỗi, nhưng tôi không thấy mục đích lấy toàn bộ tập lệnh của mình và không thêm gì ngoài vài byte soạn sẵn; Nó chỉ đơn giản là không mang lại điều gì. Nhưng cảm ơn vì những khoản tín dụng mà tôi đoán ... Trân trọng, "anh chàng kia".
daniero

Xin lỗi, troll mục. Tôi biết đó không phải là một mục thực sự.
Josiah Winslow

Chà, coi tôi là trolled rồi;)
daniero

@daniero Này, ít nhất tôi biết có thể có các biểu thức trong Golfscript! Đó thực sự là lý do duy nhất tôi làm điều đó lol: p
Josiah Winslow

0

PHP

Nỗ lực của tôi, không thành công như tôi mong đợi, sử dụng độ dài chuỗi và một số vị trí ký tự cụ thể để trích xuất từ ​​viết tắt từ tên trạng thái. Có lẽ một số trình tự loại bỏ tên tốt hơn là có thể.

function findAbb ($state) {
    $first = substr($state, 0, 1);
    $last = substr($state, -2,1);
    $state = strtolower($state);
    if (strlen($state) < 4) {
        return strtoupper($state);
    }
    if (strpos($state, ' ')) { //if it's a space, return the first letter of each word.
        $space_index = strpos($state, ' ');
        $state = explode(' ', $state);
        return strtoupper(substr($state[0], 0, 1) . substr($state[1], 0, 1));
    }
    if (startsWith($state, 'io')) { //iowa is annoying, get rid of it.
        return strtoupper($first . $last);
    }
    if (startsWith($state, 'w,i')) { //if it starts with a W, return the first 2.
        return strtoupper(substr($state, 0, 2));
    }
    if (strlen($state) < 7 && strpos($state, 'm')===false) { //matches texas, ohio, and utah.
        return strtoupper($first . substr($state, -4,1));
    }
    if (strlen($state) < 7 && substr($state, 0, 1) > 'j' && substr($state, 0, 1) < 'n') { //matches maine, kansas, and hawaii
        return strtoupper($first . $last);
    }
    if (startsWith($state, 'c,d,k,l,p,v,g,h')) { //some unique states
        return strtoupper($first . $last);
    }
    if (strpos($state, 'sk')) {
        return strtoupper ('ak');
    }
    if (startsWith($state, 'k,l', 1)) {
        return strtoupper(substr($state, 0, 2));
    }
    if (startsWith($state, 'n')) {
        return strtoupper($first . substr($state, 2, 1));
    }
    if (startsWith($state, 'n', 2) || startsWith($state, 'z', 3)) { //montana, tennessee, minnesota, and arizona
        return strtoupper($first . substr($state, 3, 1));
    }
    if (startsWith($state, 'm') && ($last == 's') || ($last == 'n')) {
        return strtoupper(substr($state, 0, 2));
    }
    if (strpos($state,'o')) {
        return strtoupper($first . 'o');
    }
    if (strpos($state,'y')) {
        return strtoupper($first . 'd');
    }
    if (strpos($state,'r')) {
        return strtoupper($first . 'r');
    }
    if (strpos($state,'ss')) {
        return strtoupper($first . 's');
    }

    return $state; //otherwise return the name of the state (it was mispelled).
}

function startsWith ($state, $letters, $index = 0) { //takes a comma separated array and finds contents.
    $letters = split(',',$letters);
    for ($q = 0; $q<count($letters); $q++) {
        if (strpos($state,$letters[$q]) === $index) {
            return true;
        }
    }
    return false;
}

Tất nhiên, nó có thể được chơi golf. Đây là nỗ lực chơi gôn đầu tiên của tôi, vì vậy cái nhìn sâu sắc được đánh giá cao. (911)

function t($s){$s=u($s);$f=b($s,0,1);$l=b($s,-2,1);
if(strlen($s)<4)return $s;if(strpos($s,' '))$s=split(' ',$s);
return b($s[0],0,1).b($s[1],0,1);
if(w($s,'IO'))return $f.$l;
if(w($s,'W,I'))return b($s,0,2);
if(strlen($s)<7 && strpos($s,'M')===false)return $f.b($s,-4,1);
if(strlen($s)<7 && b($s,0,1)>'I' && b($s,0,1)<'N')return $f.$l;
if(w($s,'C,D,K,L,P,V,G,H'))return $f.$l;if(strpos($s, 'SK'))return 'AK';
if(w($s,'K,L',1))return b($s,0,2);if(w($s,'N'))return $f.b($s,2,1);
if(w($s,'N',2) || w($s,'Z',3))return $f.b($s,3,1);
if(w($s,'M') && ($l=='S') || ($l=='N'))return b($s,0,2);
if(strpos($s,'O'))return $f.'O';
if(strpos($s,'Y'))return $f.'D';if(strpos($s,'R'))return $f.'R';
if(strpos($s,'SS'))return $f.'S';return $s;}function w($s,$l,$i=0){$l=split(',',$l);
for($q=0;$q<count($l);$q++)if(strpos($s,$l[$q])===$i)return 1;return 0;}
function u($z){return strtoupper($z);}
function b($v,$x,$y){return substr($v,$x,$y);}

0

Javascript

Tôi biết đây không phải là mã golf, nhưng dù sao tôi cũng muốn chơi golf. :)

var r=new XMLHttpRequest
r.open("GET","https://gist.githubusercontent.com/mshafrir/2646763/raw/f2a89b57193e71010386a73976df92d32221d7ba/states_hash.json",0)
r.send()
var o=r.responseText,m=prompt(),a=m
o=JSON.parse(o)
for(var i in o)if(o[i].toLowerCase()==m.toLowerCase())a=i
alert(a)

Yay cho những điều mới! (Đoạn trích)


3
Đây là một lỗ hổng tiêu chuẩn và lỗ hổng tiêu chuẩn áp dụng mà không cần phải được đề cập rõ ràng.
Ingo Bürk

@ IngoBürk Tôi không tin điều này rơi vào những kẽ hở tiêu chuẩn ... Nó nhận được dữ liệu cần thiết từ internet giống như cách đọc một tập tin.
Beta Decay

2
Như vậy eval(open('a.txt'))cũng hợp lệ? Nếu bạn sử dụng một tệp thuộc bất kỳ loại nào, bạn cũng phải bao gồm tệp đó và tên tệp của nó trong số ký tự của bạn. (Đây không phải là mã gôn, vì vậy nó thực sự không thực sự quan trọng trong trường hợp này anyway.)
tay nắm cửa

@Doorknob Vì bạn nêu quan điểm rằng đây không phải là môn đánh gôn, tôi không hiểu tại sao tôi lại bị hạ bệ ... Tôi đã không vi phạm bất kỳ quy tắc nào về khuyết điểm nhạc pop.
Beta Decay

2
Không có lý do gì để đánh giá thấp, nó hoàn toàn theo tinh thần của câu hỏi - thiên về sự mới lạ và tiện ích - và vui vẻ
edc65
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.