Zähle die Zeichen - Stück für Stück!

19

Der einfache Teil: Bei einer Eingabezeichenfolge, die nur druckbare ASCII-Zeichen enthält (Leerzeichen - Tilde), zählen Sie die Anzahl der Vorkommen jedes Zeichens und geben Sie das Ergebnis in einem beliebigen geeigneten Format zurück. Das Ergebnis für eine Zeichenfolge a%hda7asoll wie etwas sein: a:3, %:1, h:1, 7:1, d:1. Eine Sortierung ist nicht erforderlich, die Begrenzer und Formate sind optional, es muss jedoch leicht verständlich sein, welche Nummer welchem ​​Zeichen entspricht. Sie dürfen keine Zeichen einschließen, die nicht in der Eingabezeichenfolge enthalten sind ( a:3, b:0, c:0, d:1, ...ist nicht OK).

Die wahre Herausforderung:

Konvertieren Sie jedes Zeichen in Ihrem Code in eine 8-Bit-Binärzahl (oder 16-Bit, wenn Sie UTF-16 oder ähnliches verwenden) und führen Sie alle Zeichen auf, die bei beginnen 0.

Für jeden Charakter ( ider Zähler), die i%7Bit - 1 muss sein 1. Die Bits sind von rechts nummeriert. Alle anderen Bits können beliebig sein.

Verwenden wir den folgenden Code als Beispiel:

[f]-xif)#f

Wenn wir dies in eine Binärdatei konvertieren, erhalten wir das folgende Array. Die erste Zahl (repräsentiert [a 1an der 0. Position, so dass man in Ordnung ist. Die zweite Zahl (repräsentiert fa 1an der 1. Position, so dass man auch in Ordnung ist. Fahren Sie so fort, und Sie werden sehen dass der obige Code gültig ist.

C 76543210 Bitnummer
- -------- ----------
[0101101 1   0 - OK
f 011001 1 0 1 - OK
] 01011 1 01 2 - OK
- 0010 1 101 3 - OK
x 011 1 1000 4 - OK
i 01 1 01001 5 - OK
f 0 1 100110 6 - OK
) 0010100 1   0 - OK
# 001000 1 1 1 - OK
f 01100 1 10 2 - OK

Wenn wir den Code in ändern, erhalten ]f[-xif)#fwir den folgenden Start der Sequenz:

C  76543210  Bit number
-  --------  ----------
]  01011101  0   <- OK
f  01100110  1   <- OK
[  01011011  2   <- Not OK
-  00101101  3   <- OK

Wie wir sehen, befindet sich das dritte Zeichen [nicht 1an der zweiten Position (mit einem Index von Null), und dieser Code ist daher nicht gültig.

Testfälle:

Input:
This is a string containing some symbols: ".#!".#&/#

Output:
   !  "  #  &  /  :  T  a  b  c  e  g  h  i  l  m  n  o  r  s  t  y  .
7  1  2  3  1  1  1  1  2  1  1  1  2  1  5  1  2  4  3  1  6  2  1  2

Jedes sinnvolle Ausgabeformat ist in Ordnung (was auch immer für Sie am bequemsten ist). Sie könnten zum Beispiel haben: :7, !:1, ":2, #:3, &:1, /:1, T:1, a:2 ...oder [ ,7][!,1][",2][#,3][&,1].... Die Ausgabe erfolgt auf einem beliebigen Standardweg (Rückkehr von der Funktion, Ausdruck nach STDOUT usw.).

1i Modul 7.


Dies ist , so dass der kürzeste Code in Bytes ref gewinnt .

Stewie Griffin
quelle
6
Um ein wenig zu helfen , hier sind die Zeichen, die Sie an der n%7Stelle verwenden dürfen> pastie.org/pastes/10985263/text
TidB
@TidB die Website ist offline?
Rod
1
@ Rod Ja, Pastie scheint einige Probleme zu haben. Versuchen Sie stattdessen Pastebin
TidB
1
Denken Sie daran, dass newline ist 00001010. Es kann auch nützlich sein! :)
Stewie Griffin
1
Zur weiteren Unterstützung finden Sie hier ein Validierungsskript, das Sie für UTF-8-Codierungen verwenden können. Kapseln Sie die Eingabe einfach wie im Beispiel in eine Zeichenfolge.
AdmBorkBork

Antworten:

6

Pyke, 1 6 Bytes

1cn;1c

Probieren Sie es hier aus!

1c     - chunk(size=1, input)
  n;1  - noop. 
     c - count(^)

Die Hälfte dieses Codes ist nur No-Ops ...

00110001 - 1
01100011 - c
01101110 - n
00111011 - ;
00110001 - 1
01100011 - c
Blau
quelle
@EriktheOutgolfer hat einen gültigen Punkt. Ich denke nicht, dass dieses Eingabeformat gültig ist, es sei denn, dies ist eine reguläre Zeichenfolge in Pyke. Es wäre eine gültige Eingabezeichenfolge in MATLAB / Octave seitdem 'abc'==['a','b','c'], also könnte es auch in Pyke sein ...?
Stewie Griffin
@StewieGriffin So geht Pyke normalerweise nicht mit Strings um. Wenn das nicht in Ordnung ist, kann ich sehen, wie man das Eingabeformat wechselt, aber da sich eine Zeichenliste unter der akzeptierten Liste der Standardeinstellungen befindet, kann dies unter Umständen als Betrug gelten
Blue
5
Es tut mir leid, dass Sie Ihre Herausforderung mit einem integrierten 1-Byte- Speicher gebrochen haben. Ich glaube nicht, dass es Ihnen wirklich leid tut, und die Herausforderung wird dadurch nicht gebrochen :-)
Luis Mendo
2
Dies ist keine Charakterliste. Es ist eine Liste von Zeichenfolgen. Während sich die Zeichenlisten bei + 17 / -0 befinden , befinden sich die Zeichenfolgenlisten bei + 2 / -2 , so dass dies kaum eine akzeptierte Standardeinstellung ist. @StewieGriffin sollte entscheiden, ob es gültig ist oder nicht.
Dennis
1
@StewieGriffin besser?
Blue
6

