একটি স্ট্রিংয়ের স্ক্র্যাবল স্কোর এবং বৈধতা নির্ধারণ করুন


24

আপনার কাজটি নির্ধারণ করা হয় যে প্রদত্ত স্ট্রিং সঠিক দৈর্ঘ্যের কিনা এবং স্ক্র্যাবল টাইলগুলির সাথে প্রতিনিধিত্ব করা যেতে পারে এবং যদি তা হয় তবে প্রতিটি অক্ষরের স্কোরের যোগফল আউটপুট করে।

আপনি যদি স্ক্র্যাবল কীভাবে খেলতে না জানেন: আপনার কাছে বিভিন্ন অক্ষর A various Z এর সাথে মুদ্রিত 100 টি টাইল রয়েছে, পাশাপাশি দুটি ওয়াইল্ডকার্ড যা কোনও বর্ণকে উপস্থাপন করতে পারে। প্রতিটি বর্ণের একটি নির্দিষ্ট সংখ্যক পয়েন্ট থাকে এবং প্রতিটি টাইল (তবে প্রয়োজনীয় শব্দ নয়) কেবল একবার ব্যবহার করা যেতে পারে। যখন একটি শব্দ বাজানো হয়, ব্যবহৃত প্রতিটি টাইলের পয়েন্ট মান যোগ করা হয়, যা স্কোর হয়ে যায়। যেহেতু সীমিত সংখ্যক অক্ষর উপলভ্য রয়েছে, কোনও শব্দের কেবলমাত্র একটি নির্দিষ্ট অক্ষর থাকতে পারে যতক্ষণ না সেই চিঠিতে টাইলস থাকে + কোনও অব্যবহৃত ওয়াইল্ডকার্ড। স্ক্র্যাবল বোর্ডটি 15 × 15 কোষের হয় তাই শব্দটি 2 থেকে 15 বর্ণের মধ্যে দীর্ঘ হতে হবে।

ইংরেজী সংস্করণে প্রতিটি বর্ণের পরিমাণ এবং স্কোরের তালিকার জন্য নীচে বা http://boardgames.about.com/od/scrabble/a/tile_distribute.htm ( সংরক্ষণাগার ) দেখুন see

চিঠি কোটি পয়েন্টস চিঠি কোয়েটি পয়েন্টস
------------------- -------------------
এ 9 1 ও 8 1
খ 2 3 পি 2 3
সি 2 3 কিউ 1 10
ডি 4 2 আর 6 1
ই 12 1 এস 4 1
এফ 2 4 টি 6 1
জি 3 2 ইউ 4 1
এইচ 2 4 ভি 2 4
আই 9 1 ডাব্লু 2 4
জে 1 8 এক্স 1 8
কে 1 5 Y 2 4
এল 4 1 জেড 1 10
এম 2 3 [বন্য] 2 0
এন 6 1

আরও বিধি

  • প্রোগ্রামটি STDIN বা এর মতো একটি ইনপুটের স্ট্রিং নেবে।
  • ইনপুটটিতে সর্বদা কেবল বড় হাতের অক্ষর থাকবে।
  • যদি স্ট্রিংটিতে কোনও চিঠির বেশি অনুলিপি থাকে তবে সেই চিঠির জন্য অব্যবহৃত ওয়াইল্ডকার্ড বা টাইলস থাকে বা স্ট্রিংটির দৈর্ঘ্য 2 থেকে 15 সমেত না হয় তবে প্রোগ্রামটি আউটপুট করে Invalid
  • অন্যথায়, উপরের চার্ট এবং আউটপুট থেকে ডেটা ব্যবহার করে স্কোর যোগ করা উচিত।
  • প্রয়োজন না হলে ওয়াইল্ডকার্ড ব্যবহার করবেন না।
  • ডাবল ওয়ার্ড স্কোর বা স্ট্রিংটি আসল শব্দ কিনা তা বোনাস নিয়ে চিন্তা করবেন না।
  • প্রোগ্রামটি STDOUT বা এর মতো ফলাফল আউটপুট করে।
  • ডিফল্টরূপে নিষিদ্ধ লুফোলগুলি অনুমোদিত নয়।
  • কোনও বাহ্যিক উত্স যেমন একটি ওয়েবসাইট ব্যবহারের পাশাপাশি কোনও গ্রন্থাগার, এপিআই, ফাংশন বা তার মতো স্ক্র্যাবল স্কোর বা যথাযথ পরিমাণ গণনা করা যায় না।
  • এটি , তাই খুব কম বাইট জিতেছে।

walkthrough

Input: CODEGOLF
C -> 3, O -> 1, D -> 2, E -> 1, G -> 2, O -> 1, L -> 1, F -> 4
3 + 1 + 2 + 1 + 2 + 1 + 1 + 4 = 15
Output: 15

Testcases

ইনপুট আউটপুট
------------------------
স্ক্র্যাবল 14
জাজ 19
স্ট্যাকেক্সচেঞ্জ 32
XYWFHQYVZVJKHFW 81
PIZZAZZ অবৈধ
KIXOKEJAJAX অবৈধ
MISUNDERSTANDING অবৈধ

5
ওয়াইল্ড কার্ড ব্যবহার করে এমন বৈধ শব্দের জন্য একটি পরীক্ষার কেস যুক্ত করতে পারে (উদাহরণস্বরূপ JAZZ = 19, 29 নয়)
অ্যালকোনজা

