ที่ไม่ซ้ำกันคือราคาถูก


93

เขียนฟังก์ชั่นหรือโปรแกรมที่กำหนดค่าใช้จ่ายของสตริงที่กำหนดที่ไหน

  • ค่าใช้จ่ายของตัวละครแต่ละตัวเท่ากับจำนวนครั้งที่ตัวละครเกิดขึ้นจนถึงจุดนี้ในสตริงและ
  • ต้นทุนของสตริงคือผลรวมของต้นทุนของอักขระ

ตัวอย่าง

สำหรับอินพุตของabaacabจะคำนวณต้นทุนดังนี้:

a b a a c a b
1   2 3   4    occurrence of a
  1         2  occurrence of b
        1      occurrence of c
1+1+2+3+1+4+2 = 14

ดังนั้นราคาของสตริงabaacabคือ 14

กฎระเบียบ

  • คะแนนของการส่งของคุณคือค่าใช้จ่ายของรหัสของคุณตามที่กำหนดไว้ข้างต้นนั่นคือการส่งของคุณทำงานบนซอร์สโค้ดของตัวเองโดยที่คะแนนที่ต่ำกว่าจะดีกว่า
  • การส่งของคุณควรทำงานกับสตริงที่มีอักขระ ASCII ที่พิมพ์ได้รวมถึงอักขระทั้งหมดที่ใช้ในการส่งของคุณ
  • ตัวอักษรเป็นกรณี ๆ ไปนั่นคือaและAเป็นตัวละครที่แตกต่างกัน

Testcases

input -> output
"abaacab" -> 14
"Programming Puzzles & Code Golf" -> 47
"" -> 0
"       " -> 28
"abcdefg" -> 7
"aA" -> 2

ลีดเดอร์บอร์ด


2
การตั้งค่าสถานะของโปรแกรมเช่น-nสำหรับ Perl นับรวมกับคะแนนเป็นอย่างไร มันมักจะนับเป็น 1 ไบต์เพราะระยะทางแก้ไขระหว่างมาตรฐานperl -eและperl -ne1 แต่สำหรับความท้าทายนี้จะมีการnนับเพื่อจุดประสงค์ในการนับซ้ำหรือไม่
มูลค่าหมึก

2
@ คุ้มค่าใช่ฉันคิดว่าการนับnเป็นตัวเลือกที่ยุติธรรมที่สุด
Laikoni

1
ฉันหวังว่าจะมีวิธีแก้ปัญหาสมองสำหรับความท้าทายนี้
Peter1807

10
+1 สำหรับคะแนนของการส่งของคุณคือค่าใช้จ่ายของรหัสของคุณ
luizfzs

1
ราคาของตัวละครมีการกำหนดเป็นhow often this character has already occurred in the stringฉันอาจจะเปลี่ยนไปhow many times the character has occurred up to this pointเพื่อให้ชัดเจนว่าการใช้งานครั้งแรกค่าใช้จ่าย 1 ไม่ใช่ 0
undergroundmonorail

คำตอบ:


83

MATLคะแนน 4

&=Rz

ลองออนไลน์!

คำอธิบาย

พิจารณาการป้อนข้อมูล'ABBA'เป็นตัวอย่าง

&=   % Implicit input. Matrix of all equality comparisons
     % STACK: [1 0 0 1;
               0 1 1 0;
               0 1 1 0;
               1 0 0 1]
R    % Upper triangular part
     % STACK: [1 0 0 1;
               0 1 1 0;
               0 0 1 0;
               0 0 0 1]
z    % Number of nonzeros. Implicitly display
     % STACK: 6

14
คุณเป็นศาสตราจารย์พีชคณิตเชิงเส้นหรือไม่
Magic Octopus Urn

4
@carusocomputing จริงๆแล้วอาจารย์ด้านการสื่อสารเคลื่อนที่ แนวโน้มของฉันที่จะใช้เมทริกซ์มาจากการเขียนโปรแกรมเป็นเวลาหลายปีใน Matlab
Luis Mendo

