খ্যাতিতে ভাগ্যবান সংখ্যা পৌঁছেছে


21

একটি নতুন কোড-গল্ফার, জো সবেমাত্র সাইটে নিবন্ধিত। তার 1 টি খ্যাতি রয়েছে তবে খ্যাতিতে তাঁর সমস্ত ভাগ্যবান সংখ্যায় পৌঁছানোর জন্য দৃ determined় সংকল্পবদ্ধ। জো উচ্চতর শক্তির প্রতি বিশ্বাস রাখে যা তাকে তার ন্যূনতম পরিমাণ (তার বা অন্য) কর্মের মাধ্যমে তার লক্ষ্য অর্জনে সহায়তা করবে। নতুন ব্যবহারকারী হিসাবে তিনি বিশ্বাস করেন যে নেতিবাচক খ্যাতি সম্ভব।

আপনার এমন একটি প্রোগ্রাম বা ফাংশন লেখা উচিত যা জোকে তার কতগুলি কর্মের প্রত্যাশা করা উচিত তা গণনা করতে সহায়তা করে।

বিস্তারিত

  • ক্রিয়াকলাপগুলি নিম্নলিখিত পরিমাণগুলিতে খ্যাতি পরিবর্তন করতে পারে (স্ট্যাকেক্সচেঞ্জ বিধি নির্বিশেষে প্রতিটি পদক্ষেপে সমস্ত ক্রিয়া উপলব্ধ):

    answer accepted:     +15
    answer voted up:     +10
    question voted up:    +5
    accepts answer:       +2
    votes down an answer: −1
    question voted down:  −2
    
  • অন্যান্য বিশেষ খ্যাতি পরিবর্তন উপেক্ষা করা হয়।

  • ভাগ্যবান সংখ্যাগুলি নেতিবাচক হতে পারে এবং যে কোনও ক্রমে পৌঁছানো যায়।
  • আপনার সমাধানটি আমার কম্পিউটারে এক মিনিটের মধ্যে যে কোনও উদাহরণ পরীক্ষার কেস সমাধান করতে হবে (আমি কেবল নিকটবর্তী কেসগুলি পরীক্ষা করব I আমার নীচে গড় পিসি রয়েছে))।

ইনপুট

  • জো ভাষার ভাগ্যবান সংখ্যাগুলি আপনার ভাষার সাধারণ ফর্মের পূর্ণসংখ্যার তালিকা হিসাবে।

আউটপুট

  • একক পূর্ণসংখ্যার হিসাবে প্রয়োজনীয় ন্যূনতম ক্রিয়াগুলির সংখ্যা।
  • আউটপুট স্টাডাউটে মুদ্রিত হতে পারে বা পূর্ণসংখ্যা হিসাবে ফিরে আসতে পারে।

উদাহরণ

ইনপুট => আউটপুট (খ্যাতির রাজ্যের উদাহরণ)

1                     => 0  (1)
3 2 1                 => 2  (1 -> 3 -> 2)
2 10 50               => 7  (1 -> 3 -> 2 -> 12 -> 10 -> 25 -> 40 -> 50)
10 11 15              => 3  (1 -> 11 -> 10 -> 15)
42 -5                 => 7  (1 -> -1 -> -3 -> -5 -> 10 -> 25 -> 40 -> 42)
-10                   => 6  (1 -> -1 -> -3 -> -5 -> -7 -> -9 -> -10)
15 -65                => 39
7 2015 25 99          => 142
-99 576 42 1111 12345 => 885

এটি কোড-গল্ফ তাই সংক্ষিপ্ত এন্ট্রি জিততে পারে।

উত্তর:


1

সি # - 501 বাইট

551 -> 501 বাইট আপডেট করুন

