Zähler Zähler

18

In der Typografie ist ein Zähler der Bereich eines Buchstabens, der ganz oder teilweise von einer Buchstabenform oder einem Symbol umschlossen ist. Ein geschlossener Zähler ist ein Zähler, der vollständig von einem Buchstaben oder Symbol umschlossen ist. Sie müssen ein Programm schreiben, das eine Zeichenfolge als Eingabe verwendet und die Gesamtzahl der geschlossenen Zähler im Text ausgibt.

Deine Eingabe:

  • Kann eine Befehlszeileneingabe sein oder von STDIN, aber Sie müssen angeben, welche.

  • Besteht vollständig aus druckbaren ASCII-Zeichen, dh allen ASCII-Werten zwischen 32 und 126 einschließlich. Dies schließt Leerzeichen ein. Mehr Informationen.

Dies variiert nun geringfügig zwischen den Schriftarten. Die Schriftart, in der Sie dies lesen, hat beispielsweise "g" einen geschlossenen Zähler, während die Google-Schriftart "g" mit zwei geschlossenen Zählern hat. Damit dies kein Problem ist, finden Sie hier die offizielle Anzahl der geschlossenen Marken pro Charakter.

Alle Symbole ohne geschlossene Zähler:

 !"'()*+,-./12357:;<=>?CEFGHIJKLMNSTUVWXYZ[\]^_`cfhijklmnrstuvwxyz{|}~

Beachten Sie, dass dies Platz einschließt.

Hier sind alle Symbole mit einem geschlossenen Zähler:

#0469@ADOPQRabdegopq

Und hier sind alle Symbole mit 2 geschlossenen Zählern:

$%&8B

Und zu guter Letzt hier einige Beispiele für Ein- und Ausgänge.

Programming Puzzles and Code-Golf sollte drucken 13

4 8 15 16 23 42 sollte drucken 5

All your base are belong to us sollte drucken 12

Standard loopholes apply sollte drucken 12

Shortest answer in bytes is the winner! sollte drucken 8

DJMcMayhem
quelle
1
Zwei Antworten haben Funktionen anstelle von vollständigen Programmen übermittelt. Obwohl dies standardmäßig erlaubt ist, schlägt Ihr Wortlaut etwas anderes vor. Könnten Sie das klären?
Dennis
Würde es Ihnen etwas ausmachen, anzugeben, in welche Richtung Sie die Zähler gezählt haben?
Martin Ender
3
Keine der Schriftarten, in denen ich die Frage ansehe, entspricht der von Ihnen angegebenen Anzahl. Im Browser wird die Null durch einen Schrägstrich dargestellt, der zwei Zähler ergibt. Die Schriftart in der Android-App funktioniert nicht, aber hier ghat die zwei geschlossene Zähler. Haben Sie die Zähler anhand einer bestimmten Schriftart ermittelt?
Martin Ender
1
@DJMcMayhem 'g' hat 1; obwohl, wo im Code aufgeführt, ghat 2. Etwas verwirrend zu lesen, aber ich denke nicht, dass es von Ort zu Ort unterschiedlich ist.
OJFord
1
Enthält 0bestimmte Schriftarten, insbesondere viele Monospace-Schriftarten, keine zwei geschlossenen Zähler?
vsz

Antworten:

10

Pyth, 31 Bytes

sm@tjC"cúÁ-ÈN%³rØ|­"3Cdz

Demonstration.

Beachten Sie, dass der Code aufgrund der Verwendung von Nicht-ASCII-Zeichen möglicherweise nicht richtig angezeigt wird. Der richtige Code ist am Link.

Ich erstellte eine Nachschlagetabelle der gewünschten Ausgabe für jedes Eingabezeichen, drehte sie um 32, um die modulare Indizierung von Pyth zu nutzen, klebte am Anfang eine 1 und interpretierte sie als Zahl zur Basis 3, wobei ich die Zahl erhielt 2229617581140564569750295263480330834137283757. Ich habe diese Zahl dann in die Basis 256 konvertiert und in eine Zeichenfolge umgewandelt, die in der Antwort verwendet wird.

