Einzigartig ist billig

93

Schreiben Sie eine Funktion oder ein Programm, die bzw. das die Kosten einer bestimmten Zeichenfolge ermittelt

  • Die Kosten für jedes Zeichen entsprechen der Anzahl, wie oft das Zeichen bis zu diesem Punkt in der Zeichenfolge vorgekommen ist
  • Die Kosten der Zeichenfolge sind die Summe der Kosten der Zeichen.

Beispiel

Für eine Eingabe von abaacabwerden die Kosten wie folgt berechnet:

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

Also die Kosten für den String abaacab 14.

Regeln

  • Das Ergebnis Ihrer Einreichung sind die Kosten Ihres Codes, wie oben definiert, dh , Ihre Einreichung wird mit einem niedrigeren Quellcode ausgeführt Bewertung besser ist.
  • Ihre Einreichung sollte mit Zeichenfolgen funktionieren, die druckbare ASCII-Zeichen sowie alle in Ihrer Einreichung verwendeten Zeichen enthalten.
  • Charaktere sind case-sensitive, das heißt aund Asind unterschiedliche Charaktere.

Testfälle

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

Bestenliste

Laikoni
quelle
2
Wie zählen Programmflags wie -nfür Perl zur Punktzahl? Es zählt traditionell als 1 Byte, da der Bearbeitungsabstand zwischen dem Standard perl -eund perl -ne1 ist. Wird bei dieser Herausforderung die nZählung zum Zählen von Duplikaten durchgeführt?
Value Ink
2
@ValueInk Ja, ich denke, das zu zählen nist die fairste Option.
Laikoni
1
Ich wünschte wirklich, es gäbe eine Lösung für diese Herausforderung.
Peter1807
10
+1 für Das Ergebnis Ihres
Beitrags
1
Die Kosten eines Charakters sind definiert als how often this character has already occurred in the string, ich würde wahrscheinlich ändern, how many times the character has occurred up to this pointum es klarer zu machen, dass die erste Verwendung 1 kostet, nicht 0
U-Bahn-

Antworten:

83

MATL , Punktzahl 4

&=Rz

Probieren Sie es online!

Erläuterung

Betrachten Sie die Eingabe 'ABBA'als Beispiel.

&=   % 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
Luis Mendo
quelle
14
Sind Sie ein Professor für lineare Algebra?
Magic Octopus Urn
4
@carusocomputing Eigentlich ein Mobilfunkprofessor. Meine Tendenz, Matrizen zu verwenden, ist auf jahrelange Programmierung in Matlab
Luis Mendo vom
Ordentlich! Ist Matlab in diesem Bereich groß? Ich habe mich noch nie wirklich mit GSM oder Ähnlichem befasst.
Magic Octopus Urn
2
Ich bin dieser Community beigetreten, um Sie für diese hervorragende Lösung zu loben!
Wboy
1
@carusocomputing Matlab ist im Ingenieurwesen im Allgemeinen ein sehr verbreitetes Werkzeug / eine sehr verbreitete Sprache. Es ist gut in der numerischen Berechnung: lineare Algebra, Signalverarbeitung und dergleichen. Und als interpretierte Sprache ist es sehr einfach zu benutzen
Luis Mendo
17

Python , Punktzahl 49

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

Probieren Sie es online!

Es gibt einen Vorsprung danach in.

Aufschlüsselung der Punkte:

  • +27 für 27 einzigartige Zeichen
  • +16 für 8 Doppelzeichen: ()Camnou
  • +6 für 1 verdreifachtes Zeichen: S
xnor
quelle
13
Verwenden Sie einen Tabulator anstelle eines Leerzeichens, um ein Byte zu speichern.
mbomb007
1
@ mbomb007 Hatte gerade die gleiche Idee :-)
XNOR
1
@ mbomb007 Hah, das ist ein genialer Trick :-)
ETHproductions
14
@ mbomb007 Das ist nur Tabs vs. Leerzeichen Krieg in Golf Code
Erik der Outgolfer
2
Ich wollte vorschlagen, einen Formular-Feed zu verwenden (der auch in der Python-Syntax als Leerzeichen zulässig ist), aber Sie müssen kein Leerzeichen mehr ersetzen.
user2357112
8

