Aufgabe
Ihre Aufgabe ist es, eine Zeichenfolge zu erstellen, die durchschnittliche Zeichenfolgen enthält. Das erste Zeichen des Ergebnisses wäre das Durchschnittszeichen des ersten Zeichens (das das erste Zeichen ist) und das Durchschnittszeichen des zweiten Zeichens von zwei ersten Zeichen und so weiter.
Was ist durchschnittlicher Charakter?
Strings sind Arrays von Bytes. Durchschnittlicher Charakter einer Zeichenfolge kann ermittelt werden, indem der Durchschnitt der ASCII-Werte der Zeichen in der Zeichenfolge berechnet und das entsprechende ASCII-Zeichen verwendet wird.
Beispielsweise "Hello!"
kann eine Zeichenfolge als Bytefolge geschrieben werden 72 101 108 108 111 33
. Der Durchschnitt der ASCII-Werte liegt bei 533/6 = 88.833 ... und wenn es auf die nächste Ganzzahl gerundet wird, erhalten wir 89, einen ASCII-Code für einen GroßbuchstabenY
.
Regeln
- Sie können davon ausgehen, dass die Eingabe nur druckbare ASCII-Zeichen enthält
- Die Eingabe kann von stdin oder als Befehlszeilenargument oder als Funktionsargument gelesen werden
- Die Ausgabe muss stdout sein. Wenn Ihr Programm funktioniert, können Sie auch die Zeichenfolge zurückgeben, die Sie andernfalls drucken würden.
- Es muss ein ganzes Programm oder eine ganze Funktion sein, kein Snippet
- Standard-Schlupflöcher gelten
- Ganzzahlen werden durch Funktion
floor(x+0.5)
oder ähnliche Funktion gerundet .
Wie gewinne ich?
Dies ist Code-Golf , also kürzeste Antwort (in Bytes) in Gewinnen.
Beispiele
Hello!
→HW^adY
test
→tmop
42
→43
StackExchange
→Sdccd_ccccddd
Antworten:
Brainfuck 106 Bytes
Dies ist meine erste Teilnahme an einem Code-Golf, bitte seien Sie vorsichtig! Es funktioniert, aber Brainfuck kann keine Floats verarbeiten (was mir nicht bekannt ist), sodass der gerundete Wert immer der niedrigste ist (möglicherweise wird mein Algorithmus später korrigiert).
Außerdem mittelt der Algorithmus die Werte 2 mal 2, was bedeutet, dass er an einigen Stellen ungenau sein kann. Und ich muss einen Fehler beheben, der auch eine Zahl am Ende der Ausgabe ausgibt.
quelle
Pyth, 16 Bytes
Ziemlich einfach. Verwenden
s+.5
statt Runden, weilround(0.5, 0)
in Python aus irgendeinem Grund 0 ist.quelle
0.5
gerundet sein sollte1
.Q,
1512 Bytes12 Bytes als Ausdruck
oder 15 Bytes als Funktion
Nutzt
quelle
"c"$avgs"i"$
? Ich glaube nicht, dass eine Lösung einfacher sein könnte. :)"c"
zu "c" und"i"
"i" wechseln .CJam, 19 Bytes
Versuchen Sie es online in dem CJam Dolmetscher .
quelle
Perl:
3130 Zeichen(29 Zeichen Code + 1 Zeichen Befehlszeilenoption.)
Probelauf:
quelle
C #
189 135 134106 BytesKann hier gesehen werden
Zum ersten Mal Golfspieler
quelle
K, 36 Bytes
Verwendung:
_ci
und_ic
konvertieren ASCII in Zeichen und umgekehrt.{(+/x)%#x}
ist ein klassisches K-Idiom zur Mittelwertbildung. Insgesamt ziemlich unkompliziert.Edit: oh, die Spezifikation falsch verstanden. `0: wird benötigt, um das Ergebnis auf stdout zu drucken. Warten auf Klärung der Eingabe bezüglich. Dennis 'Frage.
quelle
{[s]`0:`c${_.5+(+/u)%#u:x#s}'1+!#s}
.`0:`c$_.5+{(+/x)%#x}'1_|(-1_)\
`c$_.5+{(+\x)%+\~^x}`i$
für 24. Es könnte kürzer sein (`c$`i${(+\x)%+\~^x}`i$
), aber Ihre REPL ( johnearnest.github.io/ok/index.html ) rundet nicht richtig, wenn Sie von float nach int umwandeln . Ich würde zögern, diese ak-Lösung zu nennen, da_ci
und_ic
nirgendwo in der K5-Spezifikation sind, soweit ich das0:
beurteilen kann, während nicht auf stdout gedruckt wird, sondern stattdessen eine txt-Datei von der Festplatte gelesen wird._ci
und_ic
werden in K5 komplett durch die Formulare wie ersetzt`c$
. Die ursprüngliche Lösung, die ich veröffentlicht habe, ist mit Kona kompatibel, das auf K2 / K3 basiert. Ich versuche im Allgemeinen, keine Lösungen mit OK zu veröffentlichen, da sich die Semantik immer noch ändert und teilweise ungenau ist.`0:_ci_0.5+{(+\x)%1.+!#x}_ic
Mathematica, 75 Bytes
quelle
Julia,
8581 BytesDadurch wird eine unbenannte Funktion erstellt, die eine Zeichenfolge akzeptiert und einen Vektor der ASCII-Codepunkte erstellt. Für jede sequenzielle Gruppe werden Mittelwerte genommen, auf ganze Zahlen gerundet, in Zeichen umgewandelt, zu einer Zeichenfolge verbunden und nach STDOUT gedruckt.
quelle
Rubin, 46
ideone .
Als ich mich bei w0lf entschuldigte, fiel meine Antwort so unterschiedlich aus, dass es sich zu lohnen schien, sie zu posten.
$<.bytes
iteriert über jedes Byte in stdin, sodass wir den gleitenden Durchschnitt in jeder Schleife ausgeben. '% c' konvertiert einen Gleitkommawert in ein Zeichen, indem es abgerundet und das ASCII-Zeichen verwendet wird. Alles, was wir tun müssen, ist, 0,5 zu addieren, damit es richtig gerundet wird.$.
ist eine magische Variable, die mit 0 initialisiert beginnt - sie soll die Zeilenzählung speichern, aber da wir hier die Bytezählung wollen, erhöhen wir sie nur manuell.quelle
Mathcad, 60 "Bytes"
Mathcad ist eine mathematische Anwendung, die auf 2D-Arbeitsblättern basiert, die aus "Bereichen" bestehen, von denen jeder Text, ein mathematischer Ausdruck, ein Programm, ein Plot oder eine Skriptkomponente sein kann.
Eine mathematische oder Programmieranweisung wird aus einer Palettensymbolleiste ausgewählt oder über eine Tastenkombination eingegeben. Für Golfzwecke wird eine Operation ("Byte") als die Anzahl der Tastaturoperationen angesehen, die zum Erstellen eines Namens oder Ausdrucks erforderlich sind (um beispielsweise die Variable a auf 3 zu setzen, schreiben wir a: = 3. Der Definitionsoperator : = ist ein einziger Tastendruck ":", ebenso wie a und 3, was insgesamt 3 "Bytes" ergibt. Die Programmierung für ergibt Operator erfordert die Eingabe von ctl-shft- # (oder eines einzelnen Klicks auf die Programmiersymbolleiste), was wiederum gleichbedeutend mit ist 1 Byte.
In Mathcad gibt der Benutzer Programmiersprachenbefehle über Tastaturkürzel ein (oder wählt sie aus der Programmiersymbolleiste aus), anstatt sie in Text zu schreiben. Wenn Sie beispielsweise ctl-] eingeben, wird ein while-Schleifenoperator erstellt, der zwei "Platzhalter" für die Eingabe der Bedingung und eine einzelne Zeile des Körpers enthält. Wenn Sie = am Ende eines Mathcad-Ausdrucks eingeben, wird der Ausdruck von Mathcad ausgewertet.
(Anzahl der Bytes) Wenn Sie dies aus der Perspektive der Benutzereingabe betrachten und eine Mathcad-Eingabeoperation (normalerweise Tastatur, Mausklick auf die Symbolleiste, wenn keine KBD-Verknüpfung vorhanden ist) mit einem Zeichen gleichsetzen und dies als Byte interpretieren. csort = 5 Bytes, da es char-by-char geschrieben wird, ebenso wie andere Variablen- / Funktionsnamen. Der Operator for ist ein spezielles Konstrukt, das 11 Zeichen (einschließlich 3 leerer "Platzhalter" und 3 Leerzeichen) belegt, jedoch mit der Tastenkombination ctl-shft- # eingegeben wird, also = 1 Byte (in einigen Sprachen ähnlich wie Token). Wenn Sie '(Anführungszeichen) eingeben, werden (normalerweise) ausgeglichene Klammern erstellt. Dies entspricht 1 Byte. Indizierung von v = 3 Bytes (Typ v [k).
quelle
Python 3, 66 Bytes
Wenn ich
round()
anstelle vonint(.5+
usw. verwende, speichert es ein Zeichen, entspricht aber technisch nicht der Herausforderung: Pythonsround()
Runden halbieren sich auf die nächste gerade ganze Zahl, nicht aufwärts. Es funktioniert jedoch bei allen Sample-Eingaben korrekt.Ich fühle mich auch ein bisschen dreckig, weil ich die Ausgabe nicht mit einem Zeilenumbruch beendet habe, aber die Herausforderung erfordert das nicht ...
quelle
print(end=chr(int(...))
, um einige Bytes zu speichernJavaScript (ES6), 75 Byte
Ich kann nicht glauben, dass es mit dieser Technik noch keine Antwort von JS gibt ...
quelle
Python 2, 71
Aktualisiert mit jedem neuen Zeichen die Zeichensumme
s
und die Anzahl der Zeicheni
, um das durchschnittliche Zeichen zu berechnen und anzufügen.quelle
print
. Funktioniert das mit Python 2? Ich vergesse gerade, wie man Zeilenumbrüche in derprint
Anweisung unterdrückt ... Komma macht es zu einem Leerzeichen Stattdessen, richtig?)print _,
Leerzeichen anstelle von Zeilenumbrüchen hinterlassen, aber keine gute Möglichkeit, das Leerzeichen wegzulassen. Guter Anruf mit demend
Argument von Python 3, das hatte ich vergessen.print'\b'+_,
Ruby 59
61Test: http://ideone.com/dT7orT
quelle
c+=1;(s/c)
→(s/c+=1)
ideone.com/H2tB9WJava, 100
Ähnlich wie bei vielen anderen Antworten hier summiere und mittle ich in einer Schleife. Nur hier, um Java zu repräsentieren :)
Mein ursprünglicher Code ist eine 97, aber er gibt nur den geänderten Code zurück,
char[]
anstatt ihn zu drucken:Jetzt ist es gerade lang genug, damit Bildlaufleisten für mich angezeigt werden. Deshalb hier eine Version mit einigen Zeilenumbrüchen, nur weil:
quelle
test
handelt sich um ein Zeichen-Array, verwenden Sie einfachf(test);
. Wenn es sich um ein String-Objekt handelt, würden Sie es verwendenf(test.toCharArray());
. Auch String-Literale sind in Ordnung:f("Hello!".toCharArray());
toCharArray()
Ich bin dumm, ich habe versucht, es mit einem Casting zu verletzen. Vielen Dank.C 62 Bytes
(ideone link)
Die Ergebnisse unterscheiden sich geringfügig von den Beispielen des OP, jedoch nur, weil dieser Code 0,5 nach unten statt nach oben rundet. Nicht mehr!
quelle
R
135127 BytesDas wurde sehr schnell lang und ich habe es beim ersten Mal wirklich falsch verstanden :) Ich muss die Fragen richtig lesen.
Testlauf
quelle
utf8ToInt
es hilft! Ich habe ein 68-Byte-Golf davon, wenn Sie es aktualisieren möchten.Perl 5, 41 Bytes
Rennen wie
quelle
TSQL, 118 Bytes
Zeichen werden vertikal zurückgegeben
quelle
> <> 30 Bytes
&
RegisterSie können es mit dem Online-Interpreter versuchen, müssen jedoch die folgende Version verwenden, da der Online-Interpreter das Codefeld in ein Rechteck einfügt und
?
auf Leerzeichen angewendet wird.quelle
05AB1E , 15 Byte [Nicht konkurrierend?]
Probieren Sie es online!
quelle
D
und}
und Ersetzens
mity
..p
ist jetzt auch ein 1byterη
xD vergessenJapt , 13 Bytes (nicht konkurrierend)
Testen Sie es online!
Wie es funktioniert
quelle
Japt , 11 Bytes
Versuch es
quelle
PHP , 176 Byte
Beispiel:
Die bisher größte Lösung, aber basierend auf PHP kann sie meiner Meinung nach nicht viel kürzer werden. Durch Entfernen der Zeilenumbrüche können 2 Byte gespart werden.
quelle
JavaScript ES7, 122 Byte
Meistens passiert alles in diesem Bereich
Der Rest ist Schleifen- / Zeichencodeumwandlung
Aufteilen:
Wenn Funktionen nicht erlaubt sind:
133 Bytes
ES5-Snippet:
quelle
Python 2, 106 Bytes
Es ist nicht kurz genug. Da es sich um Python handelt, das viel zu ausführlich ist, können Sie sogar lesen, was es tut, indem Sie sich den Code ansehen. Aber es funktioniert.
quelle
Matlab, 43
Verwenden einer anonymen Funktion:
Beispiele:
quelle
JavaScript ES6, 111 Bytes
Dies ist ärgerlich lange, auch dank der langen
String.fromCharCode
undcharCodeAt
Funktionen von JavaScript . Das Stack-Snippet enthält unbenutzten, kommentierten, testbaren Code.quelle
Faktor 80 Bytes
quelle