isaacg
quelle
29

Python 3, 63

print(sum(map(input().count,"#0469@ADOPQRabdegopq$%&8B$%&8B")))

Ein unkomplizierter Ansatz. Durchläuft jedes Zeichen mit einem geschlossenen Zähler, summiert die Anzahl der Vorkommen und macht dies zweimal für Zeichen mit zwei geschlossenen Zählern. Es wäre genauso lang, stattdessen zu schreiben

"#0469@ADOPQRabdegopq"+"$%&8B"*2

Python 3 ist erforderlich, um dies zu vermeiden raw_input.

xnor
quelle
12

CJam, 41 39 37 34 Bytes

"$%&8Badopq#0469@Rbeg"_A<eu+qfe=1b

Danke an @ jimmy23013 für das Golfen mit 3 Bytes!

Probieren Sie es online aus.

Wie es funktioniert

"$%&8Badopq#0469@Rbeg"             e# Push that string.
                      _A<          e# Retrieve the first 10 characters.
                         eu+       e# Convert to uppercase and append.
                                   e# This pushes "$%&8Badopq#0469@Rbeg$%&8BADOPQ".
                            q      e# Read from STDIN.
                             fe=   e# Count the occurrences of each character. 
                                1b e# Base 1 conversion (sum).
Dennis
quelle
2
"$%&8Badopq#0469@Rbeg"_A<eu+.
Jimmy23013
@ jimmy23013: Ich hatte ein paar Variationen von euund ausprobiert el, aber das habe ich nie gefunden. Vielen Dank!
Dennis
8

sed, 51

Mit Golfhilfe von @manatwork und @TobySpeight:

