Golfsaiten in Fourier


24

Herausforderung

Wenn Sie eine Zeichenfolge als Eingabe angeben, spielen Sie das Fourier-Programm ab, das diese Zeichenfolge ausgibt.

In Fourier gibt es keine einfache Möglichkeit, einen String auszugeben: Sie müssen jeden Zeichencode durchgehen und diesen als Zeichen ausgeben.

Fourier

Die Sprache basiert auf einem Akkumulator, einer globalen Variablen, die zu Beginn des Programms auf 0 initialisiert wird. Dies wird von fast jedem Operator in der Sprache verwendet. Nur einige ändern den Wert des Akkus nicht.

Charakter aus

a

Nimmt den Wert des Akkus als ASCII-Code und gibt das Zeichen aus. Ändert den Wert des Akkus nicht.

Wenn der Akku größer als 255 ist, gibt das Programm einen Fehler zurück. Ebenso, wenn der Akku kleiner als 0 ist.

Nummer raus

o

Gibt den Wert des Akkus aus. Ändert den Wert des Akkus nicht.

Erhöhen, ansteigen

^

Erhöhen Sie den Akku um eins.

Verringern

v

Verringern Sie den Akku um eins.

Hinzufügen

+x

Setzt den Akku auf den Wert des Akkus plus den Wert von x.

Subtrahieren

-x

Setzt den Akku auf den Wert des Akkus minus dem Wert von x.

Multiplizieren

*x

Setzt den Akku auf den Wert des Akkus multipliziert mit dem Wert von x.

Teilen

/x

Setzt den Akku auf den Wert des Akkus geteilt durch den Wert von x. (Beachten Sie, dass dies eine Ganzzahldivision ist. Dies 1/6führt zu 0)

Nummer

n

Stellen Sie den Akku auf die ganze Zahl n.

Hinweis

Hier xund nkann eine beliebige ganze Zahl von 0bis 2^32-1einschließlich sein.

Mehr Informationen

Sie dürfen nur die oben beschriebenen Operatoren verwenden. Daher ist Ihr ausgegebenes Fourier-Programm ungültig, wenn eines der folgenden Elemente verwendet wird (beachten Sie, dass die folgenden Operatoren für die Prämie zulässig sind):

  • Wiederholen Sie die Schleifen
  • If-Anweisungen
  • Variablen
  • Zufällig
  • Modulo
  • Benutzereingabe
  • Größer / Kleiner als Operatoren
  • Gleichstellungsoperatoren
  • Bildschirm löschen
  • Zeitverzögerung
  • Datumsfunktionen

Ihr Programm kann entweder ein vollständiges Programm oder eine Funktion sein, die Eingaben über STDIN, eine Datei oder Funktionsargumente aufnimmt. Sie können Eingaben auch direkt aus dem Internet vornehmen.

Beachten Sie, dass vvSie den Code durch einen ersetzen sollten , wenn er einen enthält -2. Das gleiche gilt für das ^^Ersetzen durch +2.

Beispiele

Wenn die Eingabe lautet 7n, lautet das erwartete Programm:

55a110a

Mit können Sie aber ein Byte sparen

55a*2a

Ein anderer Weg ist

7o110a

Nummer raus verwenden.


In ähnlicher Weise lautet Hellodas erwartete Programm, wenn die Eingabe lautet:

72a101a108a108a111a

Sie können es um 3 Bytes reduzieren (da die Ausgabe den Akku nicht verändert):

72a101a108aa111a

Aber warte, wir können den Additionsoperator verwenden und 2 Bytes sparen:

72a101a+7aa+3a

Formatierung

Da ich die Stack Snippet-Bestenliste von Martin Büttner verwende, können Sie den Titel folgendermaßen formatieren:

# <Language name>, <length of total output> bytes

Dann können Sie alles, was Sie wollen, unter den Titel setzen.

Gewinnen

