Einführung
Einige ASCII-Zeichen sind heutzutage so teuer ...
Um Geld zu sparen, haben Sie sich entschieden, ein Programm zu schreiben, das teure Zeichen mit billigen Zeichen codiert.
Die Zeichenpreise ändern sich jedoch häufig und Sie möchten Ihr Programm nicht jedes Mal ändern, wenn Sie ein anderes Zeichen codieren oder decodieren müssen! Sie benötigen eine dynamischere Lösung.
Herausforderung
Ihre Aufgabe ist es, zwei Programme zu schreiben: einen Encoder und einen Decoder .
Der Encoder sollte eine Liste von fünf billigen Zeichen und ein einziges teures Zeichen akzeptieren.
Es sollte eine einzelne Zeichenfolge aus den billigen Zeichen ausgegeben werden, die das teure Zeichen codiert.
Diese Zeichenfolge darf nicht länger als 4 Zeichen sein , um kostengünstig zu bleiben. Es müssen jedoch nicht alle kostengünstigen Zeichen in der Codierung verwendet werden und die Codierungen können unterschiedlich lang sein.
Der Decoder sollte die vom Encoder ausgegebene Zeichenfolge akzeptieren und das teure Zeichen ausgeben.
Der Decoder darf keine andere Eingabe als die codierte Zeichenfolge akzeptieren. Es muss für jede (gültige) Kombination von Eingängen unverändert vom Ausgang des Encoders funktionieren. Mit anderen Worten, Ihr Decoderprogramm weiß nicht, welche Zeichen teuer oder billig sind.
Wertung
Kürzester kombinierter Code gewinnt!
Anmerkungen
Alle Zeichen sind entweder Großbuchstaben
[A-Z]
, Kleinbuchstaben[a-z]
oder Zahlen[0-9]
.Die Liste der billigen Zeichen enthält keine Duplikate. Kein Charakter wird sowohl billig als auch teuer sein.
Der Codierer und der Decodierer müssen nicht in derselben Sprache geschrieben sein, können es aber sein. Sie können ein Programm oder eine Funktion schreiben.
Die Eingabe und Ausgabe kann in einem für Ihre Sprache angemessenen Format erfolgen.
Die beiden Programme dürfen keine Variablen oder Daten gemeinsam nutzen.
Zusammenfassung
Die Eingabe einiger billiger Zeichen und eines teuren Zeichens erfolgt an den Codierer.
Encoder gibt eine Zeichenfolge mit kostengünstigen Zeichen aus, die das teure Zeichen codiert.
Der Decoder erhält die Ausgabe des Encoders und gibt das teure Zeichen aus.
Beispiele
Eingang: a, b, c, d, e
f
Encoder-Möglichkeiten: a
eeee
caec
Decoder: f
Eingang: a, b, c, d, e
h
Encoder-Möglichkeiten: bc
cea
eeaa
Decoder: h
Eingang: q, P, G, 7, C
f
Encoder-Möglichkeiten: 777
P7
PPCG
Decoder: f
Antworten:
Pyth, 46 Bytes
Encoder, 22 Bytes
Decoder, 24 Bytes
quelle
S4
mitT
und jedes Byte in beiden Programmen speichern.CJam,
55504847 BytesEncoder,
242221 BytesProbieren Sie es online aus.
Decoder,
31282726 BytesProbieren Sie es online aus.
quelle
'
'
ist kein Operator. Sie finden es auf der Syntaxseite .Gawk, 163 + 165 = 328
Getestet mit Gawk 4.1.1, sollte aber auch in älteren Gawk-Versionen funktionieren. Muss leicht modifiziert (verlängert) werden, um mit Mawk zu arbeiten.
Encoder (163):
Decoder (165):
Nun, es funktioniert, aber ich bin mir bewusst, dass dies möglicherweise nicht der beste Ansatz dafür ist. Ich habe keine Ahnung, wofür der fünfte preiswerte Brief ist, weil ich nur vier benutze.
Diese sind nur zum einmaligen Gebrauch bestimmt. Wenn Sie einen zweiten Code eingeben möchten, müssen Sie diese neu starten. Die Leerzeichen nach den Kommas müssen in der Eingabe codiert werden.
Was ich darüber nachgedacht habe
Meine erste Frage war "Was kann ein Decoder aus diesen 4 Zeichen machen?" (Ich werde sie a, b, c und d nennen), und meine ursprüngliche Idee war, 6 Bits an Informationen aus folgenden Beziehungen zu erhalten:
Wow, 6 Bit, das ist perfekt! Ich hielt es für genial, aber Tests ergaben, dass dies nicht funktionieren würde. Es gibt nur 24 mögliche Kombinationen. Verdammt.
Der nächste Schritt war zu zählen, basierend auf dem, was ich bereits wusste. Der erste Buchstabe in der Zeichenfolge wird zu 0, der zweite Buchstabe in der Zeichenfolge wird zu 1 und so weiter. Aber es würde mich nicht bis zu den 62 benötigten Kombinationen bringen.
Aber die Idee gefällt mir trotzdem.
Nun, dann fiel mir auf, dass ich diese beiden kombinieren könnte, da die Zeichen in der Eingabe bereits Beziehungen haben und ich nicht warten müsste, bis sie eingeführt wurden, um ihnen einen Wert zu geben.
Wie es funktioniert
Hinweis: Genau so funktionieren die Golf-Versionen nicht mehr, aber das Prinzip ist gleich geblieben.
Für den Decoder:
Es wird ein Array erstellt, dessen Index alle vier Ziffern enthält, deren größte Ziffer nicht größer ist als die Anzahl der einzelnen Ziffern in dieser Ziffer. Es gibt 75 verschiedene vierstellige Zahlen, die diese Bedingung erfüllen. Ich zwinge sie brutal, weil ich bisher keinen Weg gefunden habe, sie zu konstruieren, und ich bin mir nicht sicher, ob dies in awk sowieso kürzer sein würde. Während ich diese finde, ordne ich ihnen die teuren Zeichen in ASCII-Reihenfolge zu.
Dann ersetze ich jedes Zeichen aus der Eingabezeichenfolge durch eine Ziffer. Das kleinste (zum Beispiel ist 'B' kleiner als 'a') wird zu 1, das zweitkleinste wird zu 2 und so weiter bis zu 4. Natürlich hängt es davon ab, wie viele verschiedene Zeichen in der Eingabe sind, was die höchste Ziffer ist Die resultierende Zeichenfolge ist.
Dann drucke ich einfach das Array-Element, das diesen String als Index hat.
Der Encoder arbeitet entsprechend.
Wie benutzt man
Kopieren Sie den Code entweder direkt in einen awk-bash-Zeilenbefehl oder erstellen Sie zwei Dateien "encode.awk" und "decode.awk" und fügen Sie den Code entsprechend ein. Oder verwenden Sie besser den folgenden Code, der nach dem En / Decodieren automatisch beendet wird, oder Sie können ihn mehrmals verwenden, indem Sie den Befehl exit am Ende entfernen.
encode.awk
decode.awk
Hier ist ein Anwendungsbeispiel:
Denken Sie daran, dass das Leerzeichen nach jedem Komma erforderlich ist, wenn Sie die Golf-Versionen verwenden.
Wenn Sie möchten, können Sie dieses kurze und unsaubere Skript verwenden, um einige Beispieldaten zu generieren
und mach sowas lustiges wie
Ich habe das eher als Programmierpuzzle gesehen. Ich finde es ein bisschen traurig, dass hier fast alles golfen ist, denn man kann viel mehr aus gut dokumentiertem, lesbarem Code lernen, aber das ist nur meine Meinung. Und ich habe es wie gewünscht golfen;)
quelle