s/[$%&8B]/oo/g
s/[^#0469@ADOPQRabdegopq]//g
s/./1/g

Eingabe von STDIN. In Anbetracht dieser Meta-Frage ist die Ausgabe unär:

$ echo 'Programming Puzzles and Code-Golf
4 8 15 16 23 42
All your base are belong to us
Standard loopholes apply
Shortest answer in bytes is the winner!' | sed -f countercounter.sed
1111111111111
11111
111111111111
111111111111
11111111
$ 
Digitales Trauma
quelle
7

Perl, 41

$_=y/#0469@ADOPQRabdegopq//+y/$%&8B//*2

41Zeichen +1 für die -pFlagge.

Dies verwendet y ///, um die Zeichen zu zählen.

echo 'Programming Puzzles and Code-Golf' | perl -pe'$_=y/#0469@ADOPQRabdegopq//+y/$%&8B//*2'
hmatt1
quelle
6

GNU APL, 39 Bytes

+/⌈20÷⍨26-'$%&8B#0469@ADOPQRabdegopq'⍳⍞

Versuchen Sie es online in GNU APL.js .

Wie es funktioniert

                                      ⍞ Read input.
          '$%&8B#0469@ADOPQRabdegopq'⍳  Compute the indexes of the input characters
                                        in this string. Indexes are 1-based.
                                        26 == 'not found'
       26-                              Subtract each index from 26.
   20÷⍨                                 Divide those differences by 20.
  ⌈                                     Round up to the nearest integer.
+/                                      Add the results.
Dennis
quelle
6

JavaScript, 86

I / O über Popup. Führen Sie den Code - Schnipsel in jedem d aktuelleren Browser zu testen.

for(c of prompt(t=0))c='$%&8B#0469@ADOPQRabdegopq'.indexOf(c),~c?t+=1+(c<5):0;alert(t)

edc65
quelle
6

K, 54 43 42 37 Bytes

+//(30#"$%&8B#0469@ADOPQRabdegopq"=)'

Schneiden Sie 5 Bytes dank @JohnE!

Ältere Version:

f:+/(#&"#0469@ADOPQRabdegopq$%&8B$%&8B"=)'

Original:

f:+/{2-(5="$%&8B"?x;20="#0469@ADOPQRabdegopq"?x;0)?0}'
kirbyfan64sos
quelle
Das #&Innere der Parens könnte genauso gut sein +/, was bedeutet, dass Sie weiter gehen könnten +//"#0469@ADOPQRabdegopq$%&8B$%&8B"=\:. Schließlich ist es nicht erforderlich, die zu haben, f:da die Funktion in stillschweigender Form verwendet werden kann. Das würde dich auf 38 bringen!
JohnE
Leider haben die verwendeten Trick einige andere Lösungen , um die Lookup - Tabelle zu verdichten kommt tot sogar mit der aktuellen 38 - Byte - Lösung: +//(30#"$%&8B#0469@ADOPQRabdegopq")=\:. Dies kann das Beste sein, was wir tun können.
JohnE
haha, kaum habe ich das +//(30#"$%&8B#0469@ADOPQRabdegopq"=)'
gepostet
5

C 127 Bytes

n;f(char*i){char*o="#0469@ADOPQRabdegopq",*t="$%&8B";for(;*i;i++)if(strchr(o,*i))n++;else if(strchr(t,*i))n+=2;printf("%d",n);}

Ziemlich einfach. Ungolfed-Version:

int num = 0;
void f(char* input)
{
    char *one="#0469@ADOPQRabdegopq";
    char *two="$%&8B";

    for(;*input;input++)
        if(strchr(one, *input))     //If current character is found in first array
            num ++;
        else if(strchr(two, *input))//If cuurent character is found in second array
            num += 2;

    printf("%d", num);
}

Teste es hier

Wenn Funktionsargumente nicht zulässig sind, stdinnimmt die Version bis zu 141 Byte in Anspruch:

n;f(){char*o="#0469@ADOPQRabdegopq",*t="$%&8B",i[99],*p;gets(i);for(p=i;*p;p++)if(strchr(o,*p))n++;else if(strchr(t,*p))n+=2;printf("%d",n);}

Beachten Sie, dass in der obigen Version davon ausgegangen wird, dass die Eingabe höchstens 98 Zeichen umfasst.

Teste es hier

Befehlszeilenargumente Version (143 Bytes):

n;main(c,v)char**v;{char*o="#0469@ADOPQRabdegopq",*t="$%&8B",*p=v[1];for(;*p;p++)if(strchr(o,*p))n++;else if(strchr(t,*p))n+=2;printf("%d",n);}

Teste es hier

Spikatrix
quelle
1
@DJMcMayhem C ist wirklich nicht so schlimm. Versuchen Sie Golf in Fortran 77.;)
Alex A.
5

Python 2, 96 90 75 67 + 2 = 69 Bytes

Ich kann mir keinen anderen Weg vorstellen, dies zu tun ... hätte ich gedacht, bis ich die Lösung von xnor gesehen habe. Ich werde sowieso posten, was ich hatte.

Vielen Dank an FryAmTheEggman für die Einsparung von 6 Bytes

Okay, jetzt bin ich damit zufrieden.

Danke an xnor für den Suchtrick, der 4 Bytes spart.

Zwei Bytes hinzugefügt, da die Eingabe in Anführungszeichen gesetzt werden muss.

print sum('#0469@ADOPQRabdegopq$%&8B'.find(x)/20+1for x in input())
Kade
quelle
1
Ich mag die kluge Verwendung von Indizes! Python 3 ist auch etwas kürzer, weil es Eingabe anstelle von raw_input verwendet.
DJMcMayhem
Oh, ich verstehe. Sorry, ich habe es mit @ DJMcMayhem's Python 3 Kommentar kombiniert.
Manatwork
4

Java, 162

class C{public static void main(String[]a){System.out.print(-a[0].length()+a[0].replaceAll("[#0469@ADOPQRabdegopq]","..").replaceAll("[$%&8B]","...").length());}}

Na wenn doch hat ein volles Programm sein ... Es ist nur ein Einzeiler , dass Streichhölzer Zeichen und ersetzt sie mit einer längeren Zeichenfolge. Gibt dann den Längenunterschied zum Original zurück. Leider hat Java nicht wirklich etwas, um nur die Anzahl der Treffer zu zählen.

Hier ist es mit Zeilenumbrüchen:

class C{
    public static void main(String[]a){
        System.out.print(
                -a[0].length() +
                a[0].replaceAll("[#0469@ADOPQRabdegopq]","..")
                .replaceAll("[$%&8B]","...")
                .length()
                        );
    }
}
Geobits
quelle
4

Pyth - 35 Bytes

Verwendet die offensichtliche Methode von in first + * 2 in second. Vielen Dank @FryTheEggman.

s/Lz+"#0469@ADOPQRabdegopq"*2"$%&8B

Probieren Sie es hier online .

Maltysen
quelle
4

Javascript, 114 95 Bytes

alert(prompt().replace(/[#046@ADOPQRabdegopq]/g,9).replace(/[$%&8B]/g,99).match‌​(/9/g).length)

Vielen Dank an Ismael Miguel, der mir dabei geholfen hat, Golf zu spielen.

SuperJedi224
quelle
2
93 Bytes:alert(prompt().replace(/[#046@ADOPQRabdegopq]/g,9).replace(/[$%&8B]/g,99).match(/9/g).length)
Ismael Miguel
Tut mir leid, dass ich schlecht gezählt habe. Ja, es ist 95.
Ismael Miguel
3

Ruby, 59 Bytes

a=gets;p a.count('#0469@ADOPQRabdegopq')+2*a.count('$%&8B')

Eingabe von der Kommandozeile oder stdin. Am kürzesten bisher mit einer nicht esoterischen Sprache.

Update: chilemagic hat mich geschlagen

David Bailey
quelle
3

Retina , 44 Bytes

1

[#0469@ADOPQRabdegopq]
1
[$%&8B]
11
[^1]
<empty line>

Gibt eine unäre Ausgabe aus.

Jede Zeile sollte in eine eigene Datei gehen oder Sie können das -sFlag verwenden. Z.B:

> echo "pp&cg"|retina -s counter
11111

Die Linienpaare (Muster - Ersatzpaare) führen die folgenden Substitutionsschritte aus:

  • Entfernen Sie 1's
  • Ersetzen Sie 1-Zähler-Buchstaben durch 1
  • Ersetzen Sie 2-Zähler-Buchstaben durch 11
  • Entfernen Sie alles , aber die 1‚s
randomra
quelle
3

J, 43

Als eine Funktion:

   f=:[:+/[:,30$'$%&8B#0469@ADOPQRabdegopq'=/]
   f 'text goes here'
6

46 Bytes (Befehlszeile)

Als eigenständiges Befehlszeilenprogramm:

echo+/,30$'$%&8B#0469@ADOPQRabdegopq'=/>{:ARGV

Speichern Sie die obige Zeile als counter2.ijsund rufen Sie über die Befehlszeile auf:

$ jconsole counter2.ijs 'Programming Puzzles and Code Golf'
13
hoosierEE
quelle
Das Einfügen der Eingabe in den Code ist nicht zulässig, aber eine Funktion, die die Eingabe als Argument verwenden kann, ist in Ordnung. Eg f=:your_function_code.
Randomra
2

Julia, 77 74 Bytes

t=readline();length(join(t∩"#0469@ADOPQRabdegopq")*join(t∩"\$%&8B")^2)

Dadurch wird Text aus STDIN gelesen und das Ergebnis an STDOUT ausgegeben.

Ungolfed + Erklärung:

# Read text from STDIN
t = readline()

# Print (implied) to STDOUT the length of the intersection of t with the
# 1-closed counter list joined with the duplicated intersection of t with
# the 2-closed counter list
length(join(t ∩ "#0469@ADOPQRabdegopq") * join(t ∩ "\$%&8B")^2)

Beispiel:

julia> t=readline();length(join(t∩"#0469@ADOPQRabdegopq")*join(t∩"\$%&8B")^2)
Programming Puzzles and Code Golf
13
Alex A.
quelle
2

RS , 56 Bytes

_/
[#0469@ADOPQRabdegopq]/_
[$%&8B]/__
[^_]/
(_+)/(^^\1)

Live-Demo.

kirbyfan64sos
quelle
Nur zu Ihrer Information: Ich habe eine Stub-Esolangs-Seite für rs erstellt. Möglicherweise möchten Sie Folgendes
mbomb007
@ mbomb007 WOW !! Das hat mir gerade den Tag gemacht. : D
kirbyfan64sos
Nun, "rs" kommt in Google oder so nicht vor, da es nur zwei Buchstaben sind. Auf diese Weise können die Leute es finden. :)
mbomb007
2

GNU APL, 37 Zeichen

+/,⍞∘.=30⍴'$%&8B#0469@ADOPQRabdegopq'

konstruiere einen Zeichenvektor, der 2-Zähler-Zeichen zweimal enthält (30⍴)

vergleiche jedes Eingabezeichen mit jedem Zeichen im Vektor (∘. =)

fasse verwüstete Übereinstimmungen zusammen (+ /,)

Jürgen Sauermann
quelle
1

Javascript 159 , 130 Bytes

function c(b){return b.split("").map(function(a){return-1!="$%&8B".indexOf(a)?2:-1!="#0469@ADOPQRabdegopq".indexOf(a)?1:0}).reduce(function(a,b){return a+b})};

nicht abgeschlossen:

function c(b) {
    return b.split("").map(function(a) {
        return -1 != "$%&8B".indexOf(a) ? 2 : -1 != "#0469@ADOPQRabdegopq".indexOf(a) ? 1 : 0
    }).reduce(function(a, b) {
        return a + b
    })
};

Mit Hilfe von @ edc65:

function c(b){return b.split('').reduce(function(t,a){return t+(~"$%&8B".indexOf(a)?2:~"#0469@ADOPQRabdegopq".indexOf(a)?1:0)},0)}
Thomas Junk
quelle
2
Da ~ -1 == 0kann man ~x?statt schreiben -1 != x?. Ich möchte ein Anwendungsbeispiel beantworten.
edc65
2
function c(b){return b.split('').reduce(function(t,a){return t+(~"$%&8B".indexOf(a)?2:~"#0469@ADOPQRabdegopq".indexOf(a)?1:0)},0)}Keine Notwendigkeit zu haben, mapdannreduce
edc65
1

Haskell, 117

a="#0469@ADOPQRabdegopq"
b="$%&8B"
c n[]=n
c n(x:s)
 |e a=f 1
 |e b=f 2
 |True=f 0
 where
 e y=x`elem`y
 f y=c(n+y)s

c ist eine Funktion, c :: Int -> String -> Intdie einen Zähler und eine Zeichenfolge verwendet und die Zeichenfolge Buchstabe für Buchstabe durchläuft. Dabei wird geprüft, ob der aktuelle Buchstabe Mitglied des 1-Punkt-Arrays oder des 2-Punkt-Arrays ist, und der Rest der Zeichenfolge wird nach dem Inkrementieren aufgerufen der Zähler den entsprechenden Betrag.

Anruf mit Zähler = 0 in ghci:

ghci> c 0 "All your base are belong to us"
12
Craig Roy
quelle
1

C #, 157

void Main(string s){int v=0;v=s.ToCharArray().Count(c=>{return "#0469@ADOPQRabdegopq".Contains(c)||"$%&8B".Contains(c)?++v is int:false;});Console.Write(v);}

Ungolfed:

void Main(string s)
{
    int v = 0;

    v = s.ToCharArray()
    .Count(c => 
    {
        return "#0469@ADOPQRabdegopq".Contains(c) || "$%&8B".Contains(c) ? ++v is int:false;
    });

    Console.Write(v);
}

Konvertieren Sie den String in ein char-Array und prüfen Sie, ob sich jedes Zeichen in einem der Zähler befindet. Wenn es in der zweiten ist, muss ich es nur den Zähler erneut inkrementieren.

Kühlere Ranch
quelle
1

Erlang, 103 Bytes

Dies ist ein vollständiges Programm, das mit Escript ausgeführt wird. Die erste Zeile der Datei muss leer sein (1 Byte hinzufügen).

main([L])->io:write(c(L,"#0469@ADOPQRabdegopq")+2*c(L,"$%&8B")).
c(L,S)->length([X||X<-L,S--[X]/=S]).

Probelauf:

$ escript closed.erl 'Shortest answer in bytes is the winner!'
8$
Edwin Fine
quelle
Willkommen bei PPCG, c (L, "# 0469 @ ADOPQRabdegopq") + 2 * c (L, "$% & 8B") ist um 5 länger als c (L, "# 0469 @ ADOPQRabdegopq $% & 8B $% & 8B") Bytes :).
Katenkyo
@ Katyenko, danke für den Vorschlag. Leider funktioniert es bei bestimmten Eingaben nicht richtig. "$% & 8B" zählt für 5, sollte aber 10 sein. Die c / 2-Funktion filtert die Zeichen des Strings heraus, die nicht zu einer Gruppe von Zeichen gehören, z. B. "$% & 8B". Es prüft, ob ein Satz enthalten ist, indem es das zu testende Zeichen aus dem Satz löscht und dann das Ergebnis mit dem ursprünglichen Satz vergleicht. Wenn sie nicht gleich sind, befand sich der Buchstabe im Satz, und er ist enthalten. Mehrere Kopien von Zeichen im Satz haben keine Wirkung.
Edwin Fine
Ho, ich verstehe, ich weiß nicht, erlangte den Eindruck, Sie hätten eine Zeichenfolge zum Zählen des Zählers verwendet: 3. Wie auch immer, egal und gut gemacht :)
Katenkyo
0

C 99 Bytes

n;f(char*i){for(char*o="#0469@ADOPQRabdegopq$%&8B",*t=o+20;*i;)n+=2-!strchr(o,*i)-!strchr(t,*i++);}

Erläuterung

Ich spielte die Antwort von Cool Guy weiter aus . Es wurde zu lange, um einen Kommentar abzugeben. Anstelle von if/ habe elseich !einen Zeiger in bool konvertiert. Ich habe auch oinclude gemacht, tdamit ich "is in o" und "is in " hinzufügen kannt " für die Gesamtzahl der Zähler .

Erweiterter Code

#include <string.h>
int num = 0;

void f(char* input)
{
    char *one = "#0469@ADOPQRabdegopq"  "$%&8B";
    char *two = strchr(one, '$');

    while (*input) {
        num += 2 - !strchr(one, *input) - !strchr(two, *input));
        ++input;
    }
}

Ausgang ist in num , die vor jedem Anruf gelöscht werden muss.

Testprogramm und Ergebnisse

#include <stdio.h>
int main() {
    const char* a[] = {
        "Programming Puzzles and Code-Golf",
        "4 8 15 16 23 42",
        "All your base are belong to us",
        "Standard loopholes apply",
        "Shortest answer in bytes is the winner!",
        NULL
    };
    for (const char** p = a;  *p;  ++p) {
        n=0;f(*p);
        printf("%3d: %s\n", n, *p);
    }
    return 0;
}
 13: Programming Puzzles and Code-Golf
  5: 4 8 15 16 23 42
 12: All your base are belong to us
 12: Standard loopholes apply
  8: Shortest answer in bytes is the winner!
 37: n;f(char*i){for(char*o="#0469@ADOPQRabdegopq$%&8B",*t=o+20;*i;)n+=2-!strchr(o,*i)-!strchr(t,*i++);}

Der Code selbst enthält 37 Zähler nach eigener Metrik.

Toby Speight
quelle