ফুয়েরে গল্ফিং স্ট্রিং


24

চ্যালেঞ্জ

ইনপুট হিসাবে একটি স্ট্রিং দেওয়া হয়েছে, ফুরিয়ার প্রোগ্রামটি ডাউন করে দেয় যা এই স্ট্রিংটিকে আউটপুট দেয়।

ফুরিয়ারে স্ট্রিং আউটপুট দেওয়ার কোনও সহজ উপায় নেই: আপনাকে প্রতিটি অক্ষর কোড এবং আউটপুট দিয়ে যেতে হবে যা একটি চরিত্র হিসাবে।

ফুরিয়ার

ভাষাটি একটি সঞ্চয়ের উপর ভিত্তি করে তৈরি করা হয়, একটি বৈশ্বিক পরিবর্তনশীল যা প্রোগ্রামের শুরুতে 0 থেকে শুরু হয়। এটি ভাষাতে প্রায় প্রতিটি অপারেটর ব্যবহার করেন। কেবলমাত্র কিছু লোক সঞ্চয়ের মান পরিবর্তন করে না।

চরিত্র আউট

a

সঞ্চয়ের মানকে ASCII কোড হিসাবে গ্রহণ করে এবং চরিত্রটিকে আউটপুট করে। সঞ্চয়ের মান পরিবর্তন করে না।

যদি সঞ্চালক 255 এর চেয়ে বেশি হয় তবে প্রোগ্রামটি একটি ত্রুটি ফিরিয়ে দেবে। অনুরূপভাবে যদি সংগ্রহকার 0 এর চেয়ে কম হয়।

নাম্বার আউট

o

সঞ্চয়ের মান আউটপুট করে। সঞ্চয়ের মান পরিবর্তন করে না।

বৃদ্ধি

^

জমে এক এক করে বাড়ান।

কমান

v

এক এক করে জমে কমে।

যোগ

+x

সঞ্চয়ের সংযোজকের মান এবং এক্স এর মানকে সেট করে।

বিয়োগ করা

-x

সঞ্চয়েরকে বিয়োগকারকের বিয়োগের মানকে x এর মান হিসাবে সেট করে।

গুন

*x

এক্স এর মান দ্বারা গুণিত সঞ্চয়ের মানতে সঞ্চয়ের সেট করে।

বিভক্ত করা

/x

X এর মান দ্বারা বিভক্ত সঞ্চালকের মানগুলিতে সংযোজককে সেট করে। (দ্রষ্টব্য যে এটি পূর্ণসংখ্যা বিভাগ, সুতরাং 1/6ফলাফলগুলি 0)

সংখ্যা

n

পূর্ণসংখ্যাতে সঞ্চয়ের সেট করুন এন।

বিঃদ্রঃ

এখানে, xএবং অন্তর্ভুক্তিতে nকোনও পূর্ণসংখ্যার হতে 0পারে 2^32-1

অধিক তথ্য

আপনাকে কেবল উপরে বর্ণিত অপারেটরগুলি ব্যবহার করতে হবে। সুতরাং আপনার আউটপুটযুক্ত ফুরিয়ার প্রোগ্রামটি অবৈধ যদি এটি নীচের যে কোনওটি ব্যবহার করে (মনে রাখবেন যে নিম্নলিখিত অপারেটরগণকে অনুগ্রহের জন্য অনুমোদিত):

  • লুপগুলি পুনরাবৃত্তি করুন
  • যদি বিবৃতি
  • ভেরিয়েবল
  • এলোমেলো
  • মডিউলো
  • ব্যবহারকারীর ইনপুট
  • অপারেটরদের চেয়ে বৃহত্তর / কম
  • সমতা অপারেটর
  • পরিষ্কার পর্দা
  • সময় বিলম্ব
  • তারিখ ফাংশন

আপনার প্রোগ্রামটি একটি সম্পূর্ণ প্রোগ্রাম বা কোনও ফাংশন হতে পারে, এসটিডিআইএন, কোনও ফাইল বা ফাংশন আর্গুমেন্টের মাধ্যমে ইনপুট নেয়। আপনি সরাসরি ইন্টারনেট থেকে ইনপুট নিতে পারেন।

মনে রাখবেন যে আপনার কোডটিতে যদি কোনও থাকে তবে vvআপনার এটির সাথে প্রতিস্থাপন করা উচিত -2। একই জন্য ^^এটি প্রতিস্থাপন +2

উদাহরণ

যদি ইনপুট হয় 7n, তবে প্রত্যাশিত প্রোগ্রামটি হ'ল:

55a110a

তবে আপনি এটি দিয়ে একটি বাইট সংরক্ষণ করতে পারেন