เรียบร้อย! Matlab มีขนาดใหญ่ในพื้นที่นั้นหรือไม่? ฉันไม่เคยดู GSM จริงๆหรืออะไรทำนองนั้น
Magic Octopus Urn

2
ฉันเข้าร่วมชุมชนนี้เพียงเพื่อยกย่องคุณในโซลูชันที่ยอดเยี่ยมนี้!
Wboy

1
@carusocomputing Matlab เป็นเครื่องมือทั่วไป / ภาษาในงานวิศวกรรมโดยทั่วไป มันเป็นการดีที่การคำนวณเชิงตัวเลข: พีชคณิตเชิงเส้น, การประมวลสัญญาณและสิ่งที่คล้ายกัน และเป็นภาษาที่ตีความง่ายต่อการใช้งาน
หลุยส์เมนโด

17

Python 49 คะแนน

lambda S:sum(1+S.count(C)for[C]in	S)/2

ลองออนไลน์!

inมีแท็บหลังจากที่เป็น

รายละเอียดคะแนน:

  • +27 สำหรับ 27 ตัวอักษรที่ไม่ซ้ำกัน
  • +16 สำหรับ 8 double chars: ()Camnou
  • +6 สำหรับ 1 ถ่านสามเท่า: S

13
ใช้แท็บแทนการเว้นวรรคเพื่อบันทึกไบต์
mbomb007

1
@ mbomb007 เพิ่งมีความคิดเดียวกัน :-)
xnor

1
@ mbomb007 ฮ่า ๆ นั่นเป็นเคล็ดลับอัจฉริยะ :-)
ETHproductions

14
@ mbomb007 นั่นเป็นแค่แท็บเทียบกับสงคราม
อวกาศในโค้ด golfed

2
ฉันจะแนะนำให้ใช้แบบฟอร์มฟีด (ซึ่งอนุญาตให้ใช้ช่องว่างในไวยากรณ์ Python ได้ด้วย) แต่คุณไม่มีช่องว่างที่จะแทนที่อีกต่อไป
user2357112

8

T-SQL คะแนน775 579! 580

declaRe @ char(876),@x int,@v int=0Select @=q+CHAR(9)from z X:seleCT @x=len(@),@=REPLACE(@,LEFT(@,1),''),@v+=(@x-LEN(@))*(@x-LEN(@)+1)/2IF LEN(@)>0GOTO X prINT @v-1

แก้ไข : วางตัวแปรสองตัวลงบีบอัดเล็กน้อย ลงไปที่ 16 @สัญลักษณ์แทน 22 ที่ด้วยตัวเองลดคะแนนของฉันโดยมหันต์ 117 คะแนน!

การประกวดที่ดีฉันชอบความต้องการที่จะเพิ่มประสิทธิภาพสำหรับบางสิ่งบางอย่างนอกเหนือจากจำนวนตัวละครทั้งหมด

การป้อนข้อมูลผ่านทาง varchar ฟิลด์Qในตารางที่มีอยู่ก่อนZ , ต่อกฎ IO ของเรา ฐานข้อมูลที่มีตารางอินพุตนี้ต้องถูกตั้งค่าเป็นการเปรียบเทียบขนาดเล็ก

จัดรูปแบบ:

declaRe @ char(876), @x int, @v int=0
Select @=q+CHAR(9)from z
X:
    seleCT @x=len(@)
          ,@=REPLACE(@,LEFT(@,1),'')
          ,@v+=(@x-LEN(@))*(@x-LEN(@)+1)/2
IF LEN(@)>0 GOTO X
prINT @v-1

คำหลัก SQL ไม่คำนึงถึงขนาดตัวพิมพ์ดังนั้นฉันจึงใช้ตัวพิมพ์ใหญ่และตัวพิมพ์เล็กเพื่อลดจำนวนตัวอักษรที่ซ้ำกัน ( aaAAให้คะแนนดีกว่า / ต่ำกว่าaaaa )

