আরজিবি থেকে এক্সটার্ম কালার কনভার্টারে


13

256-রঙের এক্সটার্ম-সামঞ্জস্যপূর্ণ টার্মিনালগুলি সাধারণ 16 সিস্টেমের রঙের উপরে 240 রঙ যুক্ত করে। 16-231 রঙগুলি লাল, সবুজ এবং নীল রঙের 6 টি স্তরের (0, 95, 135, 175, 215, 255), অভিধানিকৃতভাবে অর্ডার করেছে। 232-255 রঙগুলি ধূসর মাত্র 24 স্তরের (8 ... 238 10 স)। আমি যা বলছি তার আরও ভাল ধারণা পেতে, এই টেবিলটি দেখুন

চ্যালেঞ্জ

আপনার লক্ষ্যটি এমন একটি প্রোগ্রাম বা ফাংশন তৈরি করা যা ইনপুট, আরজিবি মান হিসাবে গ্রহণ করে এবং সেই আরজিবি মানের সাথে নিকটতম এক্সটার্ম রঙের সাথে সংখ্যার আউটপুট দেয়। যেহেতু 16 সিস্টেমের রঙগুলি (রঙ 0-15) প্রায়শই কাস্টমাইজযোগ্য হয়, আপনি তাদের এই রূপান্তর থেকে বাদ দিবেন।

"নিকটতম" রঙটি আরও ভালভাবে সংজ্ঞায়িত করতে ম্যানহাটনের দূরত্বটি লাল, সবুজ এবং নীল উপাদানগুলি সহ ব্যবহার করুন । উদাহরণস্বরূপ, rgb(10, 180, 90)20 টি ইউনিট দূরে rgb(0, 175, 95)(রঙ 35) কারণ abs(10 - 0) + abs(180 - 175) + abs(90 - 95) == 20। যদি ইনপুট রঙটি দুই বা ততোধিক এক্সটার্ম রঙের মধ্যে সমান হয় তবে সর্বাধিক সূচকের সাহায্যে এক্সটার্ম রঙটি আউটপুট করুন।

উদাহরণ

 R   G   B     Xterm
  0   0   0 ==> 16
 95 135   0 ==> 64
255 255 255 ==> 231
238 238 238 ==> 255

 90 133 140 ==> 66
218 215 216 ==> 188
175 177 178 ==> 249

175   0 155 ==> 127
 75  75  75 ==> 239
 23  23  23 ==> 234
115 155 235 ==> 111