2
আপনি জানেন, স্প্যানিশ, বাস্ক, হাঙ্গেরিয়ান, টুভান বা ওয়েলশ জাতীয় স্ক্রাবল টাইলসকে কোনও একক চরিত্রের সাথে প্রতিনিধিত্ব করা যায় না এমন ভাষায় জড়িত থাকলে এই চ্যালেঞ্জটি আরও বেশি খারাপ হতে পারে।
ব্যবহারকারী0721090601

উত্তরগুলি "অবৈধ" আউটপুট দেওয়ার জন্য বিশেষভাবে প্রয়োজনীয়, বা আমরা স্পষ্টত স্কোর না হওয়া অবধি কোনও আচরণ বেছে নিতে পারি? উদাহরণস্বরূপ -1,?
কামিল দ্রাকারী

@KamilDrakari ঠিক বলতে হবে Invalid
নিনজাবিয়ারমনেকি

উত্তর:


15

পার্ল 5 228 205 186 184 178 177 153 150 149 142 137 135

পার্ল-ই দিয়ে চালান।

Golfed:

$_=<>;@a=@b=map-ord,'            0 0@0 H        ``'=~/./g;say s!.!($a[$q=64-ord$&]+=8)<8?$-+=1-29/$b[$q]:++$j!ge~~[2..15]&&$j<3?$-:Invalid

এই সমাধানটি কিছু মুদ্রণযোগ্য অক্ষর ব্যবহার করে, তাই নীচে একটি হ্যাক্সডাম্প সরবরাহ করা হয়েছে:

00000000: 245f 3d3c 3e3b 4061 3d40 623d 6d61 702d  $_=<>;@a=@b=map-
00000010: 6f72 642c 2703 0904 0909 2030 2030 030e  ord,'..... 0 0..
00000020: 4030 0e20 0704 4809 1809 601d 0e0e 6027  @0. ..H...`...`'
00000030: 3d7e 2f2e 2f67 3b73 6179 2073 212e 2128  =~/./g;say s!.!(
00000040: 2461 5b24 713d 3634 2d6f 7264 2426 5d2b  $a[$q=64-ord$&]+
00000050: 3d38 293c 383f 242d 2b3d 312d 3239 2f24  =8)<8?$-+=1-29/$
00000060: 625b 2471 5d3a 2b2b 246a 2167 657e 7e5b  b[$q]:++$j!ge~~[
00000070: 322e 2e31 355d 2626 246a 3c33 3f24 2d3a  2..15]&&$j<3?$-:
00000080: 496e 7661 6c69 64                        Invalid

বিকল্পভাবে, Ctrl + কী ব্যবহার করে:

$_=<>;@a=@b=map-ord,'^C^I^D^I^I 0 0^C^N@0^N ^G^DH^I^X^I`^]^N^N`'=~/./g;print s!.!($a[$q=64-ord$&]+=8)<8?$-+=1-29/$b[$q]:++$j!ge~~[2..15]&&$j<3?$-:Invalid

Ungolfed + + মন্তব্য করেছেন:

# Read in input
$_=<>;
# @a and @b: represents approximately 8x the number of tiles (when rounded up). The 
#   non-multiple-of-8 values distinguish tiles that are given equally, but are worth
#  different values
@b=@a=map-ord,"...."~=/./g;
# above is equivalent to
# @a=@b=(-03,-09,-04,-09,-09,-32,-48,-32,-48,-03,-14,-64,-48,-14,-32,-07,-04,-72,-09,-24,-09,-96,-29,-14,-14,-96);
say
    # for each character
    s!.!
        # $q: A->-1, B->-2, etc.
        # decrement number of $q tiles, add points if needed, otherwise
        #    increment j, which counts number of wilds used
        # truncate(1-29/b[q]): decimal values were chosen specifically
        #    for this to return the point value. b[q] is the number of tiles
        #    of the qth letter after a originally given.
        #  $- contains the score, is initially zero (if in a one line program, 
        #   as the golfed version is), and is always an integer
        ($a[$q=64-ord$&]+=8)<8 ? $- += 1 - 29/$b[$q] : ++$j
    # s returns length, check if between 2 and 15
    !ge ~~ [2..15]
    # make sure less than 3 negative tiles (aka wilds) 
    && $j < 3 ?
        # print score
        $-
    # or invalid
    : Invalid

1
আপনি কিছু সৃজনশীল কারসাজির সাথে সেই অ্যারেগুলির মধ্যে কমপক্ষে 20 বাইটগুলি
গ্রাস করতে

1
গাহ, সর্বদা আমার থেকে এক ধাপ এগিয়ে। :) একটি upvote আছে।
অ্যালকোনজা

এটি আকর্ষণীয় হয়েছে, আমাদের স্কোরগুলি সমস্ত দিক দিয়ে এত কাছাকাছি ছিল। +1 টি।
স্তর নদী সেন্ট

সঙ্গে এই কাজ করে -M5.010(0 শাস্তি কারণ এটা ব্যবহার করা ভাষা একটি সংস্করণ নির্দিষ্ট করে) বদলে -e(1 শাস্তি)? আপনি যুক্তিগুলিতে একটি বাইট সংরক্ষণ করতে সক্ষম হতে পারেন।

13

সি, রেভ 2, 151 145 138

@ বেবের মন্তব্যে 159-বাইট কোড দ্বারা অনুপ্রাণিত হয়ে আমি আরও 8 14 21 টি অক্ষর আটকিয়েছি :