Pyth, 12 8 7 Bytes

-1 Byte danke an @Loovjo

m+d/Qd{
      { # remove all duplicated elements from the (implicit) input
m       # map each element (d) of the parameter (the set from previous operation)
   /Qd  # count the occurrences of d in Q
 +d     # concatenate with d

binäre Darstellung

0110110 1 m
001010 1 1 +
01100 1 00 d
0010 1 111 /
010 1 0001 Q
01 1 00100 d
0 1 111011 {

Versuch es hier

Stange
quelle
Nett! :) Die Ausgabe 13für 111sieht seltsam aus, kann aber nicht missverstanden werden (es kann kein einzelnes Zeichen geben 13, das 1 Mal verwendet wird), das ist also absolut gültig!
Stewie Griffin
4

Befunge-93, 150 Bytes

={<{p+}3/}*77\%*7{7:\+{}{1g}+3/*77\%*7{7:}=:_{}{}={}{}{v#{}{}`x1:~
}-}=*}{2*}97}:<$}={$_v#}!:-*84g+3/*77\%*7{7:}=:}:}+}1{}<_{@#
}{}{}={}{}{}={^.},\={<

Probieren Sie es online!

Ich begann damit, dies als reguläres Befunge-Programm zu schreiben, das ich so oft wie möglich spielte. Ich habe dann Auffüllungen hinzugefügt, um sicherzustellen, dass die verschiedenen Zeichen im Programm nur an zulässigen Positionen angezeigt werden. Dieses Auffüllen beruhte auf der Tatsache, dass nicht unterstützte Befehle in Befunge-93 ignoriert werden, sodass ich nur eine Folge nicht verwendeter Zeichen benötigte, deren Bits an den erforderlichen Positionen ausgerichtet waren (die von mir verwendete Folge war ={}{}{}).

Das Komplizierte war, dass die verschiedenen Zweige zwischen den Zeilen richtig ausgerichtet werden mussten (z. B. der vPfeil in einer Zeile muss mit dem <Pfeil darunter ausgerichtet werden). Dies wurde durch die Tatsache weiter erschwert, dass der Brückenbefehl ( #) nicht von seinem benachbarten Verzweigungspfeil getrennt werden konnte. Anfangs habe ich versucht, das Padding programmatisch zu generieren, aber am Ende war es meist ein manueller Prozess.

Aufgrund der Größe des Programms werde ich nicht die vollständige Charakteranalyse auflisten, aber dies ist ein Beispiel von Anfang bis Ende:

= 00111101 0
{ 01111011 1
< 00111100 2
{ 01111011 3
p 01110000 4
+ 00101011 5
} 01111101 6
3 00110011 0
/ 00101111 1
...
{ 01111011 1
^ 01011110 2
. 00101110 3
} 01111101 4
, 00101100 5
\ 01011100 6
= 00111101 0
{ 01111011 1
< 00111100 2

Die Zeilenumbrüche werden als Zeilenumbrüche behandelt und befinden sich entweder an Position 1 oder 3.

James Holderness
quelle
3

MATL , 17 Bytes

u"G91x@=zD91x@uRD

Zeigt die Anzahl und dann das entsprechende Zeichen an, alle durch Zeilenumbrüche getrennt. Die größte Schwierigkeit ist das, @was ist 0b01000000; Ich hoffe, ich kann einen Weg finden, ohne es auszukommen.

Probieren Sie es online!

Erläuterung:

u"  % Implicit input. Take (u)nique characters and loop (") over them.
G   % Take the input a(G)ain
91x % Filler: push 91, delete immediately.
@   % Push current character of loop
=   % Check for equality with earlier G
z   % Count number of equal characters
D   % Display
91x % More filler!
@   % Get loop character again
uR  % Filler: two NOPs for the single-character @
D   % Display. Implicitly end loop.

MATL, 15 Bytes (fragliche Ausgabe)

Wenn es erlaubt ist, nur zwei Zeilenvektoren auf dem Stapel zu belassen (funktionsähnliches Verhalten gemäß diesem Meta-Beitrag), können wir zu kommen

u"G91x@=zv]v!Gu

Aber hier ist die Ausgabe nicht ganz so ordentlich geordnet.

Sanchises
quelle
Der Stapel wird implizit am Ende des Programms gedruckt, und das Ausgabeformat ist je
Luis Mendo,
@ LuisMendo Ich bin nicht sicher. Wenn Sie 90 verschiedene Eingabezeichen haben, ist es schwierig zu sagen, welcher Schlüssel zu welchem ​​Zeichen gehört. - Stewie Griffin vor 2 Stunden war die Antwort auf einen vorgeschlagenen Hybrid (zählt einzeln D, Guam Ende des Programms), und ich bin nicht sicher, ob die 15-Byte-Version ausreichend anders ist.
Sanchises
@StewieGriffin Könnten Sie vielleicht sehen, ob die 15-Byte-Version ( Online testen ! ) In Ordnung ist oder nicht?
Sanchises
Wir sind uns nicht sicher, ob Stewie den Ping für diesen Beitrag bekommt. Verwenden Sie besser den Herausforderungsbeitrag
Luis Mendo,
Ich weiß nichts über dich, aber ich glaube nicht, dass es hier leicht zu verstehen ist :) Ich bevorzuge die 17-Byte-Lösung, aber zögere nicht, die 15-Byte-Lösung auch in der Antwort beizubehalten! Übrigens nette Antwort :)
Stewie Griffin
1

CJam, 14 Bytes

q__|_ @sfe=]zp

Probieren Sie es hier aus.

Das Leerzeichen vor @und snach dem Zeichen sind Füllzeichen, die eingefügt werden, damit die ASCII-Codes dem erforderlichen Muster entsprechen: Das Leerzeichen bewirkt nichts und skonvertiert einfach eine Zeichenfolge in eine Zeichenfolge. Davon abgesehen ist dies eine ziemlich einfache und unkomplizierte Implementierung der Herausforderungsaufgabe:

q_ "die Eingabe lesen und eine Kopie davon erstellen";
  _ | msgstr "wiederholte Zeichen in der Kopie reduzieren";
    _ "Kopie der komprimierten Zeichenfolge speichern";
      @ "Ziehen Sie die ursprüngliche Eingabezeichenfolge an den Anfang des Stapels";
       s "(tut hier nichts)";
        fe = "Zähle für jedes Zeichen in der reduzierten Zeichenfolge den ...";
                 msgstr "... wie oft es in der Originalzeichenfolge vorkommt";
           ] z "Paar die Zählungen mit der gespeicherten Kopie der komprimierten Zeichenfolge";
             p "drucke die String-Darstellung des Ergebnisses";

Für die Eingabe foobar123wird dieser Code ausgegeben [['f 1] ['o 2] ['b 1] ['a 1] ['r 1] ['1 2] ['2 2] ['3 1]]. Wenn Sie einfach die Anzahl in einer Zeile und die entsprechenden Zeichen in einer anderen Zeile drucken, wie in:

[1 2 1 1 1 2 2 1]
fobar123

Wenn dies als akzeptables Ausgabeformat betrachtet wird, ]zkann das weggelassen werden, um zwei Bytes für insgesamt 12 Bytes zu sparen . Ja, der verkürzte Code besteht weiterhin die Bitmusteranforderung.

Ps. Ich habe auch einen einfachen Quellcode-Checker für diese Herausforderung geschrieben. Bei einer Codezeile als Eingabe wird zuerst diese Zeile zurückgegeben und dann dieselbe Zeile gedruckt, wobei jedes Zeichen durch das ( n % 7) -te ASCII-Bit ersetzt wird. Wenn die zweite Zeile nur Einsen enthält, ist die Eingabe gültig.

Ilmari Karonen
quelle
1

Jelly , 6 Bytes in Jellys Codepage

ṢZṢṀŒr

Probieren Sie es online!

Dies ist eine Funktion, die eine Liste von (Zeichen-, Zähl-) Paaren zurückgibt. (Jelly stellt solche Listen als Text, zum Beispiel , wenn sie auf der Standardausgabe gesendet sind, indem Sie die Elemente verketten, weshalb Sie dies als eine Funktion zu behandeln haben , anstatt ein komplettes Programm. ( Hier ist das gleiche Programm mit einigem Code angehängt Rufen Sie die Funktion auf und drucken Sie die interne Struktur in die Standardausgabe, um zu beweisen, dass die Ausgabe ein eindeutiges Format hat.)

Binäre Darstellung und Erklärung:

  76543210 

Ṣ 1011011 1    Sortieren Sie die Zeichen der Eingabe
Z 010110 1 0 Transponieren Sie die Liste (es ist 1D, sodass sie effektiv in eine Liste eingeschlossen wird).
Ṣ 10110 1 11 Die Liste sortieren (keine Operation, da sie nur ein Element enthält)
Ṁ 1100 1 000 Nimm das größte (dh einzige) Element
Œ 000 1 0011 Erstes Byte eines Zwei-Byte-Befehls
r 01 1 10010 Lauflängencodierung

Es ist ersichtlich, dass sich das zweite, dritte und vierte Zeichen gegenseitig aufheben und nur dazu dienen, das von uns benötigte Bitmuster beizubehalten. ŒrDas Auffüllen des Programms, damit wir es verwenden können, ist jedoch einfach zu praktisch. Dies gibt uns wahrscheinlich ein kürzeres Programm als der Versuch, das Problem ohne das eingebaute Programm zu lösen.


quelle