namespace System.Linq{class A {static void Main(){var i = c(new int[]{10,11,15});Console.WriteLine(i);Console.ReadLine();}private static int c(int[] a){var o=a.OrderBy(x => x).ToArray();int d=1,count=0;for(var i=0;i<a.Length;i++){if(o[i]==d)i++;int c=o[i],b=o.Length>=i+2?o[i+1]-o[i]:3;if(b<=2){i++;c=o[i];}while(d!=c){if(d>c){var e=d-c;if(e>1)d-=2;else d-=1;}else if(c>d){var e=c-d+2;if(e>14)d+=15;else if(e>9)d+=10;else if(e>4)d+=5;else if(e>2)d+=2;}count++;}if(b<=2){d-=b;count++;}}return count;}}}

অবহেলিত কোড

namespace System.Linq {
    class Program {
        static void Main(){
            var i = CalculateNumbers(new int[]{10,11,15});
            Console.WriteLine(i);
            Console.ReadLine();
        }
        private static int CalculateNumbers(int[] numbers){
            var ordered = numbers.OrderBy(x => x).ToArray();
            int cur = 1, count = 0;
            for (var i = 0; i < numbers.Length; i++){
                if (ordered[i] == cur) i++;
                int val = ordered[i], next = ordered.Length >= i+2 ? ordered[i + 1] - ordered[i] : 3;
                if (next <= 2){
                    i++;
                    val = ordered[i];
                }
                while (cur != val){
                    if (cur > val){
                        var dif = cur - val;
                        if (dif > 1)
                            cur -= 2;
                        else
                            cur -= 1;
                    } else if (val > cur){
                        var dif = val - cur + 2;
                        if (dif > 14)
                            cur += 15;
                        else if (dif > 9)
                            cur += 10;
                        else if (dif > 4)
                            cur += 5;
                        else if (dif > 2)
                            cur += 2;
                    }
                    count++;
                }
                if (next <= 2){
                    cur -= next;
                    count++;
                }
            }
            return count;
        }
    }
}

16

মরিচা, 929 923 টি অক্ষর

use std::io;use std::str::FromStr;static C:&'static [i32]=&[-2,-1,2,5,10,15];fn main(){let mut z=String::new();io::stdin().read_line(&mut z).unwrap();let n=(&z.trim()[..]).split(' ').map(|e|i32::from_str(e).unwrap()).collect::<Vec<i32>>();let l=*n.iter().min().unwrap();let x=n.iter().max().unwrap()-if l>1{1}else{l};let s=g(x as usize);println!("{}",p(1,n,&s));}fn g(x:usize)->Vec<i32>{let mut s=vec![std::i32::MAX-9;x];for c in C{if *c>0&&(*c as usize)<=x{s[(*c-1)as usize]=1;}}let mut i=1us;while i<x{let mut k=i+1;for c in C{if(i as i32)+*c<0{continue;}let j=((i as i32)+*c)as usize;if j<x&&s[j]>s[i]+1{s[j]=s[i]+1;if k>j{k=j;}}}i=k;}s}fn p(r:i32,n:Vec<i32>,s:&Vec<i32>)->i32{if n.len()==1{h(r,n[0],&s)}else{(0..n.len()).map(|i|{let mut m=n.clone();let q=m.remove(i);p(q,m,&s)+h(r,q,&s)}).min().unwrap()}}fn h(a:i32,b:i32,s:&Vec<i32>)->i32{if a==b{0}else if a>b{((a-b)as f32/2f32).ceil()as i32}else{s[(b-a-1)as usize]}}

এই মজা ছিল!


বাস্তবায়ন সম্পর্কে মন্তব্য

সুতরাং আমি আকারের সাথে খুব বেশি খুশি নই। তবে জং যেভাবেই হোক গল্ফ করাতে একেবারে ভয়ানক। অভিনয়টি অবশ্য দুর্দান্ত।

কোড প্রতিটি পরীক্ষার কেসগুলি প্রায় নিকটবর্তী-তাত্ক্ষণিক পরিমাণে সঠিকভাবে সমাধান করে, সুতরাং কার্য সম্পাদন অবশ্যই কোনও সমস্যা নয়। মজাদার জন্য, এখানে আরও অনেক কঠিন পরীক্ষার কেস:

1234567 123456 12345 1234 123 777777 77777 7777 777

যার জন্য উত্তরটি হল 82317, যা আমার প্রোগ্রামটি আমার (মাঝারি-পারফরম্যান্স) ল্যাপটপে ১.6666 সেকেন্ডে (!) সমাধান করতে সক্ষম হয়েছিল , এমনকি পুনরাবৃত্তির জের-বল-হ্যামিলটোনিয়ান পাথ অ্যালগরিদম দিয়েও।

পর্যবেক্ষণ

  • প্রথমে আমাদের একটি পরিবর্তিত ওজনযুক্ত গ্রাফ তৈরি করা উচিত, যার সাথে নোডগুলি প্রতিটি "ভাগ্যবান" নম্বর এবং ওজনগুলি এক খ্যাতি স্তর থেকে অন্য খ্যাতি স্তর থেকে পেতে আরও কত পরিবর্তন নেয় with নোডের প্রতিটি জোড়া অবশ্যই দুটি প্রান্ত দ্বারা সংযুক্ত থাকতে হবে , যেহেতু উপরে যাওয়া সুনামের মানকে নীচে নামার মতো নয় (উদাহরণস্বরূপ আপনি +10 পেতে পারেন তবে -10 নয়)।

  • এখন আমাদের কীভাবে এক প্রতি মূল্য থেকে অন্য সংখ্যার পরিবর্তনের নূন্যতম পরিমাণটি খুঁজে বের করতে হবে তা নির্ধারণ করতে হবে।

    • উচ্চতর মান থেকে নিম্ন মানের দিকে যাওয়ার জন্য এটি সহজ: উচ্চতর মানটি ceil((a - b) / 2)কোথায় aএবং bকেবল এটিই নিম্ন মানের। আমাদের একমাত্র যৌক্তিক বিকল্পটি হ'ল যথাসম্ভব -2 ব্যবহার করা এবং তারপরে প্রয়োজনে একবার -1 ব্যবহার করা।

    • সর্বনিম্ন সম্ভাব্য মানটি সর্বদা অনুকূল নয় (উদাহরণস্বরূপ 0 থেকে 9 এর জন্য, সর্বোত্তম সমাধানটি +10 -1) একটি নিম্ন থেকে উচ্চ মানের থেকে কিছুটা জটিল। তবে এটি একটি পাঠ্যপুস্তকের গতিশীল প্রোগ্রামিং সমস্যা এবং এটি সমাধান করার জন্য সাধারণ ডিপিই যথেষ্ট।

  • একবার আমরা প্রতিটি সংখ্যা থেকে প্রতিটি অন্যান্য সংখ্যায় ন্যূনতম পরিবর্তনগুলি গণনা করি, আমরা মূলত টিএসপিটির একটি সামান্য বৈকল্পিক (ভ্রমণকারী বিক্রয় সমস্যা) রেখে চলেছি। ভাগ্যক্রমে, খুব কম নোড রয়েছে (সবচেয়ে কঠিন পরীক্ষার ক্ষেত্রে সর্বাধিক 5) এই পদক্ষেপের জন্য ব্রুট ফোর্স যথেষ্ট।

অবহেলিত কোড (তীব্র মন্তব্য করা হয়েছে)

use std::io;
use std::str::FromStr;

// all possible rep changes
static CHANGES: &'static [i32] = &[-2, -1, 2, 5, 10, 15];