การวนซ้ำหลักจะเปรียบเทียบความยาวก่อนและหลังการแยกอินสแตนซ์ทั้งหมดของอักขระตัวแรกออก ความแตกต่างนั้น n * (n + 1) / 2 จะถูกเพิ่มเข้าไปในผลรวมสะสม

LEN()ฟังก์ชั่นSQL ไม่สนใจช่องว่างต่อท้ายดังนั้นฉันจึงต้องผนวกอักขระควบคุมและลบ 1 ในตอนท้าย

แก้ไข : แก้ไขผิดของคะแนนของตัวเองโดย 2 จุด (ไม่เห็นด้วยกับคำพูดที่อ้าง) ลดลง 1 Rโดยการเปลี่ยนท่อหนึ่ง นอกจากนี้ยังใช้กลยุทธ์ที่แตกต่างอย่างสิ้นเชิงฉันจะโพสต์สิ่งนั้นเป็นคำตอบของมันเอง


3
ตอนแรกฉันคิดว่าคะแนนของคุณคือ579! ≈ 8.22 x 10^1349
Engineer Toast

8

C (gcc)คะแนน:  113  103 100   96  91

ขอบคุณ @ugoren, @CalculatorFeline, @gastropner, @ l4m2 และ @ JS1 สำหรับคำแนะนำของพวกเขา

g(char*s){int y[238]={};while(*s)*y-=--y[*s++];*y/=1;}

เริ่มต้นอาร์เรย์เป็นศูนย์จากนั้นใช้ค่า ASCII ของอักขระในสตริงเป็นดัชนีของอาร์เรย์นั้นเพื่อติดตามจำนวนอินสแตนซ์ของแต่ละอักขระในสตริง

ลองออนไลน์!


3
คำแนะนำ: ใช้ชื่อตัวแปรที่ไม่ได้ใช้คำหลักเช่นz, ,x c
CalculatorFeline

@CalculatorFeline charรวมc...
Neil

3
นอกจากนี้คุณต้องมีอาเรย์องค์ประกอบ 127 ชิ้นเท่านั้น ( \x7fไม่สามารถพิมพ์ได้) และโปรดเพิ่มคำอธิบาย
CalculatorFeline

1
ไปงานเลี้ยงสาย แต่สิ่งนี้ควรจะ 96:z;g(char*s){int y[238]={z=0};while(*s)z+=--y[*s++];z/=~0;}
Gastropner

1
g(char*s){int y[238]={};while(*s)*y+=--y[*s++];*y/=~0;}
l4m2

7

JavaScript (ES6) คะแนน81 78

บันทึก 3 คะแนนขอบคุณ @Arnauld

s=>s.replace(d=/./g,z=>q+=d[z]=-~d[z],q=0)&&q

คะแนน recursive 81 คะแนนของฉันเดิม:

f=([c,...s],d={})=>c?(d[c]=-~d[c])+f(s,d):0



7

จอประสาทตาคะแนน 34