দৈর্ঘ্যের কাউন্টারটিকে পুনরায় সাজিয়ে 4 বাইট সংরক্ষণ করা হয়েছে i। এটি 1 থেকে শুরু করা হয়েছে (ধরে নেওয়া প্রোগ্রামটি কোনও আর্গুমেন্ট নেয় না) তারপরে প্রতিবার একটি চিঠি পড়ার সাথে 4 দ্বারা গুণিত হয়। শব্দের দৈর্ঘ্য 15 এর চেয়ে বেশি হলে এটি শূন্যের দিকে প্রবাহিত হয়, সুতরাং শব্দের দৈর্ঘ্যটি খারাপ কিনা তা পরীক্ষা করতে আমরা খালি পরীক্ষা করে দেখি i<5( যদি আমি i<9এটি লিখি তবে এটি এখনও একটি অক্ষরের শব্দের জন্য অবৈধ দিতে হবে যদি ব্যবহারকারী ভুলবশত i2 দ্বারা অন্তর্ভুক্ত করে রাখে কমান্ড লাইনে একটি যুক্তি।

লুপ কন্ডিশনের পরীক্ষাকে একটি সরল করে পরিবর্তন করে 4 বাইট সংরক্ষণ করা &31। এটির জন্য শব্দটি একটি স্পেস (এএসসিআইআই 32) বা একটি নাল অক্ষর (এএসসিআইআই 0) দিয়ে সমাপ্ত করা দরকার Nor সাধারণত কীবোর্ড ইনপুটটি একটি নিউলাইন (এএসসিআইআই 10) দ্বারা সমাপ্ত হয় সুতরাং প্রোগ্রামটি ব্যবহার করতে কিছুটা অসুবিধে হয়, কারণ আপনাকে টাইপ করতে হবে স্পেসের পরে কম্পিউটারটি বাফারটি পড়ার জন্য রিটার্নটি টিপুন। নিউলাইন-টার্মিনেটেড স্ট্রিংগুলির জন্য, আমি মেলাতে পারি তবে বেবে যেভাবে তা করে না।

6 এনকোডিং - - (প্রতিটি অক্ষরের টাইলের সংখ্যা) দ্বারা বাইট সংরক্ষণ করা - (সেই অক্ষরের জন্য স্কোর 1) * 13 । এটির জন্য এখন Q, Z এর জন্য এল, এস, ইউ থেকে -118 এর পরিসর দরকার। নেতিবাচক সংখ্যা ব্যবহার করার কারণ হ'ল অপ্রিন্টযোগ্য ASCII পরিসীমা 0 থেকে 31 এড়ানো। পরিবর্তে ব্যবহৃত পরিসীমাটি 256-4 = 252 থেকে 256-118 = 138 এর নেতিবাচক সংখ্যার দুটি পরিপূরক। এগুলি মুদ্রণযোগ্য, বর্ধিত ASCII অক্ষর। ইউনিকোডে এগুলি অনুলিপি করে আটকানোর সমস্যা রয়েছে (এটি ASCII এ ফিরে আসার উপায়টি ইনস্টলড কোড পৃষ্ঠার উপর নির্ভর করে যা অনাকাঙ্ক্ষিত ফলাফলের দিকে নিয়ে যেতে পারে) তাই আমি প্রোগ্রামের মন্তব্যে সঠিক ASCII কোডগুলি অন্তর্ভুক্ত করেছি।

এই এনকোডিংয়ের সুবিধাটি হল ভেরিয়েবলের rনির্মূলকরণ হ'ল টাইলসের সংখ্যা সর্বদা 1 দ্বারা হ্রাস হয় (এটি একটি নেতিবাচক সংখ্যা হিসাবে সঞ্চিত থাকে, আমরা এটি করি t[x]++Additionally অতিরিক্তভাবে, পোস্টফিক্স অপারেটর মানে আমরা এই বর্ধন একই সাথে সম্পাদন করতে পারি স্কোর যোগ s

//char t[]={32,247,228,228,239,244,215,240,215,247,164,203,252,228,250,248,228,138,250,252,250,252,215,215,164,215,138,0};
b,s;
main(i,x){
  for(char t[]=" ÷ääïô×ð×÷¤ËüäúøäŠúüúü×פ׊";x=getchar()&31;i*=4)
    t[x]%13?
      s-=t[x]++/13-1:
      b++;
  printf(i<9|b>2?"Invalid":"%d",s);
} 

সি, 184 রেভ 1 173 (বা সংকলক বিকল্প সহ 172)

আমি জিসিসি ব্যবহার করছি, এবং সংকলক বিকল্পের সাহায্যে -std=c99এটি আমাকে একটি অতিরিক্ত অর্ধিকলন সংরক্ষণের জন্য লুপের char t[]="...."প্রারম্ভিককরণের দিকে যেতে অনুমতি দেবে for। পঠনযোগ্যতার জন্য, আমি এই পরিবর্তনটি ছাড়াই প্রোগ্রামটি দেখিয়েছি এবং শ্বেত স্পেসটি রেখে দিয়েছি।

#define T t[x[1][i]-65]
i,b,s;
main(int r,char**x){
  char t[]="Z>>QxS=SZW6(><P>m<(<(SSWSm";
  for(;x[1][i];i++)
    T/10?
      s+=r=T%10+1,T-=r*10:
      b++;
  printf(i<2|i>15|b>2?"Invalid":"%d",s);
}

কৌশলটি ডেটাটেবলের মধ্যে রয়েছে। প্রতিটি বর্ণের জন্য ফর্মের একটি ASCII কোড (সেই চিঠির জন্য টাইলের মোট স্কোর) * 10 + (এক টাইল -1 এর স্কোর) সারণীতে সঞ্চিত থাকে t[]। রানটাইমের সময়, টাইলস ব্যবহার করার সাথে সাথে এই মোট স্কোর হ্রাস পেয়েছে।

প্রতিটি অক্ষরের জন্য সমস্ত টাইলের মোট স্কোর এল এর জন্য 12 থেকে কম হয়ে 4, এল, এস, ইউ এর মধ্যে রয়েছে। এই এনকোডিংয়ের ফর্মটি কেবল প্রিন্টযোগ্য এএসসিআইআই অক্ষরগুলি ব্যবহার করতে সক্ষম করে (এএসসিআইআই 120, xই নীচে এএসসিআইআই 40 (থেকে এল, এস, ইউ।) টাইলসের সংখ্যা ব্যবহার করে 120 থেকে নীচে 10 পর্যন্ত রেঞ্জের প্রয়োজন হবে, এ কারণেই আমি এড়ানো।

একটি ধন্যবাদ #defineম্যাক্রো, একটি একক প্রতীক Tচিঠি সূচক পুনরুদ্ধার করতে প্রধান প্রোগ্রাম ব্যবহার করা হয় iপ্রথম কমান্ড যুক্তি, বিয়োগ হওয়া ASCII থেকে A= 65 তা থেকে একটি সূচক দেওয়ার জন্য এবং টেবিল টি মধ্যে এটি খোঁজা: t[x[1][i]-65]

forলুপ আরো একটি মত ব্যবহার করা হয় whileলুপ: লুপ প্রান্ত যখন একটি শূন্য বাইট (STRING টারমিনেটর) ইনপুট স্ট্রিং সম্মুখীন হয়।

যদি সেই চিঠির টাইলস ক্লান্ত না হয় (তবে T/10এটি ননজারো) মোট স্কোর রাখতে sটাইল স্কোর দ্বারা বাড়ানো হয় T%10+1। একই সময়ে টাইলের স্কোরটি সঞ্চিত থাকে r, যাতে একটি টাইল ব্যবহার করা হয়েছে তা নির্দেশ করে সক্ষম প্রতিনিধিত্বকারীটির মান Tহ্রাস করা r*10যায়। টাইলস শেষ হয়ে গেলে, ওয়াইল্ডকার্ড / ফাঁকা কাউন্টারটি bবাড়ানো হয়।

printfবিবৃতি মোটামুটি স্বশাসিত হয়। শব্দের দৈর্ঘ্য যদি সীমার বাইরে না থাকে বা ফাঁকা গণনা খুব বেশি হয় তবে Invalidঅন্যথায় স্কোরটি প্রিন্ট করুন s


যেহেতু এটি এখন অন্য দিন, আপনি r + = (r == 7) * 3 কে আর + = আর -7? 0: 3 এর পরিবর্তে একটি অক্ষর সংরক্ষণ করতে পারেন। এছাড়াও আপনার T- = r * 9, s + = r বৃত্তাকার বন্ধনী প্রয়োজন নেই।
অ্যালকিমিস্ট

@ অ্যালচিমিস্ট বন্ধনী সম্পর্কে পরামর্শ দেওয়ার জন্য ধন্যবাদ, আমি সর্বদা ভুলে যাই যে ?এবং অপারেটরের নজির নিয়ে কোনও সমস্যা নেই :। আপনার অন্য পয়েন্টটি বাতিল করা হয়েছে, কারণ আমি পুরোপুরি এনকোডিংটি পরিবর্তন করেছি সুতরাং প্রশ্ন এবং জেডের কোনও বিশেষ পরিচালনা করার দরকার নেই Now এখন আপনার সহায়তায় 173/172 এ নামিয়ে নিন।
স্তর নদী সেন্ট

1
সঙ্গে getchar(): এটা 159 এর l,w,f;main(t,i){for(char b[]="Z>>QxS=SZW6(><P>m<(<(SSWSm";(i=getchar()-65)>=0;l++)b[i]/10?f+=t=b[i]%10+1,b[i]-=t*10:w++;printf(l<2|l>15|w>2?"Invalid":"%d",f);}যদিও আমি এখনও কেন পাবেন না char*foo=<string>ক্র্যাশগুলি। এটি 2 অক্ষর বাঁচাতে পারে
bebe

1
@bebe char*foo="string"একটি স্ট্রিং আক্ষরিক, এবং এর বিষয়বস্তুগুলি সংশোধন করার অনুমতি নেই। অন্যদিকে, char foo[]="string"চরগুলি আরম্ভ করার জন্য একটি অ্যারে তৈরি করে string\0, যা পরে পরিবর্তিত হতে পারে।
es1024

@ তবে দুর্দান্ত, আমি কোডটিতে getchar().আপনার উন্নতিগুলি ব্যবহার করেছি (আমার উত্তরটির সাথে সামঞ্জস্যের জন্য আমার পরিবর্তনশীল নামগুলি ব্যবহার করেছি), পাশাপাশি শব্দদৈর্ঘ্যের বৈধতা যাচাই বাছাই করতে এবং লুপের অবস্থার জন্য একটি উদ্দীপক উন্নতি ব্যবহার করার ধারণাটি আমি মিস করেছি পরীক্ষা (আমি তোমার সংক্ষেপিত চেষ্টা করেছিলেন কিন্তু একই বৈশিষ্ট্য সহ তা না পারে।) আমি চেষ্টা getche()এবং getch()কিন্তু আমার কম্পাইলার (cygwin উপর জিসিসি) তাদের স্বয়ংক্রিয়ভাবে সংযোগ আছে না।
স্তরের নদী সেন্ট

5

জাভাস্ক্রিপ্ট (ES6) - 241 230 199 182

f=s=>{for(i=t=_=0,E=12,A=I=9,B=C=M=P=28,D=17,F=H=V=W=Y=41,G=16,J=X=92,K=53,L=S=U=4,N=R=T=6,O=8,Q=Z=118;c=s[i++];)this[c]%13<1?_++:t+=1+this[c]--/13|0;alert(i<3|i>16|_>2?"Invalid":t)}

সম্পাদনা করুন - আকার হ্রাস করতে এবং অ-এসকিআই ভেরিয়েবলগুলি অপসারণের জন্য আমি পরিমাণগুলি / স্কোরগুলিকে এনকোড করার উপায় পরিবর্তন করেছি

2 সম্পাদনা করুন - স্ট্রিংয়ের পরিবর্তে পরিমাণ / স্কোর এনকোডিংগুলি পূর্ণসংখ্যায় পরিবর্তন করে

3 সম্পাদনা করুন - %13(ধন্যবাদ @ edc65) এ স্যুইচ করা হয়েছে , এনকোডিংটি উল্টে দেওয়া হয়েছে, মানগুলি সরাসরি সংশোধন করা হয়েছে এবং আরও কয়েকটি ছোটখাট উন্নতি হয়েছে

ফায়ারফক্স কনসোলে পরীক্ষিত।


1
+1 খুব চালাক। পরামর্শ: 1. f[c]=1+f[c]||1-> f[c]=-~f[c], ২. কেন% 13
edc65

1
192 এফ = এস => {এর জন্য (ই = 12, এ = আই = 9, বি = সি = এম = পি = 28, ডি = 17, এফ = এইচ = ভি = ডব্লু = ওয়াই = 41, জি = 16, জে) = এক্স = 92 K = 53, এল = এস = ইউ = 4, এন = আর = টি = 6 হে = 8, q = জেড = 118, $ = 2, T = i = 0; গ = গুলি [i ++, ];) (চ [গ] = - ~ চ [গ])> (l = এই [গ])% 13 - $: T + = L / 13 + 1 টি | 0; সতর্কতা (ঝ <3 | আমি> 16 | $ <0? "অবৈধ": t)}
edc65

@ edc65 - ধন্যবাদ গাদা। প্রথম কৌশলটি দেখেনি, তবে এটি ব্যবহার করে শেষ হয়নি কারণ আমি এখন সরাসরি মূল্যবোধগুলি সংশোধন করছি (মানসিকভাবে ভবিষ্যতের গল্ফের জন্য এটি ফাইল করে দিচ্ছি)। %13যদিও প্রতিভা একটি স্ট্রোক। আমি আটকে গিয়েছিলাম ভাবতে হবে আমাকে জিনিসগুলি অঙ্কে রাখতে হবে, তবে গণিতগুলি বেস 10 এবং বেস 13 এর মধ্যে পার্থক্য সম্পর্কে চিন্তা করে না।
অ্যালকোনজা

নিস! (ক্রোমের কনসোলে কাজ করে না, SyntaxError: Unexpected token >
বিটিডাব্লু:।

@ ডিএলকাস - হ্যাঁ, আমি মনে করি ফায়ারফক্স এই মুহুর্তে একমাত্র ব্রাউজার যা সমস্ত ইসমাস্ক্রিপ্ট stuff টি জিনিসকে সমর্থন করে (ক্রোম f=s=>{...}নোটেশন পছন্দ করে না )।
অলকোনজা

5

পাইথন 3, 217 201

b=2;i=s=0;w=input()
while i<26:n=w.count(chr(i+65));q=int('9224c232911426821646422121'[i],16);b-=max(0,n-q);s+=min(n,q)*int('1332142418513113a11114484a'[i],16);i+=1
print(["Invalid",s][-b<1<len(w)<16])

Ungolfed:

b=2    # number of blanks available
i=s=0  # letter index 0..25, running score tally
w=input()

# Loop through each letter of the alphabet
while i<26:
    # Get number of occurrences in the word
    n=w.count(chr(i+65))
    # Get quantity of the letter from hex encoded string
    q=int('9224c232911426821646422121'[i],16)
    # Remove blanks for each occurrence over that letter's quantity
    b-=max(0,n-q)
    # Score the non-blank tiles, getting scores from hex-encoded string
    s+=min(n,q)*int('1332142418513113a11114484a'[i],16)
    # Increment
    i+=1

# If b > -1 and 1 < len(w) < 16, print the score; otherwise, print "Invalid"
print(["Invalid",s][-b<1<len(w)<16])

সম্পাদনা: @ বিটডেমগুইজকে এমন একটি টিপ দেওয়ার জন্য ধন্যবাদ যা শেষ পর্যন্ত আমাকে 1-চরিত্রের হ্রাসের চেয়ে অনেক বেশি দিকে নিয়ে যায়! নীচে মূল কোড:

q=[77-ord(x)for x in'DKKIAKJKDLLIKGEKLGIGIKKLKL'];b=2;s=0;w=input()
for c in set(w):n=w.count(c);o=ord(c)-65;b-=max(0,n-q[o]);s+=min(n,q[o])*(1+int('02210313074020029000033739'[o]))
print(["Invalid",s][-b<1<len(w)<16])

এটি বেশ ন্যূনতম তবে আপনি আপনার স্কোরের স্ট্রিং হেক্সে এনকোড করে 1 বাইট সংরক্ষণ করতে পারবেন: int('1332142418513113a11114484a'[o],16) :)
বীটডেমগুইজ

4

BEFUNGE 93 - 210 বাইট।

তবে এটি 15 অক্ষরের সীমা পরীক্ষা করে না।

v1332142418513113:11114484: >01g:"0"-!#v_1-01p1+\v
 9224<232911426821646422121v  "Invalid"<      vp0<
<vp00p10"20"p200p900
>>~:55+-!#v_"@"-::1g:"0"-! #^_1-\1p0g+"0"-02g+>02p
_v#:-1<    #p90+g90-"0"g1:<
     @.g20<        @,,,,,,,<

4

সি, 197

ধরুন স্ট্রিংটি কমান্ড লাইন আর্গুমেন্ট হিসাবে সরবরাহ করা হয়েছে, যেমন ./scrabble STACKEXCHANGE

s;n;m=31;main(int c,char**v){char d[]="BIBBDLBCBIAADBFHBAFDFDBBABA@ACCBADBDAHEACAACJAAAADDHDJ";for(;c=*v[1]++&m;d[c]--,s+=d[c+27]&m)n+=1+m*(!(d[c]&m||d[c=0]&m));printf(n>1&&n<16?"%d":"Invalid",s);}

4

জাভাস্ক্রিপ্ট - 232 201

t=[9,2,2,4,12,2,3,2,9,1,1,4,2,6,8,2,1,6,4,6,4,2,2,1,2,1];w=r=0;for(i=y=z.length;i--;){x=z.charCodeAt(i)-65;if(!t[x])w++;else{t[x]--;r+=-~"02210313074020029000033739"[x]}}alert(w>2|y<2|y>15?"Invalid":r)

zস্টোর শব্দ। সতর্কতা হিসাবে আউটপুট।

সম্পাদনা করুন: নীচের প্রস্তাবনা অনুযায়ী উন্নত


2
sশুধুমাত্র একবার ব্যবহার করা হয়, সুতরাং আপনার এটিকে কোনও পরিবর্তনশীল করার দরকার নেই; আপনি যে ঘোষণা মুছে ফেলুন এবং প্রতিস্থাপন করতে পারেন r+=s[x]সঙ্গে r+=-~"02210313074020029000033739"[x]। এছাড়াও, (w>2|y<2|y>15)সতর্কতার জন্য আপনার কাছাকাছি কোনও বন্ধনী প্রয়োজন নেই ।
নিনজাবিয়ারমনেকি

4

হাস্কেল - 538

এটিকে স্ক্র্যাবল.এইচ হিসাবে সংরক্ষণ করুন এবং তারপরে এটি ব্যবহার করে সংকলন করুন

ghc --make scrabble && ./scrabble

তারপরে আপনার শব্দটি ইনপুট হিসাবে প্রবেশ করুন এবং এন্টার টিপুন

l=['A'..'Z']
sc=zip l [1,3,3,2,1,4,2,4,1,8,5,1,3,1,1,3,10,1,1,1,1,4,4,8,4,10]
vfs a y =snd $ filter (\x -> fst x == y) a !! 0
q = zip l [9,2,2,4,12,2,3,2,9,1,1,4,2,6,8,2,1,6,4,6,4,2,2,1,2,1]
i s =filter (\x -> (fst x) >=0) [(length [x | x <- s, x == a] - vfs q a,a) | a <- l]
main = do
 s <- getLine
 if length s <= 15 && length s > 2 && sum (map fst (i s)) <= 2 then
  putStrLn $ show (sum [vfs sc x| x <- s] - sum [(vfs sc (snd x)) * (fst x) | x <- (filter (\x -> fst x > 0) (i s))])
 else do
  putStrLn "Invalid"

আপনি প্রচুর জায়গা এবং হাস্কেল remove ['এ', 'বি', 'সি'] == "এবিসি" সরাতে পারেন। এছাড়াও প্রতিটি স্তরের ইনডেন্টের জন্য আপনি কেবল একটি স্থান ব্যবহার করতে পারেন। এবং আপনি সংক্ষিপ্ত নাম ব্যবহার করতে পারেন। গল্ফ করার জন্য অনেক কিছুই আছে।
রায়

@ রায় কি তা করেছেন, আমি হাস্কেলের কাছে নতুন, কী [ইনটোর] তালিকা [1,2,3] এর চেয়ে আরও সংক্ষিপ্তভাবে উপস্থাপন করার উপায় আছে?
টুওমাস লাককোনেন

"ABCDEFG"হিসেবে লেখা যেতে পারে ['A'..'G'], [1,2,3]হিসেবে লেখা যেতে পারে[1..3]
সত্যজিৎ

আপনি কীভাবে আপনার বাইট গণনা পাবেন? wc আপনার কোডের জন্য আমাকে 500 টিরও বেশি অক্ষর দেয়।
TheSpनिशInquifications

@ স্পেনিশ ইনকুইজিশন সবেমাত্র আমার এসটি 3 শব্দ গণনা সম্প্রসারণের জন্য একটি আপডেট পেয়েছি, লেখক দুর্ঘটনাক্রমে দুটি সংখ্যা বদল করেছেন, 538
টুওমাস লাককোনেন

3

পাইথন 2.7 - 263

আমি ডিএলসকের উত্তরের নিকটে কোথাও আসতে পারিনি , তবে এটি প্রতিটি অক্ষরকে 'ব্যাগ' হিসাবে বিবেচনা করে, যা আপনি খালি করে ফেলেছেন , তারপরে আপনি ফাঁকা টানছেন, এবং যখন খালি থাকে তখন এটি ত্রুটিযুক্ত হয়।

S=input().lower()
X={chr(97+i):[int(y)+1]*(77-ord(x))for i,(x,y)in enumerate(zip('DKKIAKJKDLLIKGEKLGIGIKKLKL','02210313074020029000033739'))}
B=[0,0]
try:
 if len(S)>15:1/0
 print sum(map(lambda x:X[x].pop()if len(X[x])>0 else B.pop(),S))
except:
 print "invalid"

1
এটি একটি ঝরঝরে পদ্ধতির! raw_inputএটি দরকার যদি এটি পাইথন 2 (পাইথন 3 সম্পর্কে আমি একটি জিনিস পছন্দ করি)। ইনপুটটি বড় হাতের গ্যারান্টিযুক্ত, সুতরাং সরান .lower()এবং এতে পরিবর্তন 97+iকরুন 65+i। 2 টিরও কম অক্ষরের ইনপুটটিও অবৈধ হওয়া দরকার। আপনি কোনও ifবিবৃতি ছাড়াই শূন্য-বিভাগ ত্রুটি বাড়িয়ে তুলতে পারেন : আপনার মোট স্কোরকে ভাগ করে নিন (1<len(S)<16)printব্লক শিরোনামের মতো একই লাইনে এস গুলি রাখার আগে এবং স্থানটি মুছে ফেলার মতো আরও কয়েকটি টুইট "Invalid"আমার গণনা অনুসারে এটি 250 নামিয়ে আনছে। :)
ডিএলকাস

