Viele Programmiersprachen werden ausschließlich mit druckbarem ASCII, Tabulatoren und Zeilenumbrüchen geschrieben. Diese 97 Zeichen werden dann in 8-Bit-Bytes gespeichert (die tatsächlich 256 verschiedene Zeichen aufnehmen können!), Was einfach schrecklich ineffizient ist - insbesondere beim Code-Golfen, bei dem jedes Byte zählt! In dieser Herausforderung können Sie Ihre Punktzahl mithilfe der Basiskonvertierung reduzieren.
Herausforderung
Ihr Programm / Ihre Funktion verwendet eine Zeichenfolge oder ein Zeichenarray als Eingabe, die dann als Base-97- Zahl interpretiert wird . Es konvertiert dies dann in eine Basis-256- Zahl und zählt die Anzahl der Symbole (dh Bytes), die erforderlich sind, um diese Zahl darzustellen. Diese Anzahl ist der Ausgabe- / Rückgabewert Ihres Programms / Ihrer Funktion.
Ein einfaches Beispiel mit base-2 und base-10 (binär und dezimal): Wenn die Eingabe ist 10110
, wäre die Ausgabe 2, da 10110 2 = 22 10 (zwei Ziffern zur Darstellung der Ausgabe erforderlich). In ähnlicher Weise wird 1101 2 zu 13 10 , was ebenfalls eine Ausgabe von 2 ergibt, und 110 2 wird zu 6 10 , so dass die Ausgabe 1 wäre.
Der Eingabestring kann alle 95 druckbaren ASCII - Zeichen enthält, sowie Newline \n
und wörtliche Registerkarte \t
, die eine schafft Quelle Alphabet von 97 Symbolen für Ihre Basis - Konvertierung. Das genaue Alphabet lautet daher (ersetzen Sie das \t
und \n
durch das eigentliche Literal-Tab und die neue Zeile; beachten Sie das Literal-Leerzeichen nach der neuen Zeile) :
\t\n !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Beachten Sie, dass die Reihenfolge dieses Alphabets wichtig ist: Zum Beispiel \t
entspricht base-97 der Dezimalzahl 0
und !
entspricht der Dezimalzahl 3
.
Einige Testfälle: (Sie müssen keine leere Zeichenfolge verarbeiten)
Input Output
'[email protected]' 15
'All your base are belong to us!' 26
' abcd' 9
'~ abcd' 10
'ABCDEFGHIJK' 9
'zyxwvutsrpq' 10
'{".~"}.~' 7
'\t\t\t\t\t\t\t\t' 1 (with \t a literal tab; the result is 0, which can be represented with 1 byte)
'!\t\t\t\t\t\t\t\t' 7 (with \t a literal tab)
Wertung
Wenn Ihr Eintrag nur druckbares ASCII, Zeilenvorschub und / oder Tabulator verwendet: Die Punktzahl Ihres Programms ist die Ausgabe Ihres Programms, wenn als Eingabe ein eigener Quellcode angegeben wird.
Wenn Ihre Eingabe Zeichen enthält, die nicht in ASCII, Newline oder Tab gedruckt werden können: Die Punktzahl Ihres Programms entspricht einfach der Anzahl der Bytes, wie dies beim Code-Golf der Fall ist .
quelle
Antworten:
Python 2 , Punktzahl
737271Edit: -1 danke an @Jonathan Allan
Probieren Sie es online!
quelle
/
sollte in Ordnung sein, denke ichor 1
kann|1
in diesem Fall durch ersetzt werden.Japt , Punktzahl 19 (23 Bytes)
Online testen!
Zufällig glaube ich, dass dies auch mit Nicht-ASCII-Zeichen nicht viel zu tun hat ...
Erläuterung
quelle
Jelly ,
1817 Bytes - Ergebnis1817-1 byte dank Erik the Outgolfer (keine Liste von Listen für die Übersetzung nötig)
Probieren Sie es online!
Wie?
- Das Beste, was ich nur mit ASCII habe, ist eine Punktzahl von 29 :
- das ist auch extrem ineffizient. Es übersetzt die Ordnungszahlen wie oben, aber die Umrechnung von der Basis 97 erfolgt durch Wiederholen der Werte und Summieren, anstatt durch direkte Multiplikation. Das heißt, bei der Umrechnung werden
{".~"}.~
die angepassten Indizes abgerufen,[93,4,16,96,4,95,16,96]
dann umgekehrt (U
) und wiederholt, um zu bilden[[96,96,..., 97⁷ times ...,96],[16,16,... 97⁶ times ...16],[95,95,... 97⁵ times ...95],[4,4,... 97⁴ times ...4],[96,96,... 97³ times ...96],,[16,16,... 97² times ...,16],[4,4,... 97 times ...4],[93]]
und dann zu summieren. konvertiert auf Basis 256 und erhält die Länge (wenn der Speicher nicht voll ist: p).quelle
J , 36 Bytes, Score = 30
Probieren Sie es online!
J verwendet nur die 7-Bit-ASCII-Zeichen für seine Grundelemente.
Erläuterung
quelle
Gaia , 14 Bytes, Punktzahl 14
Probieren Sie es online!
Erläuterung
Nur ASCII
Dies ist das Beste, was ich nur mit ASCII finden konnte, was eine Punktzahl von 19 ergibt:
Die Schwierigkeit liegt in der Umwandlung der Eingabe. Die einzige vernünftige Möglichkeit zur Konvertierung vom Base-97-System ist die Verwendung
B
, da für die Zuordnung Nicht-ASCII-Zeichen erforderlich sind¦
. Darüber hinaus gibt es derzeit keine Möglichkeit, einen Zeichenbereich zu erstellen, ohnec
einen Zahlenbereich zuzuordnen, was dasselbe Problem verursacht. Die beste Lösung, die ich sehen konnte, bestand darin, die Zeichenfolge zu konstruieren₵R
und zu bewerten.quelle
₵R
und₵r
es ist nicht leicht zu ersetzen, obwohl es₸
offensichtlich ist), aber es kann interessant sein, zu sehen, wie es verglichen wird.₵
es sich um Code-Punkt 8373 handelt und ich auch keine Zeichenbereiche nur in ASCII ausführen kann, was ein wenig frustrierend ist, da der größte Teil dieses Programms ASCII ist.c
aber auf jedes Zeichen angewendet,$
zeigt nur alle Zahlen)c
über die Liste abbilden , das wärec¦
₵r
ist es einfach zu ersetzen, da ich es einfach verwenden könnte256
. Ich habe es nur verwendet, weil es 1 Byte kürzer ist und das Programm sowieso nicht nur ASCII war.Python 2 , Punktzahl 60
Probieren Sie es online!
Zuordnung zu Base-97
Der Wert eines Zeichens ergibt sich aus
ord(c)-[30,9][c<' ']
: seinem ASCII-Code, minus 9 für Tabulatoren und Zeilenumbrüche (die' '
lexikografisch vorangestellt sind ) oder minus 30 für alles andere.Umwandlung in eine Zahl
Wir verwenden
reduce
, um den String in eine Zahl umzuwandeln. Dies entspricht dem RechnenBerechnen der Base-256-Länge
Der Rückgabewert von
bin
ist ein String, der ungefähr so aussieht:Nenne seine Länge
L
. Ein Wert mit einern
-bit-Binärdarstellung hat eineceil(n/8)
-bit-Basis-256-Darstellung. Wir können berechnenn
alsL-2
; Auchceil(n/8)
kann geschrieben werdenfloor((n+7)/8)
=n+7>>3
, so ist unsere AntwortL-2+7>>3
=L+5>>3
.Der Fall, dass die Eingabezeichenfolge den Wert 0 hat, wird als
bin
Rückgabe korrekt behandelt"0b0"
, sodass wir3+5>>3
= 1 zurückgeben.quelle
c>=' '
oder Sie ordnen 23 statt 2 Leerzeichen zu. In normalem Codec>'\x1f'
hätte mir Golf (ein Rohbyte) geholfen, aber das ist nicht druckbar ASCII ...APL, Punktzahl 24 (Bytes *)
Nimmt die Standardeinstellung an
⎕IO←1
, andernfalls ändern Sie einfach ¯31 zu ¯30.Erläuterung:
Beispiele:
________________
*: APL kann
⎕AV
anstelle von Unicode in einem eigenen (von definierten ) älteren Zeichensatz geschrieben werden . Daher kann ein APL-Programm, das nur ASCII-Zeichen und APL-Symbole verwendet, mit 1 Zeichen = 1 Byte bewertet werden.quelle
⎕AV
(zumindest für Dyalog), wie z⍸
. Alle Ihre Symbole zählen jedoch jeweils als ein Byte. Also nicht jedes APL-Symbol = 1 Byte, wie Sie in der Fußnote angeben. (Ich dachte nur, ich würde es dich wissen lassen.) Und welchen APL-Dialekt verwendest du?Perl 5 , 76 + 1 (-F) = 77 Bytes
Probieren Sie es online!
Wie?
Trennen Sie implizit die Zeichen der Eingabe (
-F
), und speichern Sie alles in @F. Schließen Sie die implizitewhile
Schleife und starten Sie einen neuen Block (}{
) ( Danke, @Dom Hastings! ). Multiplizieren Sie für jedes Zeichen seinen Wert mit 97, um die entsprechende Potenz zu erhalten. Berechnen Sie die Anzahl der Zeichen, indem Sie die Größe der Summe in der Basis 256 mithilfe von Logarithmen ermitteln.quelle
Gelee , Gäste: 18 (Bytes)
Probieren Sie es online!
quelle
Ruby , 70 Bytes, 58 Punkte
Probieren Sie es online!
quelle
MATL (19 Bytes), Punktzahl 16
Nicht druckbare Zeichen (Tabulator, Zeilenvorschub) in der Eingabezeichenfolge werden durch Verketten ihrer ASCII-Codes (
9
,10
) mit dem Rest der Zeichenfolge eingegeben .Der erste Teil
9=?1}G
ist nur wegen eines Fehlers in der FunktionZa
(Basiskonvertierung) erforderlich , der zum Fehlschlagen führt, wenn die Eingabe nur aus "Nullen" besteht (hier Tabulatoren). Es wird in der nächsten Version der Sprache behoben.Erläuterung
quelle
Befunge-93,
8379 Bytes, Ergebnis7465Probieren Sie es hier aus!
Das Programm konvertiert zuerst die Eingabe in eine Basis-97-Zahl und zählt dann, wie viele Stellen für eine Basis-256-Zahl erforderlich sind. Daher ist die Zahl der Basis 97 sehr groß, sodass TIO für große Werte einen Maximalwert von 8 ausgibt. Der JS-Interpreter kümmert sich jedoch nicht darum und gibt den korrekten Wert aus.
quelle