T-SQL, Ergebnis 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

BEARBEITEN : Einige Variablen entfernt, etwas komprimiert. Bis 16@Anstelle von 22 Symbole reduziert das meine Punktzahl um satte 117 Punkte!

Netter Wettbewerb, mir gefällt die Forderung, nicht nur die Gesamtcharakterzahl zu optimieren.

Die Eingabe erfolgt über varchar Feld q in bereits bestehenden Tabelle z , gemäß unseren IO Regeln . In der Datenbank, die diese Eingabetabelle enthält, muss zwischen Groß- und Kleinschreibung unterschieden werden .

Formatiert:

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

Bei SQL-Schlüsselwörtern wird nicht zwischen Groß- und Kleinschreibung unterschieden, daher habe ich die Anzahl der doppelten Buchstaben in Groß- und Kleinschreibung minimiert ( aaAA generiert eine bessere / niedrigere Bewertung als aaaa ).

Die Hauptschleife vergleicht die Länge vor und nach dem Entfernen aller Instanzen des ersten Zeichens. Diese Differenz n * (n + 1) / 2 wird zu einer laufenden Summe addiert.

Die SQL- LEN()Funktion ignoriert ärgerlicherweise nachfolgende Leerzeichen, daher musste ich ein Steuerzeichen anhängen und am Ende 1 subtrahieren.

BEARBEITEN : Eine Fehleinschätzung meiner eigenen Punktzahl um 2 Punkte (Problem mit Anführungszeichen) wurde behoben, die durch Ändern der Groß- und Kleinschreibung um 1 verringert wurde R. Ich arbeite auch an einer völlig anderen Strategie und werde dies als eigene Antwort veröffentlichen.

BradC
quelle
3
Zuerst dachte ich, deine Punktzahl wäre 579! ≈ 8.22 x 10^1349
Engineer Toast
8

C (gcc) , Punktzahl:  113  103 100   96  91

Vielen Dank an @ugoren, @CalculatorFeline, @gastropner, @ l4m2 und @ JS1 für ihre Tipps.

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

Initialisiert ein Array mit Nullen und verwendet dann die ASCII-Werte der Zeichen in der Zeichenfolge als Indizes für dieses Array, um die Anzahl der Instanzen jedes Zeichens in der Zeichenfolge zu verfolgen.

Probieren Sie es online!

Steadybox
quelle
3
Vorschlag: Verwenden Sie Variablennamen, die nicht in Schlüsselwörtern verwendet zwerden x, z c.
CalculatorFeline
@CalculatorFeline charenthält c...
Neil
3
Außerdem benötigen Sie nur ein 127-Element-Array (kann \x7fnicht gedruckt werden) und fügen Sie eine Erklärung hinzu.
CalculatorFeline
1
Spät zur Party, aber das sollte 96 sein: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;}
14 m²,
7

JavaScript (ES6), Partitur 81 78

3 Punkte gespart dank @Arnauld

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

Meine ursprüngliche rekursive Score-81-Lösung:

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

Haskell , Punktzahl 42

f l=sum[1|c<-l,d<-c:l,d==c]/2

Probieren Sie es online!

Anonymisierung \l->ergibt die gleiche Punktzahl.

xnor
quelle
7

Retina , 34 Punkte

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

Probieren Sie es online!

Erläuterung