fn main() {
    // read line of input, convert to i32 vec
    let mut input = String::new();
    io::stdin().read_line(&mut input).unwrap();
    let nums = (&input.trim()[..]).split(' ').map(|x| i32::from_str(x).unwrap())
        .collect::<Vec<i32>>();

    // we only need to generate as many additive solutions as max(nums) - min(nums)
    // but if one of our targets isn't 1, this will return a too-low value.
    // fortunately, this is easy to fix as a little hack
    let min = *nums.iter().min().unwrap();
    let count = nums.iter().max().unwrap() - if min > 1 { 1 } else { min };
    let solutions = generate_solutions(count as usize);

    // bruteforce!
    println!("{}", shortest_path(1, nums, &solutions));
}

fn generate_solutions(count: usize) -> Vec<i32> {
    let mut solutions = vec![std::i32::MAX - 9; count];

    // base cases
    for c in CHANGES {
        if *c > 0 && (*c as usize) <= count {
            solutions[(*c-1) as usize] = 1;
        }
    }

    // dynamic programming! \o/
    // ok so here's how the algorithm works.
    // we go through the array from start to finish, and update the array
    //   elements at i-2, i-1, i+2, i+5, ... if solutions[i]+1 is less than
    //   (the corresponding index to update)'s current value
    // however, note that we might also have to update a value at a lower index
    //   than i (-2 and -1)
    // in that case, we will have to go back that many spaces so we can be sure
    //   to update *everything*.
    // so for simplicity, we just set the new index to be the lowest changed
    //   value (and increment it if there were none changed).
    let mut i = 1us;  // (the minimum positive value in CHANGES) - 1 (ugly hardcoding)
    while i < count {
        let mut i2 = i+1;
        // update all rep-values reachable in 1 "change" from this rep-value,
        //   by setting them to (this value + 1), IF AND ONLY IF the current
        //   value is less optimal than the new value
        for c in CHANGES {
            if (i as i32) + *c < 0 { continue; }  // negative index = bad
            let idx = ((i as i32) + *c) as usize;  // the index to update
            if idx < count && solutions[idx] > solutions[i]+1 {
                // it's a better solution! :D
                solutions[idx] = solutions[i]+1;
                // if the index from which we'll start updating next is too low,
                //   we need to make sure the thing we just updated is going to,
                //   in turn, update other things from itself (tl;dr: DP)
                if i2 > idx { i2 = idx; }
            }
        }
        i = i2;  // update index (note that i2 is i+1 by default)
    }

    solutions
}

fn shortest_path(rep: i32, nums: Vec<i32>, solutions: &Vec<i32>) -> i32 {
    // mercifully, all the test cases are small enough so as to not require
    //   a full-blown optimized traveling salesman implementation
    // recursive brute force ftw! \o/
    if nums.len() == 1 { count_changes(rep, nums[0], &solutions) }  // base case
    else {
        // try going from 'rep' to each item in 'nums'
        (0..nums.len()).map(|i| {
            // grab the new rep value out of the vec...
            let mut nums2 = nums.clone();
            let new_rep = nums2.remove(i);
            // and map it to the shortest path if we use that value as our next target
            shortest_path(new_rep, nums2, &solutions) + count_changes(rep, new_rep, &solutions)
        }).min().unwrap()  // return the minimum-length path
    }
}

fn count_changes(start: i32, finish: i32, solutions: &Vec<i32>) -> i32 {
    // count the number of changes required to get from 'start' rep to 'finish' rep
    // obvious:
    if start == finish { 0 }
    // fairly intuitive (2f32 is just 2.0):
    else if start > finish { ((start - finish) as f32 / 2f32).ceil() as i32 }
    // use the pregenerated lookup table for these:
    else /* if finish > start */ { solutions[(finish - start - 1) as usize] }
}

1
দুর্দান্ত উত্তর! আমি মরচে আগ্রহী এবং ব্যাখ্যাটি আসলে শেখার জন্য খুব সহায়ক। এবং ঠিক শীর্ষ হিসাবে, আপনি সিনট্যাক্স হাইলাইট করে পেতে পারেন <!-- language-all: lang-rust -->। ;)
অ্যালেক্স এ।

