Độc đáo là giá rẻ


93

Viết hàm hoặc chương trình xác định chi phí của một chuỗi đã cho, trong đó

  • chi phí của mỗi ký tự bằng số lần nhân vật đã xảy ra cho đến thời điểm này trong chuỗi và
  • chi phí của chuỗi là tổng chi phí của các ký tự.

Thí dụ

Đối với đầu vào abaacab, chi phí được tính như sau:

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

Do đó, chi phí cho chuỗi abaacablà 14.

Quy tắc

  • Điểm của bài nộp của bạn là chi phí cho mã của bạn như được xác định ở trên , đó là bài nộp của bạn chạy trên mã nguồn của chính nó, với điểm thấp hơn sẽ tốt hơn.
  • Việc gửi của bạn phải hoạt động trên các chuỗi chứa các ký tự ASCII có thể in được, cộng với tất cả các ký tự được sử dụng trong quá trình gửi của bạn.
  • Các nhân vật là trường hợp nhạy cảm, đó là aAlà các nhân vật khác nhau.

Tủ thử

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

Bảng xếp hạng


2
Làm thế nào để các cờ chương trình như -nđối với Perl được tính vào điểm số? Theo truyền thống, nó được tính là 1 byte vì khoảng cách chỉnh sửa giữa tiêu chuẩn perl -eperl -nelà 1, nhưng đối với thử thách này, liệu nsố liệu cho mục đích đếm trùng lặp?
Mực giá trị

2
@ValueInk Vâng, tôi nghĩ rằng đếm nlà lựa chọn công bằng nhất.
Laikoni

1
Tôi thực sự muốn có một giải pháp cân não cho thử thách này.
Peter1807

10
+1 cho Điểm số bài nộp của bạn là chi phí cho mã của bạn
luizfzs

1
chi phí của một nhân vật được định nghĩa là how often this character has already occurred in the string, có lẽ tôi sẽ thay đổi để how many times the character has occurred up to this pointlàm rõ hơn rằng lần sử dụng đầu tiên có chi phí 1, không phải 0
ngầm trong

Câu trả lời:


83

MATL , điểm 4

&=Rz

Hãy thử trực tuyến!

Giải trình

Hãy xem xét đầu vào 'ABBA'là một ví dụ.

&=   % 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
Bạn có phải là giáo sư đại số tuyến tính?
Bạch tuộc ma thuật Urn

4
@carusocomputing Thực sự là một giáo sư truyền thông di động. Xu hướng sử dụng ma trận của tôi xuất phát từ nhiều năm lập trình ở Matlab
Luis Mendo

Khéo léo! Matlab có lớn trong khu vực đó không? Tôi chưa bao giờ thực sự nhìn vào GSM hoặc bất cứ thứ gì tương tự.
Bạch tuộc ma thuật Urn

2
Tôi tham gia cộng đồng này chỉ để khen ngợi bạn về giải pháp tuyệt vời này!
Wboy

1
@carusocomputing Matlab là một công cụ / ngôn ngữ rất phổ biến trong kỹ thuật nói chung. Nó tốt ở tính toán số: đại số tuyến tính, xử lý tín hiệu và tương tự. Và là một ngôn ngữ được giải thích, nó rất dễ sử dụng
Luis Mendo

17

Con trăn , điểm 49

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

Hãy thử trực tuyến!

Có một tab sau in.

Phân tích điểm:

  • +27 cho 27 ký tự độc đáo
  • +16 cho 8 ký tự kép: ()Camnou
  • +6 cho 1 char ba lần: S

13
Sử dụng một tab thay vì một khoảng trắng để lưu một byte.
mbomb007

1
@ mbomb007 Chỉ có cùng một ý tưởng :-)
xnor

1
@ mbomb007 Hah, đó là một trò lừa thiên tài :-)
Sản phẩm ETH

14
@ mbomb007 chỉ là các tab so với không gian chiến tranh bên trong mã golf
Erik the Outgolfer

2
Tôi sẽ đề nghị sử dụng một nguồn cấp dữ liệu biểu mẫu (cũng là khoảng trắng được phép trong cú pháp Python), nhưng bạn không có thêm khoảng trắng nào để thay thế.
dùng2357112

8

T-SQL, điểm 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

EDIT : Bỏ một vài biến, nén một chút. Xuống tới 16 @biểu tượng thay vì 22, tự nó làm giảm điểm của tôi bằng một con số khổng lồ 117 điểm!

Cuộc thi hay, tôi thích yêu cầu tối ưu hóa cho thứ gì đó ngoài tổng số nhân vật.

