푸리에의 골프 현


24

도전

문자열을 입력으로 받으면 해당 문자열을 출력하는 푸리에 프로그램 을 골프 다운 합니다.

푸리에에서는 문자열을 출력하는 쉬운 방법이 없습니다. 각 문자 코드를 거쳐 문자로 출력해야합니다.

푸리에

언어는 프로그램 시작시 0으로 초기화되는 전역 변수 인 누산기를 기반으로합니다. 언어의 거의 모든 연산자가 사용합니다. 일부는 누산기의 값을 변경하지 않습니다.

캐릭터 아웃

a

누산기의 값을 ASCII 코드로 사용하여 문자를 출력합니다. 누산기의 값을 변경하지 않습니다.

누산기가 255보다 큰 경우 프로그램은 오류를 반환합니다. 마찬가지로 누산기가 0보다 작은 경우.

번호 매기기

o

누산기의 값을 출력합니다. 누산기의 값을 변경하지 않습니다.

증가하다

^

누산기를 1 씩 늘리십시오.

감소

v

누산기를 하나씩 줄입니다.

더하다

+x

누산기를 누산기 값에 x 값을 더한 값으로 설정합니다.

덜다

-x

누산기를 누산기 값에서 x 값을 뺀 값으로 설정합니다.

곱하다

*x

누산기를 누산기 값에 x 값을 곱한 값으로 설정합니다.

분할

/x

누산기를 누산기 값을 x 값으로 나눈 값으로 설정합니다. (참고 분할이 정수인지 때문에 1/6결과 0)

번호

n

누산기를 정수 n으로 설정합니다.

노트

여기에, x그리고 n사이의 정수가 될 수 02^32-1포함.

더 많은 정보

위에서 설명한 연산자 만 사용해야합니다. 따라서 다음 중 하나를 사용하면 출력 된 푸리에 프로그램이 유효하지 않습니다 (다음 연산자가 현상금에 허용됨).

  • 반복 루프
  • if 문
  • 변수
  • 무작위
  • 모듈로
  • 사용자 입력
  • 연산자보다 크거나 적음
  • 평등 연산자
  • 화면 지우기
  • 시간 지연
  • 날짜 함수

프로그램은 전체 프로그램 또는 함수일 수 있으며 STDIN, 파일 또는 함수 인수를 통해 입력을받습니다. 인터넷에서 직접 입력 할 수도 있습니다.

a가있는 경우 참고 vv코드에서, 당신이 그것을 교체해야합니다 -2. 로 ^^대체하여 동일 합니다 +2.

입력이 7n인 경우 예상되는 프로그램은 다음과 같습니다.

55a110a

그러나 당신은 1 바이트를 절약 할 수 있습니다

55a*2a

다른 방법은

7o110a

번호를 사용합니다.


마찬가지로 입력이 Hello인 경우 예상되는 프로그램은 다음과 같습니다.

72a101a108a108a111a

출력이 누산기를 변경하지 않기 때문에 3 바이트 씩 골프 다운 할 수 있습니다.

72a101a108aa111a

그러나 더하기 연산자를 사용하여 2 바이트를 절약 할 수 있습니다.

72a101a+7aa+3a

서식

Martin Büttner의 Stack Snippet 리더 보드를 사용하므로 제목을 다음과 같이 형식화 할 수 있습니다.

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

그런 다음 제목 아래에 원하는 것을 넣을 수 있습니다.

승리

당신은 출력 (코드에 의해 생성) 푸리에 프로그램의 길이를 게시해야 이 텍스트 파일이 텍스트 파일을 . 점수는 두 푸리에 프로그램의 바이트 단위 길이입니다 (ASCII 이외의 문자는 푸리에에서 사용되지 않으므로 실제로 차이는 없습니다).

가장 낮은 점수를받은 사람이 승리합니다. 동점이 있으면 가장 짧은 바이트 단위의 프로그램이 이깁니다.

하사품

이 500 회 현상금은 푸리에의 기능을 사용하여 현을 골라내는 새로운 해답입니다. 여기에는 변수, 루프 및 if 문 등이 포함됩니다.이 새로운 답변은 허용되지 않습니다.

리더 보드

위의 포맷 섹션을 참조하십시오 :

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
모든 최적의 솔루션을 출력해야한다고 생각하는 것은 매우 공정하고 흥미롭지 않습니다. 그것은 무차별 대입을 제외한 모든 이행을 배제한다.
orlp

5
모든 최적의 솔루션을 출력해야 할 때의 실제 문제는 긴 입력의 경우 더 많은 최적의 솔루션이 우주보다 원자가 있다는 것입니다.
isaacg 2016 년

1
@orlp 모든 최적의 솔루션 출력 수정
Beta Decay

1
인쇄 가능한 ASCII 또는 모든 종류의 ASCII 여야합니까? 그리고 7 비트 ASCII 또는 전체 바이트입니까?
orlp

1
누산기는 0에서 시작합니까?
ASCIIThenANSI

답변:


9