s(O`.
M&!`^|(?<=(.))\1*
.

ลองออนไลน์!

คำอธิบาย

s(O`.

เราเริ่มต้นด้วยการเรียงลำดับอักขระทั้งหมดในอินพุตเพื่อให้มีการจัดกลุ่มอักขระที่เหมือนกันเข้าด้วยกันเป็นการเรียกใช้ครั้งเดียว s(เปิดใช้งานโหมด singleline สำหรับทุกขั้นตอน (เช่นทำให้.linefeeds การแข่งขัน)

M&!s`^|(?<=(.))\1*

มีเป้าหมายที่จะเปิดการทำงานของnตัวอักษรลงในT nตัวอักษร (คนn TH จำนวนสามเหลี่ยม) เนื่องจากว่าเป็นคะแนนของการเกิดขึ้นของตัวละครนี้ ในการทำเช่นนั้นเราพบการแข่งขันที่ทับซ้อนกัน โดยเฉพาะอย่างยิ่งสำหรับแต่ละฉันใน[1, n]เราจะรวมอักขระi-1ไว้ในการแข่งขัน &เราได้รับการแข่งขันทุกคนเนื่องจากธงทับซ้อนกัน นั่นทำให้เราn * (n-1) / 2 = T n-1 = T n - nตัวละครจากการแข่งขัน แต่ระยะการแข่งขันจะเข้าร่วมเหล่านี้ด้วย linefeeds ซึ่งเป็นn linefeeds สำหรับnไม้ขีด มีปัญหาเดียวเท่านั้น จะไม่มีการป้อนบรรทัดหลังจากการจับคู่ครั้งล่าสุดดังนั้นจำนวนอักขระโดยรวมในเอาต์พุตจะน้อยกว่าที่เราต้องการ เราแก้ไขปัญหานี้ด้วยการจับคู่จุดเริ่มต้นของอินพุตซึ่งจะให้บรรทัดป้อนบรรทัดเดียวแก่เราหากมีคู่อื่นอย่างน้อยหนึ่งรายการ

.

ในที่สุดเราก็นับจำนวนตัวอักษรที่มีในสตริง


6

Haskell คะแนน52 51

f(a:b)=1+sum[1|c<-b,c==a]+f b;f _=0

มีแท็บระหว่างและf_

ลองออนไลน์!

ค่าของสตริงว่างคือ 0 ค่าของสตริง s โดยที่aเป็นอักขระตัวแรกและbส่วนที่เหลือของสตริงคือ 1 บวกการเกิดขึ้นของaในbบวกการเรียกซ้ำด้วย b


5

J , คะแนน 16

1#.,@(*+/\"1)&=

ลองออนไลน์!

คำอธิบาย

1#.,@(*+/\"1)&=
              =  Self-classify: bit matrix of equality between input
                 and its unique elements.
     (      )&   Apply verb in parentheses to it:
       +/\         running sums
          "1       of each row
      *            multiplied with original matrix.
                 This causes the i'th 1 on each row to be replaced by i.
   ,@            Flatten the resulting matrix
1#.              and interpret as a base-1 number, computing its sum.

การใช้1#.แทนการ+/@หาผลรวมจะบันทึกไม่กี่คะแนนและ&สามารถใช้แทนการใช้@ในบริบทของ monadic เพื่อบันทึกอีกหนึ่ง 1ค่าใช้จ่ายซ้ำฉันหนึ่งจุดพิเศษ แต่ฉันไม่สามารถกำจัดมันได้


"ภายหลัง" รอหนึ่งวัน
CalculatorFeline

2
@CalculatorFeline 10 ชั่วโมงต่อมายังคงอยู่ในภายหลัง : P
Zgarb

มาทำให้เป็นวันศุกร์ตอนนี้สิ
CalculatorFeline

ฉันใช้รูปแบบนี้สำหรับคำตอบของ TIO เพื่อแสดงจำนวนไบต์ที่ถูกต้องในส่วนของรหัสบางทีคุณอาจต้องการใช้มัน
Conor O'Brien

5

R , คะแนน: 67 83 95 128

-61 ขอบคุณเคล็ดลับยอดนิยมจาก Giuseppe

function(x,y=table(utf8ToInt(x)))y%*%{y+1}/2

ลองออนไลน์!

สตริงจะถูกแยกออกใช้utf8ToIntและแต่ละค่า ASCII tableจะถูกนับ ผลลัพธ์จะถูกคำนวณโดยใช้การคูณเมทริกซ์%*%กับตัวเองที่ +1 และครึ่งหนึ่ง


ใช้tableแทนrle; คุณสามารถกำจัดได้sortเช่นกัน (และคุณไม่จำเป็นต้องจัดทำดัชนี[[1]]เป็นผลของstrsplit)
จูเซปเป้

@iuseppe ขอบคุณมาก ฉันไม่ได้นึกถึงโต๊ะจะรวมเข้าด้วยกันในไม่ช้า
MickyT

2
ฉันคิดว่าคุณสามารถบันทึกเพิ่มเติมอีกสองสามไบต์โดยใช้ชื่อตัวแปรที่แตกต่างกันแทนn(เนื่องจากเป็นfunctionสองเท่า) และเปลี่ยน(n+1)เป็น{n+1}
Giuseppe

คะแนน: 67 การเปลี่ยนแปลงบางอย่างเกี่ยวกับสิ่งนี้อาจทำให้สามารถลดคะแนนได้อีก
จูเซปเป้

@Giuseppe ... ฉันควรอ่านมันอีกครั้ง ขออภัย
MickyT


4

Pyth , 6 คะแนน

1 ไบต์ต้องขอบคุณ isaacg

+F/V._

ชุดทดสอบ

มันทำงานอย่างไร

+F/V._
+F/V._QQ  implicit input
  /V      vectorize count: for each element in the first argument,
                           count the number of occurrences of the
                           second argument:
    ._Q       all prefixes of input
       Q      input
+F        fold (reduce) on +, base case 0.

s+0+Fเป็นเช่นเดียวกับ
isaacg

ดี! สิ่งที่ดีที่สุดที่ฉันทำได้คือusaShHGrScQ1 8Z16. คุณสามารถเพิ่มคำอธิบายได้ไหม?
บาดเจ็บทางระบบดิจิตอล

1
@DigitalTrauma ฉันได้เพิ่มคำอธิบายแล้ว
Leun Nun

s/LQคือคะแนน 4 คุณลักษณะนี้ใช้สำหรับการโพสต์ความท้าทายหรือไม่
เดฟ



4

C, 60 ไบต์, คะแนน108 95

g(char*s){int y[256]={},z=0;while(*s)z-=--y[*s++];return z;}

ลองออนไลน์!

โดยปกติผู้ประกอบการก่อนและหลังเพิ่มขึ้นนั้นยอดเยี่ยมสำหรับการตีกอล์ฟ

แก้ไข: ด้วยการลบจำนวนลบแทนการเพิ่มค่าบวกฉันบันทึกคะแนนเต็มทั้งหมด การแทนที่for()ด้วยwhile()เซมิโคลอนจะถูกกำจัดเช่นกัน



3

C # (. NET Core) , คะแนน∞ (ฉันหมายถึง, 209)

b=>b.Distinct().Select(z=>{var w=b.Count(p=>p==z);return w*(w+1)/2;}).Sum()

ลองออนไลน์!

คะแนนรวมถึงต่อไปนี้:

using System.Linq;

ฉันรู้ว่ามันผ่านมานานแล้ว แต่คุณสามารถเปลี่ยนreturn w*(w+1)/2เป็นreturn-~w*w/2(คะแนน 196) แก้ไข: คุณสามารถสร้างพอร์ตของคำตอบ Java 8ของฉันสำหรับคะแนน149 : using System.Linq;b=>{int[]x=new int[256];return\nb.Select(z=>++x[z]).Sum();} ลองออนไลน์
Kevin Cruijssen

1
@KevinCruijssen: ฉันได้รับการแก้ปัญหาของคุณลงไปที่คะแนน 111:b=>{var x=new int[256];return\nb.Sum(z=>++x[z]);}
raznagul

@raznagul ( * ตอบกลับอายุครึ่งปี * ) 109ถ้าคุณเปลี่ยนช่องว่างที่สองเป็นแท็บ ;) ลองใช้งานออนไลน์
Kevin Cruijssen

1
@KevinCruijssen (อีกครึ่งปีตอบรับเข้ามา) 49 ด้วยคอมไพเลอร์แบบโต้ตอบและฉันคิดว่ามันจะไม่ได้รับต่ำกว่า 48 ฉันพบว่าแปลกที่ C # กอล์ฟ golfed คำตอบได้รับมากขึ้นเท่าที่พวกเขาดูเหมือนจะกลายเป็น ลองออนไลน์!
บางคน

3

เยลลี่คะแนน 5

ĠJ€ẎS

ลองออนไลน์!

ขอบคุณLeaky Nunสำหรับ -2 (ก่อนหน้านี้กับคำตอบของเขา )


อ่าฉันไม่ได้สังเกตคำถามนี้เร็วพอ
Leun Nun

@LeakyNun ps คุณไม่ได้เป็นนินจาเสมอไปหรือไม่มีใครอยู่
Erik the Outgolfer

จริงๆ? ฉันไม่คิดอย่างนั้น
CalculatorFeline

คะแนน 5:ĠJ€ẎS
Leun Nun

@LeakyNun ตามที่สัญญา ... ใช่เครดิตจะมี :)
เอริก Outgolfer