Sie sollten die Länge der Fourier-Programme (von Ihrem Code erstellt) angeben, um diese Textdatei und diese Textdatei auszugeben . Ihre Punktzahl ist die kombinierte Länge der beiden Fourier-Programme in Bytes (Nicht-ASCII-Zeichen werden in Fourier nicht verwendet, es macht also keinen wirklichen Unterschied).

Die Person mit den niedrigsten Punktzahlen gewinnt. Bei Gleichstand gewinnt das kürzeste Programm in Bytes.

Kopfgeld

Diese Prämie von 500 Wiederholungen ist für eine neue Antwort gedacht, bei der die Saiten mit einer der Fourier-Funktionen gespielt werden. Dazu gehören Variablen, Schleifen und if-Anweisungen usw. Diese neue Antwort wird nicht akzeptiert.

Bestenliste

Siehe Formatierungsabschnitt oben:

var QUESTION_ID=55384;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:&lt;(?:s&gt;[^&]*&lt;\/s&gt;|[^&]+&gt;)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table></div> <tbody id="languages"> </tbody> </table></div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table>


6
Ich denke nicht, dass es sehr fair / interessant ist, alle optimalen Lösungen ausgeben zu müssen. Es
schließt

5
Das eigentliche Problem bei der Ausgabe aller optimalen Lösungen ist, dass es für eine lange Eingabe mehr optimale Lösungen gibt als Atome im Universum.
Isaacg

1
@orlp Herausgearbeitet, um alle optimalen Lösungen auszugeben
Beta Decay

1
Sollte es nur druckbares ASCII oder irgendeine Art von ASCII sein? Und nur 7-Bit-ASCII oder volle Bytes?
Orlp

1
Beginnt der Akku bei 0?
ASCIIThenANSI

Antworten:


9

Python, 14307118 Bytes

601216 für Hamlet + 13705902 für Genesis = 14307118

Es gibt definitiv einige Szenarien, in denen diese Lösung nicht optimal ist, wie zum Beispiel für 1111, wo sie 1111oim Gegensatz zu ausgegeben wird11oo . Ich denke jedoch, dass es fast optimal ist.

Bearbeiten: Ein paar Bytes durch Verbesserung 0o0oauf gespeichert 0oo.

Der Name der Datei, die die Eingabe enthält, wird auf STDIN empfangen und auf STDOUT ausgegeben.

Ergebnisse mit dem offiziellen Dolmetscher verifiziert.