2

হাস্কেল, 290 283

যতটা নিচে আমি এটি আপাতত তৈরি করতে পারি:

import Data.List
t="CdC8d::Od;D;d41N:dd:6dNdN;;4;6"
s w@(_:_:_)=let d=concat(zipWith(replicate.(`div`11).f 33)t("AEIO"++['A'..]))\\w;y=drop 15w in if length(d++w++y++y++y)>100 then s""else show$187-(sum$map((`mod`11).f 0.(t!!).f 61)d)
s _="Invalid"
f n=(-n+).fromEnum
main=interact s

এই কোডটি খুব কঠোরভাবে নিয়ম মেনে চলে, সুতরাং নিশ্চিত হয়ে নিন যে আপনি এটি কোনও অতিরিক্ত অক্ষর (যেমন-লাইন-এর শেষের দিকে) পাস করবেন না। এটি ব্যবহার করুন:echo -n "JAZZ" | runghc scrabble.hs

ব্যাখ্যা

প্যাটার্নটি (_:_:_)নিশ্চিত করে যে কমপক্ষে দুটি অক্ষরের শুধুমাত্র স্ট্রিং বিবেচনা করা হবে, অন্য সমস্ত কিছুর ফলাফল "Invalid"(ফলব্যাক প্যাটার্ন _)। টাইলসের টেবিলটি 11*nTiles+valueএকটি অফসেটের সাথে ASCII তে রূপান্তরিত হিসাবে এনকোড করা হয়েছে যা লুকিং মডুলো 11কে কাজ করতে দেয়, যেখানে অক্ষরগুলি AEIOনকল করা হয় কারণ তারা প্রতিটিতে 6 বারের বেশি হয়। টাইলসের পুলটি তখন ব্যবহার করে তৈরি করা হয়replicate , যা থেকে শব্দের অক্ষরগুলি দেখা দেওয়ার সাথে সাথে মুছে ফেলা হয় (তালিকার পার্থক্য,\\)। পুলটিতে 98 টি টাইল রয়েছে, সুতরাং শব্দের মোট দৈর্ঘ্য এবং পুলের অবশিষ্ট অংশ যদি 100 এর বেশি হয় তবে আমরা অনেকগুলি ওয়াইল্ডকার্ড ব্যবহার করেছি। এছাড়াও, প্রথম 15 অক্ষরটি দৈর্ঘ্য গণনায় তিনবার যুক্ত হয়েছে সুতরাং 15 অক্ষরের চেয়ে দীর্ঘতর যে কোনও শব্দ স্বয়ংক্রিয়ভাবে তিনটি ওয়াইল্ডকার্ড ব্যবহার করবে বলেই এটি অবৈধ। স্কোরিং বাকি পুলে করা হয়, যার শুরুতে 187 পয়েন্ট ছিল, যা আমরা কেবল এগুলি থেকে বিয়োগ করি। পুলটির শুরুতে সদৃশ হওয়ার কারণে 65 টি ASCII নম্বর হওয়ার f 61পরিবর্তে নোট করুন । বাকিটি কেবল বয়লারপ্লেট।f 65'A'"AEIO"