3

PowerShell คะแนน 64

$z=@{}
$ARGS|% getE*|%{$u+=($Z.$_+=1)};$U

(คะแนนขึ้นอยู่กับบรรทัดใหม่ที่ขึ้นบรรทัดใหม่ซึ่งไม่ใช่มาตรฐาน Windows แต่ทำงานใน PS)

PS C:\> D:\unique-is-cheap.ps1 (gc D:\unique-is-cheap.ps1 -raw)
64
  • เคาน์เตอร์ Hashtable @{}
  • วนซ้ำตามตัวอักษร; $argsคืออาร์เรย์ของพารามิเตอร์ - ในกรณีนี้สตริงอินพุตทำให้เป็นอาร์เรย์ไอเท็มเดี่ยว |%ทำ foreach วนรอบไอเท็มและใช้getE*ช็อตคัตเพื่อจับคู่GetEnumerator()เมธอดสตริงและเรียกมันเพื่อเปลี่ยนสตริงให้เป็นสตรีมตัวอักษร
  • |%วนรอบตัวอักขระและเพิ่มรายการ hashtable ของพวกเขาเพิ่มไปยังผลรวมที่กำลังทำงานอยู่ ($x+=1)รูปแบบที่มี parens ทั้งปรับเปลี่ยนตัวแปรและผลค่าใหม่สำหรับการใช้งาน
  • เอาท์พุทผลรวมการทำงาน