Đầu vào là thông qua trường varchar q trong bảng z có sẵn , theo quy tắc IO của chúng tôi . Cơ sở dữ liệu chứa bảng đầu vào này phải được đặt thành đối chiếu phân biệt chữ hoa chữ thường .

Định dạng:

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

Các từ khóa SQL không phân biệt chữ hoa chữ thường, vì vậy tôi đã sử dụng trường hợp hỗn hợp để giảm thiểu số lượng chữ cái trùng lặp ( aaAA tạo ra điểm số tốt hơn / thấp hơn aaaa ).

Vòng lặp chính so sánh độ dài trước và sau khi tước tất cả các phiên bản của ký tự đầu tiên. Sự khác biệt đó n * (n + 1) / 2 được thêm vào tổng số đang chạy.

Hàm SQL LEN()khó chịu bỏ qua dấu cách, vì vậy tôi phải thêm một ký tự điều khiển và trừ đi 1 ở cuối.

EDIT : Đã sửa lỗi tính toán điểm của riêng tôi 2 điểm (vấn đề với trích dẫn trích dẫn), giảm 1 bằng cách thay đổi vỏ của một R. Cũng làm việc trên một chiến lược hoàn toàn khác, tôi sẽ đăng đó là câu trả lời của riêng mình.


3
Lúc đầu, tôi nghĩ điểm của bạn là579! ≈ 8.22 x 10^1349
Kỹ sư Toast

8

C (gcc) , điểm:  113  103 100   96  91

Cảm ơn @ugoren, @CalculatorFeline, @gastropner, @ l4m2 và @ JS1 vì những lời khuyên của họ.

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

Khởi tạo một mảng các số không, sau đó sử dụng các giá trị ASCII của các ký tự trong chuỗi làm chỉ mục cho mảng đó để theo dõi số lượng phiên bản của mỗi ký tự trong chuỗi.

Hãy thử trực tuyến!


3
Gợi ý: Sử dụng tên biến không được sử dụng trong các từ khóa, giống như z, x, c.
Máy

@CalculatorFeline charbao gồm c...
Neil

3
Ngoài ra, bạn chỉ cần một mảng phần tử 127 ( \x7fkhông thể in được) và vui lòng thêm một lời giải thích.
Máy

1
Đến bữa tiệc muộn, nhưng điều này sẽ là 96:z;g(char*s){int y[238]={z=0};while(*s)z+=--y[*s++];z/=~0;}
dạ dày

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

7

JavaScript (ES6), điểm 81 78

Lưu được 3 điểm nhờ @Arnauld

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

Giải pháp đệ quy điểm-81 gốc của tôi:

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



7

Võng mạc , điểm 34

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

Hãy thử trực tuyến!

Giải trình