s(O`.

Wir beginnen damit, alle Zeichen in der Eingabe so zu sortieren, dass identische Zeichen zu einem einzigen Lauf zusammengefasst werden. Der s(Aktiviert den Single-Line-Modus für alle Stufen (dh führt .Match-Linefeeds durch).

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

Das Ziel ist es, eine Folge von n Zeichen in T n Zeichen (die n- te dreieckige Zahl) umzuwandeln, da dies die Punktzahl für das Auftreten dieses Zeichens ist. Dazu finden wir überlappende Übereinstimmungen. Insbesondere werden wir für jedes i in [1, n] i-1 Zeichen in die Übereinstimmung aufnehmen. Wir erhalten alle diese Übereinstimmungen aufgrund der überlappenden Flagge &. Das ergibt n * (n-1) / 2 = T n-1 = T n - n Zeichen nur aus den Übereinstimmungen. Aber die Match-Phase wird diese mit Linefeeds verbinden, für die es sich um n Linefeeds handelt n sindStreichhölzer. Es gibt nur ein Problem. Nach der letzten Übereinstimmung wird kein Zeilenvorschub ausgegeben, sodass die Gesamtanzahl der Zeichen in der Ausgabe um eins geringer ist als benötigt. Wir beheben dies, indem wir auch den Anfang der Eingabe anpassen, wodurch wir einen einzelnen Zeilenvorschub erhalten, wenn mindestens eine andere Übereinstimmung vorliegt.

.

Schließlich zählen wir nur, wie viele Zeichen sich in der Zeichenfolge befinden.

Martin Ender
quelle
6

Haskell, Ergebnis 52 51

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

Es gibt eine Lasche zwischen fund _.

Probieren Sie es online!

Der Wert der leeren Zeichenfolge ist 0. Der Wert der Zeichenfolge s, wobei adas erste Zeichen und bder Rest der Zeichenfolge 1 plus das Auftreten von ain bplus einen rekursiven Aufruf mit b ist.

nimi
quelle
5

J , Punktzahl 16

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

Probieren Sie es online!

Erläuterung

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.

Verwenden Sie 1#.statt +/@für die Summe, die einige Punkte gespeichert hat, und &können Sie statt @in einem monadischen Kontext verwenden, um einen weiteren Punkt zu speichern. Die Wiederholung 1kostet mich einen zusätzlichen Punkt, aber ich habe es nicht geschafft, es loszuwerden.

Zgarb
quelle
"später" wartet einen viertel Tag
CalculatorFeline
2
@CalculatorFeline 10 Stunden später ist noch später. : P
Zgarb
Machen wir es jetzt zu einem Festtag.
CalculatorFeline
Ich persönlich verwende dieses Format für TIO-Antworten, um eine genaue Anzahl von Bytes im Codeabschnitt wiederzugeben. Vielleicht möchten Sie es verwenden
Conor O'Brien,
5

R , Punktzahl: 67 83 95 128

-61 dank Top-Tipps von Giuseppe

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

Probieren Sie es online!

Die Zeichenfolge wird mit geteilt utf8ToInt und jeder ASCII-Wert wird gezählt table. Das Ergebnis wird berechnet, indem eine Matrixmultiplikation %*%über den Wert von + 1 durchgeführt und schließlich halbiert wird.

MickyT
quelle
Verwenden Sie tableanstelle von rle; Sie können das auch loswerden sort(und Sie müssen nicht [[1]]in das Ergebnis von indizieren strsplit)
Giuseppe
@ Giuseppe Vielen Dank. Ich habe nicht einmal an Tisch gedacht, werde mich bald einarbeiten.
MickyT
2
Ich denke, Sie können ein paar weitere Bytes sparen, indem Sie einen anderen Variablennamen anstelle von n(da er functionzweimal vorhanden ist) verwenden und auch (n+1)zu{n+1}
Giuseppe
Ergebnis: 67 . Eine Variation hiervon könnte es ermöglichen, die Punktzahl weiter zu reduzieren.
Giuseppe
@ Giuseppe ... ich hätte es nochmal lesen sollen. whoops
MickyT
4

Pyth , Punktzahl 6

1 byte dank isaacg.

+F/V._

Testsuite.

Wie es funktioniert

+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.
Undichte Nonne
quelle
s+0ist das gleiche wie +F.
Isaacg
Gut! Das Beste, was ich tun kann, ist usaShHGrScQ1 8Zfür 16. Können Sie eine Erklärung hinzufügen?
Digital Trauma
1
@DigitalTrauma Ich habe eine Erklärung hinzugefügt.
Undichte Nonne
s/LQist Punktzahl 4, verwendet diese Funktion Funktionen, die die Herausforderung datieren?
Dave
4

J , Punktzahl: 14 12 11

$+/@,2!1#.=

Probieren Sie es online!

FrownyFrog
quelle
Clevere Verwendung von $.
Cole
Nett. Leichte 11-Byte-Variation:1#.2!1+1#.=
Jonah
@Jonah Die Wiederverwendung von Glyphen führt zu einer Strafe
FrownyFrog
ah, diesen Teil verpasst.
Jonah
4

Jelly , Punktzahl von 7

ċЀQRFS

Erläuterung:

   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)

Probieren Sie es online!

Ellie
quelle
2
Willkommen bei PPCG!
Laikoni
4

C, 60 Bytes, Ergebnis 108 95

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

Probieren Sie es online!

Normalerweise sind Pre- und Post-Increment-Operatoren großartig für Code-Golf, aber sie tun dieser Herausforderung wirklich weh!

BEARBEITEN: Indem ich negative Zählungen abzog, anstatt positive zu addieren, sparte ich eine ganze Menge Punkte. Durch Ersetzen for()mit wird auch while()ein Semikolon entfernt.

ErikF
quelle
3

C # (.NET Core) , Score score (ich meine, 209)

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

Probieren Sie es online!

Die Partitur beinhaltet Folgendes:

using System.Linq;
Charlie
quelle
Ich weiß, es ist schon eine Weile her, aber Sie können return w*(w+1)/2zu return-~w*w/2(Punktzahl 196) wechseln . BEARBEITEN: Sie können einen Port für meine Java 8-Antwort für eine Punktzahl von 149 erstellen : using System.Linq;b=>{int[]x=new int[256];return\nb.Select(z=>++x[z]).Sum();} Probieren Sie es online aus.
Kevin Cruijssen
1
@ KevinCruijssen: Ich habe Ihre Lösung auf 111 Punkte gebracht:b=>{var x=new int[256];return\nb.Sum(z=>++x[z]);}
raznagul
@raznagul ( * Antwort von einem halben Jahr * ) 109, wenn Sie das zweite Leerzeichen in einen Tabulator ändern. ;) Online ausprobieren.
Kevin Cruijssen
1
@ KevinCruijssen (eine weitere Antwort von einem halben Jahr) 49 mit dem interaktiven Compiler, und ich denke, er wird niemals unter 48 fallen. Ich finde es merkwürdig, wie lesbar sie immer werden, je besser die C # -Antworten sind. Probieren Sie es online!
Jemand
3

Gelee , Punktzahl 5

ĠJ€ẎS

Probieren Sie es online!

Danke an Leaky Nun für -2 (vorher auf seine Antwort )

Erik der Outgolfer
quelle
Ahhh, ich habe diese Frage nicht schnell genug bemerkt.
Undichte Nonne
@LeakyNun ps du bist nicht immer ein Ninja, noch jemand ist
Erik der Outgolfer
"Ja wirklich?" Ich glaube nicht.
CalculatorFeline
Ergebnis 5:ĠJ€ẎS
Undichte Nonne
@LeakyNun Wie versprochen ... ja, der Kredit ist da :)
Erik the Outgolfer
3

PowerShell, Punktzahl 64

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

(Die Bewertung basiert auf einem Zeilenvorschub, der nicht dem Windows-Standard entspricht, aber in PS funktioniert.)

PS C:\> D:\unique-is-cheap.ps1 (gc D:\unique-is-cheap.ps1 -raw)
64
  • Hashtable-Zähler @{}
  • Durch die Buchstaben iterieren; $argsist ein Array von Parametern - in diesem Fall wird es durch die Eingabezeichenfolge zu einem einzelnen Elementarray. |%Führt eine foreach-Schleife über die Elemente aus und verwendet die getE*Verknüpfung, um die GetEnumerator()Zeichenfolgemethode abzugleichen. Ruft sie auf, um die Zeichenfolge in einen Zeichenstrom umzuwandeln.
  • |%Durchlaufen Sie die Zeichen und erhöhen Sie ihren Hashtabelleneintrag. Fügen Sie ihn zu einer laufenden Summe hinzu. Das ($x+=1)Formular mit Parens ändert sowohl die Variable als auch gibt den neuen Wert zur Verwendung aus.
  • Laufende Summe ausgeben.

(Als ich es zum ersten Mal schrieb, hatte ich $c=@{};$t=0;[char[]]"$args"|%{$c[$_]++;$t+=$c[$_]};$teine Punktzahl von 128 und hatte das Gefühl, dass es nicht viel niedriger ausfallen würde. Es ist sehr erfreulich, es auf 64 zu halbieren.)

TessellatingHeckler
quelle
1
61 Punkte / 38 Bytes durch das Durcheinander mit dem Inkrement
Veskah
3

Julia 0,6 , 45 Bytes, Score: 77

Inspiriert von der MATL-Lösung:

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

Probieren Sie es online!

Eine weniger hübsche Lösung mit Zählungen:

Julia 0,6 , Score: 82

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

Probieren Sie es online!

Vielen Dank an Guiseppe für den Hinweis auf die Wertung und für Tipps. Diese Kommentare haben mir sehr geholfen.

niczky12
quelle
1
Das Ergebnis Ihrer Übermittlung sind die Kosten für Ihren Code , der meiner Meinung nach 135 beträgt.
Giuseppe
1
Ich kenne Julia nicht sehr gut, aber ich denke, Sie können die Punktzahl auf 110 reduzieren, indem Sie einige Variablennamen wechseln und ein paar Klammern entfernen. Wenn Rückkehr Vektor , der ein Einzelelement erlaubt ist, dann können Sie ersetzen (x+1)mit , [x+1]um die Punktzahl zu reduzieren.
Giuseppe
Sie können eine Punktzahl speichern, indem Sie das zweite Leerzeichen in einen Tabulator oder eine neue Zeile ändern: Punktzahl 104 . Und @ Giuseppe Tipp der Verwendung von [x+1]anstelle (x+1)senkt es auf eine Punktzahl von 98 .
Kevin Cruijssen
3

Java 10, Partitur: 149 138 137 134 133 130 103 102 101 100

( Bytes: 72 73 74 75 64 62 61 ) Bytes steigen, aber die Punktzahl sinkt. : D

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

-28 Punkte (und -11 Bytes) dank @Nevay .
-1 Punktzahl (und -2 Bytes) dank @ OlivierGrégoire .
-1 Punktzahl (und -1 Byte) durch Konvertieren von Java 8 in Java 10.

Erläuterung:

Probieren Sie es hier aus.

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
Kevin Cruijssen
quelle
1
Sie können das entfernen, ~wenn Sie j=0und return-j;(133) verwenden.
Nevay
1
103:x->{int[]q=new int[256];return\nx.chars().map(v->++q[v]).sum();}
Nevay
1
@Nevay 103 tatsächlich, wenn ich janstelle von u( returnenthält u) und eine neue Zeilen und Register anstelle der Räume. EDIT: Hehe, Sie haben richtig bearbeitet, als ich diesen Kommentar gemacht habe. :)
Kevin Cruijssen
3

F #, 120 118 Punkte

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

-2 Danke an Kevin Cruijssen !

Probieren Sie es online!

Nimmt ein stringals Eingabe. Seq.countByPaart jedes einzelne Zeichen mit seiner Anzahl ( idist die Identitätsfunktion), sodass Sie eine Sammlung wie 'a' = 4, 'b' = 2usw. erhalten.

Der Seq.sumByZähler zählt für jeden Buchstaben und summiert alle Zahlen von 0bis zum Zähler für diesen Buchstaben. Also wenn 'a' = 4die sammlung 0, 1, 2, 3, 4welche summiert wäre ist 10. Dann Seq.sumByfasst alle diese Summen.

Ciaran_McCarthy
quelle
2
Sie können Ihre Gäste von 2 durch Änderung senken let qzu let j, da die qbereits in den beiden verwendet wird Seq.
Kevin Cruijssen
2

APL (Dyalog) , Punktzahl 15

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

Probieren Sie es online!

 Texteingabe erhalten

∘.=⍨ Gleichheitstabelle mit sich selbst

+\ kumulative Summe über

1 1⍉ Diagonale (buchstäblich beide Dimensionen in Dimension eins reduzieren)

+/ Summe

Adam
quelle
2

Retina , Ergebnis 68 45 43

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

Probieren Sie es online! Link zeigt Punktzahl. Bearbeiten: Dank an @MartinEnder, der 20 Bytes durch Verwendung überlappender Übereinstimmungen anstelle von Lookaheads und weitere drei Bytes durch Gruppieren der Stufen gespart hat, sodass das sFlag nur einmal angewendet werden muss. Durch eine andere Berechnung der Dreieckszahl wurden zwei weitere Bytes gespart, sodass keine Sortierung erforderlich war.

Neil
quelle
2

Perl 5 Score 91 83

Verwendet das -pFlag, das 2 addiert, weil p geteilt wird.

$x=$_;$b+=++$a{$_}for(split//,$x);$_=$b
user1937198
quelle
Willkommen bei PPCG!
Laikoni
1
Ich habe Ihre Antwort als Grundlage verwendet und einige Techniken von der Seite mit den Tipps angewendet. Ich habe es geschafft, Ihre Punktzahl auf 31 zu senken : Probieren Sie es online aus! . $` is automatically print ed after each call so we can use that to store the score and /./g` gibt eine Liste aller Zeichen in zurück $_, die billiger ist als split//.
Dom Hastings
Ich weiß, dass dies eine alte Herausforderung ist, aber Sie können die Punktzahl noch weiter reduzieren: Probieren Sie es online aus!
Xcali
2

Oktave , 39 Bytes, Score 69

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

Probieren Sie es online!

Auch wenn es eine andere Antwort von Octave gibt, ist diese ganz meine eigene und eine andere Herangehensweise, und sie erzielt weniger Punkte :).

Der Ansatz läuft darauf hinaus, zuerst die Zählung (b) jedes einzelnen Zeichens zu ermitteln, was unter Verwendung der Histogrammfunktion erreicht wird. Dann berechnen wir für jedes Element die Summe von 1 bis b, die mit der Formel durchgeführt wird(b*(b+1))/2 . Dann werden die einzelnen Summen zum Endergebnis addiert.

Beim Testen scheinen Klammern in der Wertung sehr kostspielig zu sein, da viele benötigt werden. Ich habe von einer anfänglichen Punktzahl von etwa 88 durch Umordnen der Fragen eine Optimierung vorgenommen, um die Anzahl der Klammern zum Öffnen / Schließen zu minimieren. Daher nehmen wir jetzt die / 2 für die Endsumme vor und nicht für einzelne Fragen. Außerdem habe ich die Formel in geändert (b^2+b)/2Das erfordert weniger Klammern.

Tom Carpenter
quelle
1
Leider scheint dies auf der leeren Zeichenfolge nicht zu error: hist: subscript indices must be either positive integers less than 2^31 or logicals
funktionieren
2

Common Lisp, Punktzahl 286 232 222

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

Hochwertige Punktzahl aufgrund der wortreichen Syntax der eingebauten Operatoren von Common Lisp.

Probieren Sie es online!

Der ungolfed Code:

(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
Renzo
quelle
2

Mathematica, Punktzahl 54

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

Eingang

["abcdefg"]

danke an hftf

J42161217
quelle
Total[#(#+1)/2&@Counts@Characters@#]&Ergebnisse 54.
hftf