def opt_str(char, acc):
    opts = []
    char_num = ord(char)
    opts.append(str(char_num))
    if 0 < char_num - acc < 10:
        opts.append('+' + str(char_num - acc))
    if 0 < acc - char_num < 10:
        opts.append('-' + str(acc - char_num))
    if char_num - acc == 1:
        opts.append('^')
    if acc - char_num == 1:
        opts.append('v')
    if acc == char_num:
        opts.append('')
    if acc and char_num % acc == 0:
        opts.append('*' + str(char_num//acc))
    try:
        if acc // (acc // char_num) == char_num:
            opts.append('/' + str(acc // char_num))
    except:
        pass
    return [opt for opt in opts if len(opt) == len(min(opts, key=len))]

acc = 0
result = []
pos = 0
with open(input(), "r") as myfile:
        in_str = myfile.read()
while pos < len(in_str):
    i = in_str[pos]
    pos += 1
    if i in '0123456789':
        if i != '0':
            while pos < len(in_str) and in_str[pos] in '0123456789':
                i += in_str[pos]
                pos += 1
        if i == str(acc):
            result.append('o')
        else:
            result.append(i + 'o')
        acc = int(i)
    else:
        opts = opt_str(i, acc)
        result.append(opts[0] + 'a')
        acc = ord(i)
print(''.join(result))

@Shebang Nun, ich bin mir ziemlich sicher, dass Geobits Ergebnis falsch ist, siehe meine Kommentare dort.
Isaacg

Es war sehr wenig drin, aber Sie haben mit nur 5 Zeichen gewonnen (Sie und Razvan haben zusammengearbeitet, also habe ich Ihre Codelänge als Tiebreaker verwendet)
Beta Decay

2
@BetaDecay Ich habe noch nie gesehen, dass der Längenknacker für ein Paar ungolfed Programme relevant ist.
isaacg

Ja, ich auch nicht: P
Beta Decay

13

> <> 14310665 Bytes

601398 für Weiler + 13709267 für Genesis

Dies ist noch in Arbeit und erfordert viel Zeit.

v
0
>i:0(?;:r-:?!v:0a-)?v     v
  >~:v       ~      >:a(?v>
 :1+?v~'v'o  v      o'^'~\:0)?v
     >n      vno'+'      ^?=1:<
^        o'a'<

Das ist verrückt, aber schade, dass es nicht optimal ist.
Orlp

Ich arbeite daran, /, * und o zu verwenden, aber es fängt an, etwas mehr Platz einzunehmen.
Aaron

18
Das ist okay, Fische wachsen normalerweise mit jedem Erzählen der Geschichte;)
Geobits

Nun, dies ist eine brillante Wahl der Sprache: D
Beta Decay

Ihr Programm entsprach nicht den Kriterien für die Prämie (keine der veröffentlichten Antworten), daher habe ich Ihnen dies zuerkannt, weil ich es liebe, dass Sie <> <verwendet haben.
Beta Decay

8

Java, 14307140 Bytes

Hamlet - 601,218

Genesis - 13.705.922

Hier geht es darum, die gesamte Arbeit im Voraus zu erledigen, indem Sie eine Charakter-> Charakterkarte erstellen. Dann können Sie einfach durchlaufen und die kürzesten Saiten greifen.

Für Zahlen muss eine kleine Ausnahme gemacht werden, also überprüfe ich sie in der Hauptschleife. Es ist jedoch immer noch schnell und erledigt den größeren Testfall in wenigen Sekunden. Vielleicht kann ich diesen Abschnitt noch ein paar Bytes weiter optimieren, aber ich bin mir ziemlich sicher, dass er sich dem Optimum nähert.

Eingabe ist ein Dateiname als Argument. Die Ausgabe wird in eine Datei geschrieben inputFilename_out.4und die Anzahl der Zeichen an STDOUT gesendet.

Dies sind 1737 Bytes für den völlig ungolften Tiebreaker. Ich kann viel Golf spielen, wenn es nötig ist, aber es wird immer noch ein bisschen groß.

import java.nio.file.Files;
import java.nio.file.OpenOption;
import java.nio.file.Paths;
import java.text.NumberFormat;

public class FourierMapper {
    public static void main(String[] args) throws Exception {
        FourierMapper fm = new FourierMapper();
        fm.createMap();
        String filename = args.length>0? args[0]:"bible.txt";
        String out = fm.fourierize(filename);
        System.out.println(out.length());
        Files.write(Paths.get(filename + "_out.4"), out.getBytes(), new OpenOption[]{});
    }

    String[][] map = new String[9999][256];
    void createMap(){
        for(int from=0;from<9999;from++){
            for(int to=0;to<256;to++){
                if(to<10||from<1){
                    map[from][to] = ""+to;
                } else if(to==from){
                    map[from][to] = "";
                } else if(to-from==1){
                    map[from][to] = "^";
                } else if(to-from==-1){
                    map[from][to] = "v";
                } else if(to>99){               
                    if(to%from<1){
                        map[from][to] = "*"+(to/from);
                    } else if(to>from&&to-from<10){
                        map[from][to] = "+"+(to-from);
                    } else if(from>to&&from-to<10){
                        map[from][to] = "-"+(from-to);
                    } else {
                        map[from][to] = ""+to;
                    }
                } else {
                    map[from][to] = ""+to;
                }
            }
        }
    }

    String fourierize(String filename) throws Exception{
        StringBuilder out = new StringBuilder();
        byte[] in = Files.readAllBytes(Paths.get(filename));
        String whole = new String(in);
        out.append(in[0] + "a");
        int number = -1;
        for(int i=1;i<in.length;){
            if(in[i]<58&&in[i]>47){
                number = in[i]==48?0:((Number)NumberFormat.getInstance().parse(whole.substring(i,i+4))).intValue();
                out.append(""+number+"o");
                i += (""+number).length();
            } else {
                if(number<0)
                    out.append(map[in[i-1]][in[i]]+"a");
                else
                    out.append(map[number][in[i]]+"a");
                number = -1;
                i++;
            }
        }
        return out.toString();
    }

}

Ich denke, das behandelt Zeichenfolgen mit führenden Nullen nicht richtig. Zum Beispiel 01glaube ich, dass es bei der Eingabe Ausgaben gibt 01o, was nicht korrekt ist.
Isaacg

Ich denke auch, dass Sie den Akku missbrauchen. In der elseKlausel der Hauptschleife können Sie zwischen dem tatsächlichen Wert des Akkumulators und dem Zeichenwert des vorherigen Zeichens wählen. Sie können die letztere Auswahl nicht treffen, wenn die beiden unterschiedlich sind, da Sie odie Zeit zuvor verwendet haben und der Akku den Wert des vorherigen Zeichens nicht enthält.
Isaacg

Richtig, beide sollten jetzt behoben sein. Vielen Dank!
Geobits

Wenn ich das mit meiner Maschine mache, erhalte ich 625474 für Hamlet und 13705922 für Genesis.
Isaacg

@isaacg Führen Sie es in derselben Datei aus (mit denselben Zeilenenden)? Ich bin früher auf ein Problem mit Zeilenenden gestoßen. Wenn ich meins und deins in derselben Datei laufen lasse, zeigen beide die geposteten Ergebnisse an.
Geobits

2

PHP, 14307118 Bytes

601 216 (Weiler) + 13 705 902 (Bibel)

function f($file) {
    $text = file_get_contents($file);

    $a = 0;

    for ($i = 0; $i < strlen($text); $i++) {
        $chr = $text[$i];

        if (ctype_digit($chr)) {
            while ($chr && isset($text[$i + 1]) && ctype_digit($text[$i + 1])) {
                $chr .= $text[$i + 1];
                $i++;
            }

            if ($a == (int)$chr) {
                print "o";
            }
            else {
                $a = (int)$chr;
                print $chr . "o";
            }

            continue;
        }

        $ord = ord($chr);

        $mapping = array(
            '' => $a,
            '^' => $a + 1,
            'v' => $a - 1
        );

        for ($j = 2; $j <= 9; $j++) {
            $mapping["+$j"] = $a + $j;
            $mapping["-$j"] = $a - $j;
            $mapping["*$j"] = $a * $j;
            $mapping["/$j"] = $a / $j;
        }

        foreach ($mapping as $op => $value) {
            if ($value === $ord) {
                $a = $value;
                print $op . "a";
                continue 2;
            }
            else if ($value . '' === $chr) {
                $a = $value;
                print $op . "o";
                continue 2;
            }
        }

        $a = $ord;
        print $ord . "a";
    }
}

Fourier-Ausgabe für Hamlet

Es funktioniert wie folgt:

  1. Durchläuft jedes Zeichen in der Eingabe.
  2. Wenn es eine Folge von nicht 0 führenden Ziffern gibt, wird der Akku auf diese Zahl gesetzt und als Zahl ausgegeben. Es wird auch nach ähnlichen Ziffern gesucht.
  3. Andernfalls wird geprüft, ob es eine kürzere Art der Ausgabe des aktuellen Zeichens gibt (anstelle des ASCII-Codes + "a" -Symbol = 4 Zeichen), indem eine Grundoperation (+ - * /) für den Akku mit einer Zahl zwischen 2 und 9 ausgeführt wird. offensichtlich versucht es auch, zu vergleichen / zu erhöhen / zu verringern;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.