বিধি

  • স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ
  • আপনার প্রোগ্রাম বা ফাংশনটি যে কোনও যুক্তিসঙ্গত বিন্যাসে rgb মান গ্রহণের অনুমতি দেয়, সহ:
    • লাল, সবুজ এবং নীল রঙের জন্য পৃথক যুক্তি
    • একটি তালিকা, tuple, অভিধান, বা অনুরূপ
    • ডিলিমিটার-বিচ্ছিন্ন স্ট্রিং বা স্টিডিন
    • হেক্স রঙ (যেমন #ff8000)
  • আপনি ধরে নিতে পারেন যে সমস্ত r, g, এবং b, মানগুলি 0 এবং 255 এর মধ্যে পূর্ণসংখ্যা হবে।
  • যেহেতু 16 সিস্টেমের রঙ ম্যাপিং থেকে বাদ দেওয়া উচিত, সমস্ত আউটপুট 16 ... 255 এর মধ্যে হওয়া উচিত।

এটি , তাই সংক্ষিপ্ততম কোড জিততে পারে।

উত্তর:


4

হাস্কেল , 132 বাইট

v=0:[95,135..255]
f c=snd$maximum[(-sum(abs<$>zipWith(-)c x),i)|(i,x)<-zip[16..]$[[r,g,b]|r<-v,g<-v,b<-v]++[[g,g,g]|g<-[8,18..238]]]

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

পূর্ণসংখ্যার একটি তালিকা হিসাবে ইনপুট নেয় [red, green, blue]

মোটামুটি সরল বাস্তবায়ন। প্রথমে আমি এক্সটার্ম রঙগুলির একটি তালিকা তৈরি করি যা আমরা দুটি তালিকার একসাথে বোঝার জন্য ব্যবহার করছি। এর মধ্যে প্রথমটি ট্রিপল পুনরাবৃত্তির মাধ্যমে 16-231 রঙগুলিকে হ্যান্ডেল করে vযার উপরে সেই রঙগুলি ব্যবহার করা মান রয়েছে। দ্বিতীয়টি ধূসর মানগুলির উপরে পুনরাবৃত্তি করে এবং সেগুলি তিনটি স্লটে রেখে দেয়। তারপরে আমি এটিকে জিপ দিয়ে সূচিত করব (16 এ শুরু) এবং ম্যানহাটনের দূরত্ব (অবহেলিত) এবং সেই সূচির সাথে একটি জুটি তৈরি করে সর্বোচ্চটি নিয়েছি। আমি সর্বাধিক ব্যবহার করেছি কারণ আমরা বৃহত্তম সূচকে টাই-ব্রেকিং করি এবং এইভাবে আমাকে একটি অতিরিক্ত সঞ্চয় করে -


3

রুবি , 280 180 166 164 155 বাইট

->c{d=0,95,135,175,215,255
a=(0..239).map{|n|n<216?[d[n/36],d[(n%36)/6],d[n%6]]:[n*10-2152]*3}.map{|t|t.zip(c).map{|a,b|(a-b).abs}.sum}
a.rindex(a.min)+16}

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

পূর্ণসংখ্যার অ্যারের হিসাবে ইনপুট রঙ গ্রহণ করা একটি ল্যাম্বদা।

আমার প্রত্যাশার চেয়ে এক্সটার্ম রঙ উত্পন্ন করতে আমার আরও সমস্যা হয়েছিল! আমি সেই অঞ্চলে বিব্রতকরভাবে মার্জিত হয়ে উঠতে প্রস্তুত । আমি বেস রূপান্তরকে একধরণের সংকোচনের হিসাবে ব্যবহার করেছি, তবে রুবিতে আমি কেবল এটি করতে জানি কেবলInteger#to_s এটিই কিছুটা বিশ্রী।

-100 বাইট: সমস্যাটি আরও মনোযোগ সহকারে পড়ুন এবং 16 সিস্টেমের রঙগুলি উপেক্ষা করুন ^ _ ^;

-14 বাইট: পরিবর্তে হ্যান্ড বেস রূপান্তর ব্যবহার করুন .to_s(6)

-2 বাইট: অ্যারে ঘোষণা করার সময় বর্গাকার বন্ধনী ছেড়ে যান

-9 বাইট: শুধুমাত্র একটি দিয়ে এক্সটারম রঙের তালিকা তৈরি করুন map; এটি আরও একটি চিহ্ন এবং প্যারেনের একটি জুড়ি সংরক্ষণ করে।

->c{
  d=0,95,135,175,215,255                 # d is the set of possible RGB values
  a=(0..239).map{|n|                     # Create the array of Xterm triplets
    n<216 ? [d[n/36],d[(n%36)/6],d[n%6]] # Convert x from base 6 to base d, or
          : [n*10-2152]*3                #   create a uniform triplet
  }.map{|t|
    t.zip(c).map{|a,b|(a-b).abs}.sum     # Map from triplets to Manhattan distance
  }
  a.rindex(a.min) +                      # Find the last index of the lowest distance
  16                                     # Offset for the exluded system colors
}

1
বিটিডাব্লু, আপনার 16 সিস্টেমের রঙে মানচিত্রের দরকার নেই। বর্ণনায় আমার আরও পরিষ্কার হওয়া উচিত।
গরুর মাংস 16

ওহ, এটি আমাকে কিছুটা সাহায্য করবে! আমি আসল প্রশ্নবাক্যটিতে অবশ্যই তা মিস করেছি।
বেনজ 2240

1

কোটলিন , 299 290 267 265 বাইট

(16..255).associate{it to if(it<232)(it-16).let{i->listOf(0,95,135,175,215,255).let{l->listOf(l[i/36],l[(i/6)%6],l[i%6])}}else(8..238 step 10).toList()[it-232].let{listOf(it,it,it)}}.minBy{(k,v)->(it.zip(v).map{(a,b)->kotlin.math.abs(a-b)}.sum()*256)+(256-k)}!!.key

শোভিত

(16..255).associate {
    it to if (it < 232) (it - 16).let { i ->
            listOf(0, 95, 135, 175, 215, 255).let { l ->
                listOf(
                        l[i / 36],
                        l[(i / 6) % 6],
                        l[i % 6])
            }
        } else (8..238 step 10).toList()[it - 232].let { listOf(it, it, it) }
}.minBy { (k, v) ->
    (it.zip(v).map { (a, b) -> kotlin.math.abs(a - b) }.sum() * 256) + (256 - k)
}!!.key

পরীক্ষা

data class Test(val r: Int, val g: Int, val b: Int, val out: Int)

val test = listOf(
        Test(0, 0, 0, 16),
        Test(95, 135, 0, 64),
        Test(255, 255, 255, 231),
        Test(238, 238, 238, 255),

        Test(90, 133, 140, 66),
        Test(218, 215, 216, 188),
        Test(175, 177, 178, 249),

        Test(175, 0, 155, 127),
        Test(75, 75, 75, 239),
        Test(23, 23, 23, 234),
        Test(115, 155, 235, 111)
)
fun z(it:List<Int>): Int =
(16..255).associate{it to if(it<232)(it-16).let{i->listOf(0,95,135,175,215,255).let{l->listOf(l[i/36],l[(i/6)%6],l[i%6])}}else(8..238 step 10).toList()[it-232].let{listOf(it,it,it)}}.minBy{(k,v)->(it.zip(v).map{(a,b)->kotlin.math.abs(a-b)}.sum()*256)+(256-k)}!!.key

fun main(args: Array<String>) {
    for (i in test) {
        val r = z(listOf(i.r, i.g, i.b))
        println("$i ${i.out} ==> $r")
    }
}

Tio

TryItOnline


1

ব্যাচ, 266 বাইট

@set/ax=15,m=999
@set s=for %%b in (0 95 135 175 215 255)do @
@%s:b=r%%s:b=g%%s%call:c %* %%r %%g %%b
@for /l %%g in (8,10,238)do @call:c %* %%g %%g %%g
@echo %n%
:c
@set/ax+=1,r=%4-%1,g=%5-%2,b=%6-%3
@set/ad=%r:-=%+%g:-=%+%b:-=%
@if %d% leq %m% set/an=x,m=d


1

সি (জিসিসি), 202 192 157 150 (141 বাগড) 138 134 বাইট

l,m,t,i;a(c,x){x=abs(c-=i>215?i*10-2152:x*40+!!x*55);}f(r,g,b){for(i=l=240;i--;t=a(r,i/36)+a(g,i/6%6)+a(b,i%6),t<l?l=t,m=i:1);i=m+16;}

ধন্যবাদ @ সেলিংক্যাট

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


1
সমস্যাগুলি পরীক্ষাগুলির দ্বারা সংজ্ঞায়িত করা হয়নি (যা স্পষ্টভাবে উদাহরণ হিসাবে লেবেলযুক্ত), সুতরাং দয়া করে পরিবর্তে একটি নতুন পরীক্ষা যুক্ত করুন।
টন হসপেল

1
@ টনহসপেল আমি এখনই বাগটি ঠিক করেছি এবং -৩ বাইট কেটে ফেলেছি, তবে উত্তরের জন্য ধন্যবাদ
প্রিন্সপোলকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.