1

পাইথন 3 - 197

s,i,c,r=input(),0x1a24182424416141611a2381612341151891243224c142232391,[],[]; p=len(s)
for w in s:e=8*ord(w)-520;c+=[s.count(w)<=i>>e+4&15];r+=[i>>e&15]
print(['Invalid',sum(r)][all([p>2,p<15]+c)])

আসুন ব্যবহার করার জন্য বাইনগামগুলি রাখি: ডি (এটি বর্তমানে ওয়াইল্ডকার্ডগুলি পরিচালনা করে না, আমি পুরোপুরি এই নিয়মটি পড়া বাদ দিয়েছি)


1

রুবি - 195

b=2
i=s=0
w=$*[0]
(?A..?Z).map{|l|n=w.count(l);q='9224c232911426821646422121'[i].to_i(16);b-=[0,n-q].max;s+=[n,q].min*'1332142418513113a11114484a'[i].to_i(16);i+=1}
p(-b<1&&w.size<16?s:'Invalid')

আমি ধরে নিচ্ছি যে আউটপুট "Invalid"ঠিক আছে, যদি না হয় তবে আমার কাজ করা দরকার$><<(-b<1&&w.size<16?s:'Invalid') এটির যা এটি 198 টি পর্যন্ত গড়িয়ে যাবে