(ตอนที่ฉันเขียนครั้งแรกมัน$c=@{};$t=0;[char[]]"$args"|%{$c[$_]++;$t+=$c[$_]};$tมีคะแนน 128 และรู้สึกว่ามันจะไม่ลดลงไปมากการลดลงถึง 64 เป็นที่น่าพอใจ)


1
61 pts / 38 bytesโดย messing กับการเพิ่มขึ้น
Veskah


3

Julia 0.6 , 45 ไบต์, คะแนน: 77

แรงบันดาลใจจากโซลูชัน MATL:

f(w)=sum(UpperTriangular([z==j for z=w,j=w]))

ลองออนไลน์!

วิธีแก้ปัญหาที่ไม่ค่อยสวยโดยใช้จำนวน:

จูเลีย 0.6คะแนน: 82

F(w)=sum(l->[l+1]l/2,count(x->x==i,w)for i=Set(w))

ลองออนไลน์!

ขอบคุณ Guiseppe สำหรับการชี้การให้คะแนนและเคล็ดลับ ความคิดเห็นเหล่านี้ช่วยฉันโหลดได้


1
คะแนนของการส่งของคุณคือค่าใช้จ่ายของรหัสของคุณซึ่งฉันคิดว่าเป็น 135
Giuseppe

1
ฉันไม่รู้ว่า Julia ทำได้ดีมาก แต่ฉันคิดว่าคุณสามารถลดคะแนนเป็น110 ได้ด้วยการเปลี่ยนชื่อตัวแปรและลบวงเล็บออก หากอนุญาตให้ส่งคืนเวกเตอร์แบบองค์ประกอบเดียวคุณสามารถแทนที่(x+1)ด้วย[x+1]เพื่อลดคะแนนเพิ่มเติมได้
Giuseppe