s(O`.

Chúng tôi bắt đầu bằng cách sắp xếp tất cả các ký tự trong đầu vào để các ký tự giống hệt nhau được nhóm lại thành một lần chạy. Các s(kích hoạt chế độ singleline cho tất cả các giai đoạn (tức là làm cho .linefeeds trận đấu).

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

Mục tiêu là biến một chuỗi n ký tự thành các ký tự T n ( số tam giác thứ n ) vì đó là điểm số của các lần xuất hiện của nhân vật này. Để làm như vậy, chúng tôi tìm thấy các trận đấu chồng chéo. Đặc biệt, với mỗi i trong [1, n] , chúng tôi sẽ đưa các ký tự i-1 vào trận đấu. Chúng tôi nhận được tất cả các trận đấu do cờ chồng chéo &. Điều đó cho chúng ta n * (n-1) / 2 = T n-1 = T n - n ký tự chỉ từ các trận đấu. Nhưng giai đoạn đối sánh sẽ tham gia những điều này với các nguồn cấp dữ liệu, đó là các nguồn cấp dữ liệu n cho nDiêm. Chỉ có một vấn đề. Sẽ không có nguồn cấp dữ liệu sau trận đấu cuối cùng, vì vậy tổng số ký tự trong đầu ra ít hơn một ký tự chúng tôi cần. Chúng tôi khắc phục điều này bằng cách khớp với phần đầu của đầu vào, điều này mang lại cho chúng tôi một nguồn cấp dữ liệu hàng đầu duy nhất nếu có ít nhất một kết quả khớp khác.

.

Cuối cùng, chúng ta chỉ đếm có bao nhiêu ký tự trong chuỗi.


6

Haskell, điểm 52 51

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

Có một tab giữa f_.

Hãy thử trực tuyến!

Giá trị của chuỗi rỗng là 0. Giá trị của chuỗi s, nơi alà char đầu tiên và bphần còn lại của chuỗi là 1 cộng với sự xuất hiện của atrong bcộng với một cuộc gọi đệ quy với b.


5

J , điểm 16

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

Hãy thử trực tuyến!

Giải trình

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.

Sử dụng 1#.thay +/@cho tổng đã lưu một vài điểm và &có thể được sử dụng thay vì @trong bối cảnh đơn điệu để lưu thêm một điểm. Việc lặp đi lặp lại 1khiến tôi mất thêm một điểm, nhưng tôi không thể thoát khỏi nó.


"sau này" đợi một phần tư
Máy

2
@CalculatorFeline 10 giờ sau vẫn còn muộn. : P
Zgarb

Bây giờ chúng ta hãy làm cho nó một vừng.
Máy

Cá nhân tôi sử dụng định dạng này cho các câu trả lời của TIO để phản ánh số byte chính xác trong phần mã, có thể bạn sẽ muốn sử dụng nó
Conor O'Brien

5

R , điểm: 67 83 95 128

-61 nhờ những lời khuyên hàng đầu từ Giuseppe

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

Hãy thử trực tuyến!

Chuỗi được phân chia bằng cách sử dụng utf8ToIntvà mỗi giá trị ascii được tính table. Kết quả được tính toán bằng cách thực hiện phép nhân ma trận %*%so với chính nó + 1 và cuối cùng là một nửa.


sử dụng tablethay vì rle; bạn cũng có thể thoát khỏi sort(và bạn không phải lập chỉ mục [[1]]vào kết quả của strsplit)
Giuseppe

@Giuseppe Cảm ơn rất nhiều. Tôi thậm chí không nghĩ về bảng, sẽ kết hợp sớm.
MickyT

2
Tôi nghĩ rằng bạn có thể tiết kiệm thêm một vài byte bằng cách sử dụng một tên biến khác thay vì n(vì nó thành functionhai lần) và cũng đổi (n+1)thành{n+1}
Giuseppe

điểm: 67 . Một số biến thể về điều này có thể làm cho nó có thể giảm điểm hơn nữa.
Giuseppe

@Giuseppe ... Tôi nên đọc lại nó. Rất tiếc
MickyT


4

Pyth , điểm 6

1 byte nhờ isaacg.

+F/V._

Bộ thử nghiệm.

Làm thế nào nó hoạt động

+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+0cũng giống như +F.
isaacg

Tốt Điều tốt nhất tôi có thể làm là usaShHGrScQ1 8Zcho 16. Bạn có thể thêm một lời giải thích?
Chấn thương kỹ thuật số

1
@DigitalTrauma Tôi đã thêm một lời giải thích.
Rò rỉ Nun

s/LQlà điểm 4, điều này có sử dụng các tính năng trì hoãn thử thách không?
Dave


4

Thạch , điểm 7

ċЀQRFS

Giải trình:

   Q    get unique letters
ċЀ     count the occurences of each letter in the original string
    R   [1..n] for n in list of frequencies
     F  flatten list
      S sum
        (implicit output)

Hãy thử trực tuyến!


2
Chào mừng đến với PPCG!
Laikoni

4

C, 60 byte, điểm 108 95

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

Hãy thử trực tuyến!

Thông thường các nhà khai thác trước và sau tăng rất tốt cho môn đánh gôn, nhưng họ thực sự đau lòng với thử thách này!

EDIT: Bằng cách trừ các số âm thay vì thêm các số dương, tôi đã lưu cả đống điểm. Thay thế for()bằng while()loại bỏ một dấu chấm phẩy là tốt.



3

C # (.NET Core) , điểm (ý tôi là, 209)

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

Hãy thử trực tuyến!

Điểm số bao gồm:

using System.Linq;

Tôi biết đã được một lúc, nhưng bạn có thể thay đổi return w*(w+1)/2thành return-~w*w/2(điểm 196). EDIT: Bạn có thể tạo một cổng của câu trả lời Java 8 của tôi với số điểm 149 : using System.Linq;b=>{int[]x=new int[256];return\nb.Select(z=>++x[z]).Sum();} Dùng thử trực tuyến.
Kevin Cruijssen

1
@KevinCruijssen: Tôi đã nhận được giải pháp của bạn với số điểm 111:b=>{var x=new int[256];return\nb.Sum(z=>++x[z]);}
raznagul

@raznagul ( * phản hồi nửa năm tuổi đến * ) 109 nếu bạn thay đổi không gian thứ hai thành tab. ;) Hãy thử trực tuyến.
Kevin Cruijssen

1
@KevinCruijssen (một câu trả lời nửa năm nữa mới đến) 49 với trình biên dịch tương tác và tôi nghĩ rằng nó sẽ không bao giờ đạt được dưới 48. Tôi thấy thật kỳ lạ khi các câu trả lời C # được chơi golf càng nhiều, chúng càng dễ đọc hơn. Hãy thử trực tuyến!
ai đó

3

Thạch , điểm 5

ĠJ€ẎS

Hãy thử trực tuyến!

Cảm ơn Leaky Nun cho -2 (trước đây về câu trả lời của anh ấy )


Ahhh tôi không nhận thấy câu hỏi này đủ nhanh.
Rò rỉ Nun

@LeakyNun ps bạn không phải lúc nào cũng là ninja, cũng không phải ai
Erik the Outgolfer

Có thật không? Tôi không nghĩ vậy.
Máy

Điểm 5:ĠJ€ẎS
Leaky Nun

@LeakyNun Như đã hứa ... vâng, tín dụng ở đó :)
Erik the Outgolfer

3

PowerShell, điểm 64

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

(Điểm được dựa trên một dòng mới cho nguồn cấp dữ liệu, không phải là tiêu chuẩn của Windows nhưng hoạt động trong PS).

PS C:\> D:\unique-is-cheap.ps1 (gc D:\unique-is-cheap.ps1 -raw)
64
  • Bộ đếm băm @{}
  • Lặp lại qua các chữ cái; $argslà một mảng các tham số - trong trường hợp này, chuỗi đầu vào làm cho nó thành một mảng mục duy nhất; |%thực hiện một vòng lặp foreach trên các mục và sử dụng getE*phím tắt để khớp với GetEnumerator()phương thức chuỗi và gọi nó để biến chuỗi thành một luồng ký tự.
  • |%lặp qua các ký tự và tăng mục nhập hashtable của chúng, thêm nó vào tổng số đang chạy. Biểu ($x+=1)mẫu với parens đều sửa đổi biến và xuất giá trị mới để sử dụng.
  • Xuất tổng số chạy.

(Khi tôi lần đầu tiên viết nó, nó $c=@{};$t=0;[char[]]"$args"|%{$c[$_]++;$t+=$c[$_]};$tcó số điểm 128, và cảm giác như nó sẽ không xuống thấp hơn nhiều. Giảm một nửa xuống còn 64 là khá dễ chịu).


1
61 điểm / 38 byte bằng cách làm rối với mức tăng
Veskah


3

Julia 0,6 , 45 byte, Điểm: 77

Lấy cảm hứng từ giải pháp MATL:

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

Hãy thử trực tuyến!

Một giải pháp ít đẹp hơn, sử dụng số lượng:

Julia 0,6 , điểm: 82

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

Hãy thử trực tuyến!

Cảm ơn Guiseppe đã chỉ ra cách tính điểm và cho lời khuyên. Những ý kiến ​​đã giúp tôi tải.


1
Điểm số của bài nộp của bạn là chi phí mã của bạn , mà tôi nghĩ là 135.
Giuseppe

1
Tôi không biết rõ về Julia nhưng tôi nghĩ bạn có thể giảm điểm xuống 110 bằng cách chuyển một số tên biến và xóa một bộ dấu ngoặc. Nếu trả về một vectơ một phần tử được cho phép, thì bạn có thể thay thế (x+1)bằng [x+1]để giảm thêm điểm.
Giuseppe

Bạn có thể lưu điểm bằng cách thay đổi không gian thứ hai thành tab hoặc dòng mới: điểm 104 . Và @Giuseppe mẹo sử dụng [x+1]thay vì (x+1)hạ thấp nó xuống điểm 98 .
Kevin Cruijssen

3

Java 10, điểm: 149 138 137 134 133 130 103 102 101 100

( Byte: 72 73 74 75 64 62 61 ) Byte tăng, nhưng điểm số giảm. :CƯỜI MỞ MIỆNG

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

-28 điểm (và -11 byte) nhờ @Nevay .
-1 điểm (và -2 byte) nhờ @ OlivierGrégoire .
-1 điểm (và -1 byte) bằng cách chuyển đổi Java 8 sang Java 10.

Giải trình:

Hãy thử nó ở đây.

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
Bạn có thể loại bỏ ~nếu bạn sử dụng j=0return-j;(133).
Nevay

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

1
@Nevay 103 thực sự, khi tôi sử dụng jthay vì u( returnchứa u) và một dòng mới và tab thay vì khoảng trắng. EDIT: Hehe, bạn đã chỉnh sửa ngay khi tôi đưa ra nhận xét này. :)
Kevin Cruijssen

3

F #, điểm 120 118

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

-2 cảm ơn Kevin Cruijssen !

Hãy thử trực tuyến!

Có một stringđầu vào. Seq.countByghép từng ký tự riêng biệt với số đếm của nó ( idlà hàm nhận dạng) để bạn kết thúc với một bộ sưu tập như 'a' = 4, 'b' = 2v.v.

Số Seq.sumByđếm cho mỗi chữ cái và tính tổng tất cả các số từ 0đến số đếm cho chữ cái đó. Vì vậy, nếu 'a' = 4bộ sưu tập sẽ được 0, 1, 2, 3, 4tổng hợp với nhau là 10. Sau đó Seq.sumBytổng hợp tất cả những tổng số đó.


2
Bạn có thể làm giảm điểm số của bạn bằng 2 bằng cách thay đổi let qđể let j, vì qđã được sử dụng trong cả hai Seq.
Kevin Cruijssen

2

APL (Dyalog) , điểm 15

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

Hãy thử trực tuyến!

 nhận văn bản nhập

∘.=⍨ bảng bình đẳng với bản thân

+\ tổng tích lũy trên

1 1⍉ đường chéo (lit. thu gọn cả hai chiều thành một chiều)

+/ tổng


2

Võng mạc , điểm 68 45 43

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

Hãy thử trực tuyến! Liên kết cho thấy điểm số. Chỉnh sửa: Cảm ơn @MartinEnder, người đã lưu 20 byte bằng cách sử dụng các kết quả trùng lặp thay vì tìm kiếm và thêm ba byte bằng cách nhóm các giai đoạn để scờ chỉ cần được áp dụng một lần. Đã lưu thêm hai byte bằng cách tính số tam giác khác nhau, tránh sự cần thiết phải sắp xếp.



2

5 điểm Perl 91 83

Sử dụng -pcờ có thêm 2 vì p được chia.

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

Chào mừng đến với PPCG!
Laikoni

1
Sử dụng câu trả lời của bạn làm cơ sở và áp dụng một số kỹ thuật từ trang mẹo, tôi đã quản lý để giảm điểm của bạn xuống còn 31: Hãy thử trực tuyến! . $` is automatically print ed after each call so we can use that to store the score and /./ g` trả về một danh sách tất cả các ký tự trong $_, rẻ hơn split//.
Dom Hastings

Tôi biết đây là một thử thách cũ, nhưng bạn có thể cắt giảm điểm số hơn nữa: Hãy thử trực tuyến!
Xcali

2

Octave , 39 byte, Điểm 69

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

Hãy thử trực tuyến!

Mặc dù có một câu trả lời khác của Octave, nhưng câu trả lời này hoàn toàn là của riêng tôi và một cách tiếp cận khác, cộng với nó ít điểm hơn :).

Cách tiếp cận tập trung vào lần đầu tiên tìm số đếm (b) của từng ký tự duy nhất, đạt được bằng cách sử dụng chức năng biểu đồ. Sau đó, với mỗi phần tử, chúng tôi tính tổng từ 1 đến b được thực hiện bằng công thức (b*(b+1))/2. Sau đó, các khoản tiền riêng lẻ được tổng hợp vào điểm số cuối cùng.

Trong thử nghiệm, dường như các dấu ngoặc thực sự tốn kém trong việc tính điểm vì cần nhiều. Tôi đã tối ưu hóa từ điểm số ban đầu khoảng 88 bằng cách sắp xếp lại các câu hỏi để giảm thiểu số lượng dấu ngoặc mở / đóng - do đó giờ đây chúng tôi thực hiện / 2 trên tổng số cuối cùng thay vì riêng lẻ và tôi cũng đã sửa đổi công thức thành (b^2+b)/2vì điều đó đòi hỏi ít dấu ngoặc hơn.


1
Thật không may, điều này dường như thất bại trên chuỗi trống:error: hist: subscript indices must be either positive integers less than 2^31 or logicals
Laikoni

2

Lisp thường gặp, điểm số 286 232 222

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

Điểm có giá trị cao do cú pháp dài dòng của các toán tử dựng sẵn của Common Lisp.

Hãy thử trực tuyến!

Mã không mã hóa:

(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

Toán, điểm 54

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

đầu vào

["abcdefg"]

cảm ơn


Total[#(#+1)/2&@Counts@Characters@#]&điểm 54.
hftf
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.