ক্লোজার - 325

আমি কিছুক্ষণের মধ্যে ক্লোজারটি করিনি তাই আমি নিশ্চিত যে আমার সমাধানের উন্নতি করার বিভিন্ন উপায় রয়েছে ie

(let[w(first *command-line-args*)o(map #(count(filter #{%}(seq w)))(map char(range 65 91)))i(apply +(filter neg?(map #(- % %2)'(9 2 2 4 12 2 3 2 9 1 1 4 2 6 8 2 1 6 4 6 4 2 2 1 2 1) o)))](println(if(or(> -2 i)(not(<= 2(count w)15)))"Invalid"(apply +(map #(* % %2)o'(1 3 3 2 1 4 2 4 1 8 5 1 3 1 1 3 10 1 1 1 1 4 4 8 4 10))))))

কিছু কি আন গল্ফড

(let [word    (first *command-line-args*)
      letters (map char(range 65 91))
      occ     (map #(count (filter #{%} (seq word))) letters)
      invalid (apply + (filter neg? (map #(- % %2)
                '(9 2 2 4 12 2 3 2 9 1 1 4 2 6 8 2 1 6 4 6 4 2 2 1 2 1)
                occ)))
      score   (apply + (map #(* % %2) occ '(1 3 3 2 1 4 2 4 1 8 5 1 3 1 1 3 10 1 1 1 1 4 4 8 4 10)))]
    (println
      (if (or (> -2 invalid)
              (not (<= 2 (count word) 15)))
        "Invalid"
        score)))

1

ES6: 184 (অ-কঠোর)

wইতিমধ্যে শব্দটি ধারণ করে। rআউটপুট স্ট্রিং।

i=0,o=[..."291232342c124322491181541236181231a61416141242418241a"].map(c=>parseInt(c,16)),r=!w[16]&&w[2]&&[...w].every(c=>o[c=c.charCodeAt()*2-129]-->0?i+=o[c+1]:o[0]--)?i+"":"Invalid"

এখানে এটি ব্যাখ্যা করা হয়েছে এবং কিছুটা কম গল্ফ করা হয়েছে:

// The sum.
i = 0,

// The data for the letters. It's encoded similar to the Ruby version, with
// the first being the wildcard holder. The rest hold in hex form the
// following: first = quantity left, second = value.
// The .map(c => parseInt(c, 16) simply parses all the hex characters.
o = [..."291232342c124322491181541236181231a61416141242418241a"]
  .map(c => parseInt(c, 16)),

// The result, `r`.
r = !w[16] || // If there is a 16th character in the word or no 2nd character,
    w[2] &&   // then the next section isn't evaluated. It immediately equates
              // to true, thus returning "Invalid".
   [...w] // Convert the string into an array of characters (ES6 equivalent to
          // `.split('')`
    .every(c => // This loop terminates when the callback returns a falsy
                // value.
      // Gets the ASCII value, subtracts 65, doubles it (the lookup table is
      // in pairs within one array), and decrements the counter at that entry.
      // The lookup table also doubles as a data holder.
      o[c = c.charCodeAt() * 2 - 129]--
        > 0 ?  // Test if there is something to take away. This must return
               // false at 0 and -1 so wildcards can be taken.
        i += o[c+1] : // If there was something to take away, then add the
                      // letter value to the sum.
        o[0]--) // Otherwise, take a wildcard. If this is already at 0, then
                // it returns falsy.
      ? "Invalid" : i + "" // This is where the text is returned.

1

ডার্ট - 201

main(a,{x:0xa14281424214161416a132181632145181194223421c24323219,i,r:0,m,s:2}){if((m=a[0].length)>1&&m<16)for(i in a[s=0].codeUnits)x>>(m=i*8-520)&15>0?r+=(x-=1<<m)>>m+4&15:++s;print(s<2?r:"Invalid");}

এটিতে বিনাইনাম প্রয়োজন, তাই এটি জাভাস্ক্রিপ্টে সংকলন করবে না।
আরও সাদা জায়গা সহ:

main(a,{x:0xa14281424214161416a132181632145181194223421c24323219,i,r:0,m,s:3}){
  if((m=a[0].length)>1&&m<16)
    for(i in a[s=0].codeUnits)
      x>>(m=i*8-520)&15>0
      ? r+=(x-=1<<m)>>m+4&15
      : ++s;
  print(s<3?r:"Invalid");
}

0

পিএইচপি, 180 170 168 বাইট

for($q=str_split(KDKKIAKJKDLLIKGEKLGIGIKKLKL);$o=31&ord($argv[1][$i++]);)$s+=$q[$o]++>L?$q[0]++>L?$f=1:0:X02210313074020029000033739[$o]+1;echo$f|$i<3|$i>16?Invalid:$s;

হ্যাঁ! জেএসকে মারধর!

ভাঙ্গন

for(
    $q=str_split(KDKKIAKJKDLLIKGEKLGIGIKKLKL);  // init quantities: L=1,A=12
    $o=31&ord($argv[1][$i++]);                  // loop through characters: map to [1..26]
)
    $s+=                                          // increase score by ...
        $q[$o]++>L?                                 // old quantity below 1?
        $q[0]++>L?$f=1                              // no more wildcards? set error flag
        :0                                          // wildcard: 0 points
        :X02210313074020029000033739[$o]+1;         // else: letter score
echo$f|$i<3|$i>16?Invalid:$s;                   // output

আমি খুব খুশি যে 10 এর চেয়ে বড় কোনও অক্ষরের স্কোর নেই।

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