คุณสามารถบันทึกคะแนนโดยการเปลี่ยนพื้นที่ที่สองไปยังแท็บหรือบรรทัดใหม่: คะแนน 104 และเคล็ดลับ @Giuseppe ของการใช้[x+1]แทนการ(x+1)ลดลงในคะแนน 98
Kevin Cruijssen

3

Java 10, คะแนน: 149 138 137 134 133 130 103 102 101 100

( ไบต์: 72 73 74 75 64 62 61 ) ไบต์สูงขึ้น แต่คะแนนลดลง : D

x->{int j=0,q[]=new int[256];for(var    C:x)j+=++q[C];return
j;}

-28 คะแนน (และ -11 bytes) ขอบคุณที่@Nevay
-1 คะแนน (และ -2 bytes) ต้องขอบคุณ@ OlivierGrégoire
-1 คะแนน (และ -1 ไบต์) โดยการแปลง Java 8 เป็น Java 10

คำอธิบาย:

ลองที่นี่

x->{                     // Method with character-array parameter and integer return-type
  int j=0,               //  Result-integer, starting at 0
      q[]=new int[256];  //  Integer-array with 256 times 0
  for(var   C:x)         //  Loop over the characters of the input array
    j+=++q[C];           //   Raise the value in the array by 1,
                         //   and then add it to the result-integer
  return                 //  Return 
  j;}                    //         the result

1
คุณสามารถลบได้~หากคุณใช้j=0และreturn-j;(133)
Nevay

1
103:x->{int[]q=new int[256];return\nx.chars().map(v->++q[v]).sum();}
2560

1
@Nevay 103 จริง ๆ แล้วเมื่อฉันใช้jแทนu( returnมีu) และขึ้นบรรทัดใหม่และแท็บแทนช่องว่าง แก้ไข: ฮิฮิคุณได้แก้ไขเมื่อฉันแสดงความคิดเห็นนี้ :)
Kevin Cruijssen

3

F # คะแนน120 118

let j z=Seq.countBy id z|>Seq.sumBy(fun x->List.sum[0..snd x])

-2 ขอบคุณKevin Cruijssen !

ลองออนไลน์!

ใช้stringเป็นอินพุต Seq.countByจับคู่อักขระแต่ละตัวที่แตกต่างกันพร้อมกับนับจำนวน ( idเป็นฟังก์ชันตัวตน) เพื่อให้คุณได้คอลเลคชั่นเช่น'a' = 4, 'b' = 2ฯลฯ

Seq.sumByใช้เวลานับทุกตัวอักษรและสรุปตัวเลขทั้งหมดจาก0การนับตัวอักษรว่า ดังนั้นถ้า'a' = 4คอลเลกชันจะเป็นที่สรุปร่วมกันคือ0, 1, 2, 3, 4 10จากนั้นหาSeq.sumByผลรวมทั้งหมด


2
คุณสามารถลดคะแนนของคุณโดย 2 โดยการเปลี่ยนlet qไปlet jตั้งแต่ถูกใช้ไปแล้วทั้งในq Seq
Kevin Cruijssen

2

APL (Dyalog)คะแนน 15

+/1 1⍉+\∘.=⍨⍞

ลองออนไลน์!

 รับข้อความ

∘.=⍨ ตารางความเท่าเทียมกันด้วยตนเอง

+\ ผลรวมสะสมข้าม

1 1⍉ เส้นทแยงมุม (สว่างยุบทั้งสองมิติเป็นมิติเดียว)

+/ รวม


2

จอประสาทตาคะแนน68 45 43