আমি একটি সমাধানে কাজ করছি, এবং দেখেছি যে কম থেকে উচ্চ ওজনে ন্যূনতম পরিমাণের পরিবর্তনগুলি খুব সহজেই সি (সি) এর মতো সিউডো কোডের মতো খুব ছোট লুক-টেবিল ব্যবহার করে ও (1) এ গণনা করা যায় floor((a-b)/15)+{0,2,1,2,2,1,3,2,2,2,1,3,2,2,2}[(a-b)%15]। আপনার সমাধান সম্ভবত এটি থেকে উপকৃত হতে পারে।
Fors

2

পাইথ - 43 42 বাইট

সমস্ত ক্রিয়াকলাপ এবং সংমিশ্রণগুলির সাথে সম্পূর্ণরূপে নিষ্ঠুর বলের পদ্ধতির ব্যবহার করে। আরও গল্ফ খুঁজছেন না কারণ পাইথ অনুবাদ করবেন। অনুবাদিত।

K5tf.Em.Am}kmhs<dbUdQsm.pk.C[15yKK2_1_2)TZ

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

এটি এখানে অনলাইনে চেষ্টা করে দেখুন

from itertools import*
Q,Z=eval(input()),0
while True:
    if any(map(lambda d:all(map(lambda k:k in map(lambda b:sum(d[:b])+1,range(len(d))),Q)),chain.from_iterable(map(lambda k:permutations(k),combinations_with_replacement([15,10,5,2,-1,-2],Z))))):
        print(Z-1)
        break
    Z+=1

ছোটগুলিতে কাজ করে, বড়গুলিতে এটি শেষ হতে দেয় না।


কোডটি সঠিকভাবে পড়েননি তবে আপনি কি 10 দ্বারা প্রতিস্থাপন করতে পারেন, বলুন, y5হোয়াইটস্পেসে সংরক্ষণ করতে?
Sp3000

@ Sp3000 এটি হোয়াইটস্পেস বাঁচাতে পারে তবে সামগ্রিকভাবে কোনও চরিত্র নয়। তবে আমি মনে করি সংরক্ষণ করে তালিকাটি সংকুচিত করে একটি চর সংরক্ষণ করতে পারিK=5
মালটিসেন

নোট করুন যে এই উত্তরটি "আপনার সমাধানটি এক মিনিটের মধ্যে কোনও উদাহরণ পরীক্ষার ক্ষেত্রে সমাধান করতে হবে" হিসাবে নিয়মগুলি অনুসরণ করে না। (বিশদ বিভাগে
উদ্ধৃতিটি

0

সি ++ - 863 বাইটস, অবরুদ্ধ

এটি মোটামুটি দ্রুত চালিত হয়, মরিচটিতে লিখিত সমাধান হিসাবে একই বলপার্কে (অপ্টিমাইজেশন চালু করার সাথে প্রায় 6 বার দ্রুত হিসাবে চালিত হয়)। আমি এই সন্ধ্যার পরে (সুইডেনে সন্ধ্যায়, অর্থাৎ) গল্ফ করব।

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

const int lookup[] = {0, 2, 1, 2, 2, 1, 3, 2, 2, 2, 1, 3, 2, 2, 2};

int distance(int start, int end) {
    return start > end
        ? (start - end + 1) / 2
        : (end - start) / 15 + lookup[(end - start) % 15];
}

int walk(int current, std::vector<int> points) {
    int min = 0;

    if (points.size() == 0) return 0;

    for (int i = 0; i < points.size(); i++) {
        std::vector<int> new_points = points;
        new_points.erase(new_points.begin() + i);

        int d = distance(current, points[i]) + walk(points[i], new_points);

        min = min && min < d ? min : d;
    }

    return min;
}

int main() {
    std::vector<int> points;

    std::string line;
    std::getline(std::cin, line);

    std::stringstream ss(line);
    int i;

    while (ss >> i)
        points.push_back(i);

    std::cout << walk(1, points) << std::endl;

    return 0;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.