55a*2a

আরেকটি উপায়

7o110a

নম্বর ব্যবহার করে।


একইভাবে যদি ইনপুট হয় Hello, তবে প্রত্যাশিত প্রোগ্রামটি হ'ল:

72a101a108a108a111a

আপনি এটি 3 বাইট দ্বারা গল্ফ করতে পারেন (কারণ আউটপুট আউটুলেটেডকে পরিবর্তন করে না):

72a101a108aa111a

তবে অপেক্ষা করুন, আমরা 2 বাইট সংরক্ষণ করে সংযোজন অপারেটরটি ব্যবহার করতে পারি:

72a101a+7aa+3a

বিন্যাস করা

কারণ আমি মার্টিন বাটনার স্ট্যাক স্নিপেট লিডারবোর্ডটি ব্যবহার করব, দয়া করে আপনি কি শিরোনামটি এভাবে বিন্যাস করতে পারেন:

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

তারপরে, আপনি শিরোনামের নীচে যে কোনও কিছু রাখতে পারেন put

জয়লাভ

এই টেক্সট ফাইল এবং এই টেক্সট ফাইলটিকে আউটপুট দেওয়ার জন্য আপনার ফুরিয়ার প্রোগ্রামগুলির দৈর্ঘ্য (আপনার কোড দ্বারা উত্পাদিত) পোস্ট করা উচিত । আপনার স্কোরটি উভয় ফুরিয়ার প্রোগ্রামের বাইটে সংযুক্ত দৈর্ঘ্য (অ-এসসিআইআই অক্ষরগুলি ফুরিয়ারে ব্যবহার করা হয় না যাতে এটি সত্যিই কোনও পার্থক্য করে না)।

সর্বনিম্ন স্কোর প্রাপ্ত ব্যক্তি জিতে যায়। যদি টাই থাকে তবে বাইটের মধ্যে সংক্ষিপ্ততম প্রোগ্রামটি জয়ী হয়।

খয়রাত

এই 500 রিপ্রেস অনুগ্রহটি একটি নতুন উত্তরের জন্য যা ফুয়েরিয়ার কোনও ফাংশন ব্যবহার করে স্ট্রিংগুলিকে গল্ফ করে। এর মধ্যে ভেরিয়েবল, লুপ এবং স্টেটমেন্ট ইত্যাদি অন্তর্ভুক্ত রয়েছে এই নতুন উত্তরটি গৃহীত হবে না।

লিডারবোর্ড

উপরের ফর্ম্যাটিং বিভাগটি দেখুন:

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
সমস্ত অনুকূল সমাধান আউটপুট থাকার সাথে আসল সমস্যাটি হ'ল দীর্ঘ ইনপুটটির জন্য আরও অনুকূল সমাধান হবে তখন মহাবিশ্বে পরমাণু রয়েছে।
ইসাকাক

1
@orlp সমস্ত অনুকূল সমাধানগুলি আউটপুট করে সম্পাদনা করেছেন
বিটা

1
এটি কি কেবল ছাপার যোগ্য এএসসিআইআই, বা কোনও ধরণের এএসসিআইআই হওয়া উচিত? এবং শুধুমাত্র 7-বিট ASCII, বা পূর্ণ বাইটস?
orlp

1
সংগ্রহকারী 0 থেকে শুরু হয়?
ASCIIThenANSI

উত্তর:


9

পাইথন, 14307118 বাইট

হ্যামলেটের জন্য 601216 + জেনেসিসের জন্য 13705902 = 14307118

কিছু সিনিয়রিয়ো অবশ্যই রয়েছে যার অধীনে এই সমাধানটি সর্বোত্তম নয় যেমন এর জন্য 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))

@ শেবাং ওয়েল, আমি নিশ্চিত যে জিওবিটের ফল ভুল হয়েছে, আমার মন্তব্যগুলি সেখানে দেখুন।
isaacg

এতে খুব সামান্যই ছিল, তবে আপনি মাত্র 5 টি অক্ষর দ্বারা জিতেছেন (আপনি এবং রাজ্জান বেঁধেছেন তাই আমি আপনার কোডের দৈর্ঘ্যটি টাইব্রেকার হিসাবে ব্যবহার করেছি)
বিটা ডেকে

2
@ বেটাডেকে আমি আগে কখনও কখনও দৈর্ঘ্যের টাইব্রেকারকে একজোড়া অসম্পূর্ণ প্রোগ্রামগুলির মধ্যে প্রাসঙ্গিক হতে দেখিনি।
isaacg

হ্যাঁ ... আমিও নয়: পি
বিটা ক্ষয়

13

> <>, 14310665 বাইট