s`(.)(?<=((\1)|.)+)
$#3$*
1

ลองออนไลน์! ลิงค์แสดงคะแนน แก้ไข: ขอบคุณ @MartinEnder ที่บันทึก 20 ไบต์โดยใช้การจับคู่ที่ทับซ้อนกันแทน lookaheads และอีกสามไบต์โดยการจัดกลุ่มขั้นตอนเพื่อให้การsตั้งค่าสถานะจะต้องใช้เพียงครั้งเดียว บันทึกอีกสองไบต์ด้วยการคำนวณหมายเลขสามเหลี่ยมต่างกันหลีกเลี่ยงความต้องการเรียงลำดับ



2

Perl 5 คะแนน91 83

ใช้-pแฟล็กซึ่งเพิ่ม 2 เนื่องจากการแบ่ง p

$x=$_;$b+=++$a{$_}for(split//,$x);$_=$b

ยินดีต้อนรับสู่ PPCG!
Laikoni

1
ใช้คำตอบของคุณเป็นฐานและใช้เทคนิคบางอย่างจากหน้าเคล็ดลับฉันจัดการเพื่อให้คะแนนของคุณลดลงถึง 31: ลองออนไลน์! . $` is automatically พิมพ์ed after each call so we can use that to store the score and /./ g` กลับรายการของตัวอักษรทั้งหมดในซึ่งมีราคาถูกกว่า$_ split//
Dom Hastings

ฉันรู้ว่านี่เป็นความท้าทายแบบเก่า แต่คุณสามารถลดคะแนนได้มากขึ้น: ลองออนไลน์!
Xcali

2

อ็อกเทฟ 39 ไบต์, คะแนน 69

@(a)sum((b=hist(a,unique(1*a))).^2+b)/2

ลองออนไลน์!

ในขณะที่มีคำตอบ Octave อีกคำตอบนี้เป็นของฉันเองและเป็นแนวทางที่แตกต่างกันโดยสิ้นเชิง แต่ก็ให้คะแนนน้อยกว่า :)

วิธีการนี้จะเริ่มต้นในการค้นหาจำนวน (b) ของอักขระที่ไม่ซ้ำกันแต่ละรายการซึ่งทำได้โดยใช้ฟังก์ชันฮิสโตแกรม แล้วสำหรับแต่ละองค์ประกอบที่เราคำนวณผลรวมของ 1 (b*(b+1))/2ถึงขซึ่งจะทำโดยใช้สูตร จากนั้นผลรวมแต่ละบุคคลจะถูกรวมเข้ากับคะแนนสุดท้าย

ในการทดสอบดูเหมือนว่าวงเล็บมีค่าใช้จ่ายสูงในการให้คะแนนเพราะมีความจำเป็นมาก ฉันปรับให้เหมาะสมจากคะแนนเริ่มต้นประมาณ 88 โดยจัดเรียงคำถามใหม่เพื่อลดจำนวนวงเล็บเปิด / ปิด - ดังนั้นตอนนี้เราทำ / 2 โดยรวมสุดท้ายแทนที่จะเป็นรายบุคคลและฉันได้ปรับสูตรเป็น(b^2+b)/2เนื่องจากต้องใช้วงเล็บน้อยกว่า


1
น่าเสียดายที่สิ่งนี้ดูเหมือนว่าจะล้มเหลวในสตริงว่าง:error: hist: subscript indices must be either positive integers less than 2^31 or logicals
Laikoni

2

เสียงกระเพื่อมสามัญคะแนน286 232 222

(loop with w =(fill(make-list 128)0)as z across(read)sum(incf(elt w(char-code z))))

คะแนนที่มีมูลค่าสูงเนื่องจากไวยากรณ์ของคำศัพท์ในตัวดำเนินการ Common LISP

ลองออนไลน์!

รหัสที่ไม่ดีนัก:

(loop with w = (fill (make-list 128) 0)  ; create a list to count characters
   as z across (read)                   ; for each character of input
   sum (incf (elt w (char-code z))))     ; increase count in list and sum

2

Mathematica คะแนน 54

Total[#(#+1)/2&@Counts@Characters@#]&

อินพุต

[ "abcdefg"]

ขอบคุณ hftf


Total[#(#+1)/2&@Counts@Characters@#]&คะแนน 54.
hftf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.