কার্য
সর্বাধিক নির্ভুলতার সাথে প্রশিক্ষণের নমুনাগুলির উপর ভিত্তি করে নূন্যতম বাইটস উত্স বা বাইনারি কোডে একটি ভয়েস নমুনার স্বীকৃতি দেয় (আমি "হ্যাঁ", "হ্যাঁ" বা "না" বলেছি) ।
প্রোগ্রাম পড়া উচিত train/yes0.wav
, train/no0.wav
, train/yes1.wav
ইত্যাদি (সেখানে 400 yeses ও প্রশিক্ষণ ডেটাসেটে 400 প্রস্তাবের বিরূদ্ধে ভোট হয়), তারপর পড়া শুরু inputs/0.wav
, inputs/1.wav
যতক্ষণ না এটি ফাইল খুঁজতে, এটা বিশ্লেষণ এবং outputting "হ্যাঁ" অথবা "না" (অথবা অন্যান্য জন্য শব্দ ব্যর্থ মধ্যবর্তী উত্তর)।
আপনি যদি চান, আপনি পড়ার পরিবর্তে প্রোগ্রামটিকে প্রাক প্রশিক্ষণ দিতে পারেন train/
, তবে ফলাফলের টেবিলটি স্কোরের দিকে গন্য হবে (এবং প্রশিক্ষণের নমুনাগুলিতে অতিমাত্রায় সাবধান থাকুন - তারা পরীক্ষার সাথে ওভারল্যাপ করে না)। এক্ষেত্রে সংযোজন হিসাবে ডেটা টেবিল উত্পাদন করতে ব্যবহৃত প্রোগ্রামটি অন্তর্ভুক্ত করা ভাল।
সমস্ত নমুনা ফাইল হ'ল ফিল্টারিং / শব্দ হ্রাস ছাড়াই, ল্যাপটপ মাইক থেকে 16-বিট স্টেরিও ডাব্লুএইভি ফাইলগুলি সামান্য এন্ডিয়ান are
সীমা
নিষিদ্ধ বৈশিষ্ট্য:
- নেটওয়ার্ক ব্যবহার;
- উত্তর ফাইলে পৌঁছানোর চেষ্টা করা
inputs/key
; runner
নির্ভুলতার গণনা করে এমন প্রোগ্রামটি সাবভার্ট করা ;- বিদ্যমান স্বীকৃতি লাইব্রেরি ব্যবহার করে। এফএফটি বাস্তবায়নের সাথে সংযোগ স্থাপনের অনুমতি নেই: ধ্রুব পরিমাণ তথ্যের (যেমন
sin
বাatan2
) গ্রহণকারী কেবলমাত্র বাহ্যিক গণিত ক্রিয়াকলাপ অনুমোদিত; আপনি যদি এফএফটি চান, কেবল এটি আপনার প্রোগ্রামের সোর্স কোডে প্রয়োগ করুন (এটি প্রয়োজনে বহুভাষিক হতে পারে)।
সংস্থান সীমা:
- প্রোগ্রামটি আমার আই 5 ল্যাপটপে 30 মিনিটের বেশি সিপিইউ সময় নেবে না। যদি এটি আরও বেশি নেয় তবে কেবলমাত্র 30 মিনিটের মধ্যে উত্পাদিত আউটপুট গণনা করা হয় এবং অন্য কিছুকে অর্ধেক ম্যাচ ধরে নেওয়া হয়;
- স্মৃতি সীমা: 1 জিবি (কোনও অস্থায়ী ফাইল সহ);
সরঞ্জামসমূহ
tools/runner
প্রোগ্রাম স্বয়ংক্রিয়ভাবে আপনার সমাধান রান এবং নির্ভুলতার হিসাব করে।
$ tools/runner solutions/example train train/key
Accuracy: 548 ‰
এটি প্রশিক্ষণের ডেটা ব্যবহার করে বা প্রকৃত পরীক্ষার ডেটা ব্যবহার করে প্রোগ্রামটি পরীক্ষা করতে পারে। আমি পরীক্ষার ডেটাসেটে জমা দেওয়া উত্তরগুলি চেষ্টা করতে যাচ্ছি এবং ফলাফল প্রকাশ করতে (নির্ভুলতা শতাংশ) না হওয়া পর্যন্ত আমি ডেটাसेटকে সর্বজনীন না করি।
স্কোরিং
নির্ভুলতার উপর নির্ভর করে সমাধানের 5 টি শ্রেণি রয়েছে:
- সমস্ত নমুনা সঠিকভাবে অনুমান করা হয়েছে: ক্লাস 0;
- নির্ভুলতা 950-999: ক্লাস 1;
- যথার্থতা 835-950: ক্লাস 2;
- যথার্থতা 720-834: ক্লাস 3;
- নির্ভুলতা 615-719: ক্লাস 4;
প্রতিটি শ্রেণীর অভ্যন্তরে, স্কোরটি হল সমাধানগুলির দ্বারা নেওয়া বাইটের সংখ্যা।
গৃহীত উত্তর: সেরা Nompty ক্লাসে ক্ষুদ্রতম সমাধান।
লিংক
- সরঞ্জাম সহ গিথুব প্রকল্প: https://github.com/vi/codegolf-jein
- প্রশিক্ষণ ডেটাসেট: http://vi-server.org/pub/codegolf-jein-train.tar.xz
- পরীক্ষার ডেটাসেটটি এতক্ষণ ব্যক্তিগত রাখা হয়েছে, গিথুব সংগ্রহস্থলে চেকসাম (এইচএমএসি) উপলব্ধ রয়েছে।
সমস্ত নমুনা সিসি -0 (পাবলিক ডোমেন) হিসাবে বিবেচনা করা উচিত, স্ক্রিপ্ট এবং প্রোগ্রামগুলি এমআইটি হিসাবে বিবেচনা করা উচিত।
উদাহরণ সমাধান
এটি স্বীকৃতির খুব নিম্নমানের সরবরাহ করে, কেবল ফাইল এবং আউটপুট উত্তর কীভাবে পড়তে হয় তা দেখায়
#define _BSD_SOURCE
#include <stdio.h>
#include <assert.h>
#include <endian.h>
#define Nvols 30
#define BASS_WINDOW 60
#define MID_WINDOW 4
struct training_info {
double bass_volumes[Nvols];
double mid_volumes[Nvols];
double treble_volumes[Nvols];
int n;
};
struct training_info yes;
struct training_info no;
static int __attribute__((const)) mod(int n, int d) {
int m = n % d;
if (m < 0) m+=d;
return m;
}
// harccoded to 2 channel s16le
int get_file_info(const char* name, struct training_info *inf) {
FILE* in = fopen(name, "rb");
if (!in) return -1;
setvbuf(in, NULL, _IOFBF, 65536);
inf->n = 1;
fseek(in, 0, SEEK_END);
long filesize = ftell(in);
fseek(in, 128, SEEK_SET);
filesize -= 128; // exclude header and some initial samples
int nsamples = filesize / 4;
double bass_a=0, mid_a=0;
const int HISTSIZE = 101;
double xhistory[HISTSIZE];
int histpointer=0;
int histsize = 0;
//FILE* out = fopen("debug.raw", "wb");
int i;
for (i=0; i<Nvols; ++i) {
int j;
double total_vol = 0;
double bass_vol = 0;
double mid_vol = 0;
double treble_vol = 0;
for (j=0; j<nsamples / Nvols; ++j) {
signed short int l, r; // a sample
if(fread(&l, 2, 1, in)!=1) break;
if(fread(&r, 2, 1, in)!=1) break;
double x = 1/65536.0 * ( le16toh(l) + le16toh(r) );
bass_a += x;
mid_a += x;
if (histsize == HISTSIZE-1) bass_a -= xhistory[mod(histpointer-BASS_WINDOW,HISTSIZE)];
if (histsize == HISTSIZE-1) mid_a -= xhistory[mod(histpointer-MID_WINDOW ,HISTSIZE)];
double bass = bass_a / BASS_WINDOW;
double mid = mid_a / MID_WINDOW - bass;
double treble = x - mid_a/MID_WINDOW;
xhistory[histpointer++] = x;
if(histpointer>=HISTSIZE) histpointer=0;
if(histsize < HISTSIZE-1) ++histsize;
total_vol += bass*bass + mid*mid + treble*treble;
bass_vol += bass*bass;
mid_vol += mid*mid;
treble_vol += treble*treble;
/*
signed short int y;
y = 65536 * bass;
y = htole16(y);
fwrite(&y, 2, 1, out);
fwrite(&y, 2, 1, out);
*/
}
inf->bass_volumes[i] = bass_vol / total_vol;
inf->mid_volumes[i] = mid_vol / total_vol;
inf->treble_volumes[i] = treble_vol / total_vol;
//fprintf(stderr, "%lf %lf %lf %s\n", inf->bass_volumes[i], inf->mid_volumes[i], inf->treble_volumes[i], name);
}
fclose(in);
return 0;
}
static void zerotrdata(struct training_info *inf) {
int i;
inf->n = 0;
for (i=0; i<Nvols; ++i) {
inf->bass_volumes[i] = 0;
inf->mid_volumes[i] = 0;
inf->treble_volumes[i] = 0;
}
}
static void train1(const char* prefix, struct training_info *inf)
{
char buf[50];
int i;
for(i=0;; ++i) {
sprintf(buf, "%s%d.wav", prefix, i);
struct training_info ti;
if(get_file_info(buf, &ti)) break;
++inf->n;
int j;
for (j=0; j<Nvols; ++j) {
inf->bass_volumes[j] += ti.bass_volumes[j];
inf->mid_volumes[j] += ti.mid_volumes[j];
inf->treble_volumes[j] += ti.treble_volumes[j];
}
}
int j;
for (j=0; j<Nvols; ++j) {
inf->bass_volumes[j] /= inf->n;
inf->mid_volumes[j] /= inf->n;
inf->treble_volumes[j] /= inf->n;
}
}
static void print_part(struct training_info *inf, FILE* f) {
fprintf(f, "%d\n", inf->n);
int j;
for (j=0; j<Nvols; ++j) {
fprintf(f, "%lf %lf %lf\n", inf->bass_volumes[j], inf->mid_volumes[j], inf->treble_volumes[j]);
}
}
static void train() {
zerotrdata(&yes);
zerotrdata(&no);
fprintf(stderr, "Training...\n");
train1("train/yes", &yes);
train1("train/no", &no);
fprintf(stderr, "Training completed.\n");
//print_part(&yes, stderr);
//print_part(&no, stderr);
int j;
for (j=0; j<Nvols; ++j) {
if (yes.bass_volumes[j] > no.bass_volumes[j]) { yes.bass_volumes[j] = 1; no.bass_volumes[j] = 0; }
if (yes.mid_volumes[j] > no.mid_volumes[j]) { yes.mid_volumes[j] = 1; no.mid_volumes[j] = 0; }
if (yes.treble_volumes[j] > no.treble_volumes[j]) { yes.treble_volumes[j] = 1; no.treble_volumes[j] = 0; }
}
}
double delta(struct training_info *t1, struct training_info *t2) {
int j;
double d = 0;
for (j=0; j<Nvols; ++j) {
double rb = t1->bass_volumes[j] - t2->bass_volumes[j];
double rm = t1->mid_volumes[j] - t2->mid_volumes[j];
double rt = t1->treble_volumes[j] - t2->treble_volumes[j];
d += rb*rb + rm*rm + rt*rt;
}
return d;
}
int main(int argc, char* argv[])
{
(void)argc; (void)argv;
train();
int i;
int yes_count = 0;
int no_count = 0;
for (i=0;; ++i) {
char buf[60];
sprintf(buf, "inputs/%d.wav", i);
struct training_info ti;
if(get_file_info(buf, &ti)) break;
double dyes = delta(&yes, &ti);
double dno = delta(&no, &ti);
//printf("%lf %lf %s ", dyes, dno, buf);
if (dyes > dno) {
printf("no\n");
++no_count;
} else {
printf("yes\n");
++yes_count;
}
}
fprintf(stderr, "yeses: %d noes: %d\n", yes_count, no_count);
}
sum
, বা আমাদের ব্যবহারের প্রয়োজন foldl (+) 0
(ভাঁজগুলি গণিত-নির্দিষ্ট নয়, এবং +
বৈচিত্র্যময় নয়)?
sum
। আমার ধারণা এটা আপনার উদ্দেশ্য নয়?