파이썬, 14307118 바이트

햄릿의 경우 601216 + 창세기의 경우 13705902 = 14307118

이러한 경우와이 솔루션이 최적하지 않은에서 일부 senarios, 확실히있다 1111가 출력 곳, 1111o반대는 11oo. 그러나 나는 그것이 거의 최적이라고 생각합니다.

편집 :로 개선 0o0o하여 몇 바이트를 절약했습니다 0oo.

입력을 포함하는 파일 이름은 STDIN에서 수신되고 STDOUT으로 출력됩니다.

공식 통역사를 통해 결과가 검증되었습니다.

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 글쎄, Geobit의 결과가 잘못되었다고 확신합니다.
isaacg

거기에 아주 작은, 그러나 당신이 (필자는 연장전으로 코드 길이를 사용 있도록하고 Razvan 보낸 사람이 묶여)에 불과 5 자에 의해 원
베타 붕괴를

2
@BetaDecay 나는 길이 타이 브레이커가 전에 ungolfed 프로그램 쌍 사이에 관련되는 것을 본 적이 없다.
isaacg

그래 ... 나 어느 쪽도 없습니다 : P
베타 붕괴

13

> <>, 14310665 바이트

햄릿의 경우 601398 + 기원의 경우 13709267

아직 진행중인 작업이며 완료하는 데 많은 시간이 걸립니다.

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'<

그것은 미치도록 작지만 수치스럽지 않습니다.
orlp

/, * 및 o를 사용하려고 노력하고 있지만 더 많은 자리를 차지하기 시작했습니다.
Aaron

18
괜찮습니다. 물고기는 보통 이야기를 할 때마다 자랍니다.)
Geobits

글쎄, 이것은 언어의 훌륭한 선택입니다 : D
Beta Decay

귀하의 프로그램이 현상금에 대한 기준에 맞지 않았으므로 (게시 된 답변 중 어느 것도하지 않았습니다), 나는 귀하가 <> <를 사용한 것을 좋아하기 때문에 귀하에게 이것을 수여했습니다.
Beta Decay

8

자바, 14307140 바이트

햄릿-601,218

창세기-13,705,922

여기서 아이디어는 문자-> 문자 맵을 만들어 모든 작업을 선행하는 것입니다. 그런 다음 반복해서 가장 짧은 줄을 잡을 수 있습니다.

숫자에 대해서는 약간의 예외가 있어야하므로 메인 루프에서 확인하십시오. 그래도 여전히 빠르며 몇 초 안에 더 큰 테스트 사례를 처리합니다. 내가 할 수 몇 바이트 이상이 섹션을 조정할 수 있지만, 나는 꽤 확실이 최적으로 가까이하고 있습니다.

입력은 인수로 파일 이름입니다. 출력은 파일에 기록되고 inputFilename_out.4문자 수는 STDOUT으로 전송됩니다.

타이 브레이커의 경우 1737 바이트이며 완전히 풀리지 않습니다. 필요한 경우 골프를 많이 할 수 있지만 여전히 약간 커질 것입니다.

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();
    }

}

나는 이것이 0으로 올바르게 된 문자열을 처리하지 않는다고 생각합니다. 예를 들어 input 01에서 출력 01o이 정확 하다고 생각 합니다.
isaacg

또한 누산기를 잘못 사용하고 있다고 생각합니다. else메인 루프 의 절에서 누산기의 실제 값과 이전 문자의 문자 값 중 하나를 사용하도록 선택합니다. 둘이 다르면 후자를 선택할 수 없습니다. 왜냐하면 o이전 시간 을 사용 했고 누산기에 이전 문자 값이 포함되어 있지 않기 때문입니다.
isaacg

맞습니다, 둘 다 지금 고쳐야합니다. 감사!
Geobits

이것을 machinge에서 실행할 때 Hamlet의 경우 625474, Genesis의 경우 13705922가 표시됩니다.
isaacg

@isaacg 같은 파일에서 같은 줄 끝으로 실행하고 있습니까? 나는 줄 끝에 일찍 문제가 발생했습니다. 같은 파일에서 내 것과 당신을 실행하면 둘 다 게시 된 점수를 보여줍니다.
Geobits

2

PHP, 14307118 바이트

601,216 (햄릿) + 13,705,902 (성경)

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";
    }
}

햄릿을위한 푸리에 출력

다음과 같이 작동합니다.

  1. 입력의 각 문자를 반복합니다.
  2. 0이 아닌 선행 숫자의 시퀀스가 ​​있으면 누산기가 해당 숫자로 설정되고 숫자로 출력됩니다. 또한 유사한 자릿수를 확인합니다.
  3. 그렇지 않으면, 2에서 9 사이의 숫자로 누산기에서 기본 조작 (+-* /)을 수행하여 현재 문자를 출력하는 더 짧은 방법이 있는지 (ASCII 코드 + "a"기호 = 4 자) 출력하는지 확인합니다. 분명히, 그것은 또한 비교 / 증가 / 감소를 시도합니다;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.