জেনেসিসের জন্য হ্যামলেট + 13709267 এর জন্য 601398

এটি এখনও একটি কাজ চলছে এবং এটি সম্পূর্ণ করতে অনেক সময় নেয়।

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 ব্যবহার করে কাজ করছি, তবে এটি আরও কিছু জায়গা নিতে শুরু করেছে।
অ্যারন

18
ঠিক আছে, গল্পের প্রতিটি বলার সাথেই মাছ সাধারণত বেড়ে ওঠে;)
জিওবিটস

ঠিক আছে, এটি ভাষার একটি উজ্জ্বল পছন্দ: ডি
বিটা ডেকে

আপনার প্রোগ্রামটি অনুগ্রহের মানদণ্ডে খাপ খায় নি (পোস্ট করা উত্তরগুলির মধ্যে কোনওটিই করেনি), তাই আমি আপনাকে এটি প্রদান করেছি কারণ আপনি <> <ব্যবহার করেছেন I
বিটা ক্ষয়

8

জাভা, 14307140 বাইট

হ্যামলেট - 601,218

আদিপুস্তক - 13,705,922

একটি চরিত্র-> চরিত্রের মানচিত্র তৈরি করে এখানে ধারণাটি সমস্ত কাজ সামনের কাজটি করে। তারপরে আপনি কেবল সংক্ষিপ্ততম স্ট্রিংগুলি লুপ করে নিতে পারেন।

সংখ্যার জন্য কিছুটা ব্যতিক্রম করতে হবে, তাই আমি তাদের প্রধান লুপটিতে পরীক্ষা করি। এটি এখনও দ্রুত, যদিও এবং কয়েক সেকেন্ডের মধ্যে বৃহত্তর পরীক্ষার কেস পরিচালনা করে। আমি পারে একটি দম্পতি আরো বাইট জন্য এই বিভাগে খামচি পাবে, কিন্তু আমি করছি মোটামুটি নিশ্চিত এটা বন্ধ সর্বোত্তম আছে।

ইনপুটটি আর্গুমেন্ট হিসাবে একটি ফাইলের নাম। আউটপুট একটি ফাইলে লেখা হয় inputFilename_out.4, এবং অক্ষর গণনাটি STDOUT এ প্রেরণ করা হয়।

টাইব্রেকারের জন্য এটি সম্পূর্ণ 1740 বাইট u প্রয়োজনে আমি এটি প্রচুর গল্ফ করতে পারি, তবে এটি এখনও কিছুটা বড় হতে চলেছে।

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

}

আমি মনে করি এটি শীর্ষস্থানীয় শূন্যগুলির সাথে অঙ্কগুলির স্ট্রিং সঠিকভাবে পরিচালনা করে না। উদাহরণস্বরূপ, ইনপুটটিতে 01, আমি বিশ্বাস করি যে এটি আউটপুট 01o, যা সঠিক নয়।
isaacg

এছাড়াও, আমি মনে করি আপনি সঞ্চয়ের অপব্যবহার করছেন। ইন elseপ্রধান লুপ ধারা, আপনি সঁচায়ক প্রকৃত মান এবং পূর্ববর্তী অক্ষরে চরিত্র মান ব্যবহার মধ্যে বেছে নিন। দুটি ভিন্ন হলে আপনি পরবর্তী পছন্দ করতে পারবেন না, কারণ এর অর্থ আপনি oআগের সময়টি ব্যবহার করেছিলেন এবং সঞ্চয়ের ক্ষেত্রে আগের অক্ষরের মান থাকে না।
isaacg

ঠিক আছে, উভয় এখনই ঠিক করা উচিত। ধন্যবাদ!
Geobits

আমি যখন এটিকে আমার মেশিনে চালাই তখন আমি হ্যামলেটকে 625474 এবং জেনেসিসের জন্য 13705922 পাই।
ইসাকাক

@ আইস্যাক আপনি কি একই ফাইলটিতে চালিয়ে যাচ্ছেন (একই লাইনের সমাপ্তি সহ)? আমি আগে লাইন শেষের সাথে একটি সমস্যায় পড়েছিলাম। আমি যখন আমার এবং আপনার একই ফাইলে চালাই তখন তারা দুজনেই পোস্ট স্কোরগুলি দেখায়।
Geobits

2

পিএইচপি, 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 কোড + "একটি" প্রতীক = 4 অক্ষরের পরিবর্তে) আউটপুট দেওয়ার ছোট উপায় আছে কিনা তা পরীক্ষা করে দেখুন; স্পষ্টতই, এটি তুলনা / বৃদ্ধি / হ্রাসও চেষ্টা করে;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.