কোনও প্রদত্ত পাঠ্য টাইপ করার জন্য ন্যূনতম কীস্ট্রোকগুলির প্রয়োজন


45

আমরা সবাই জানি যে প্রোগ্রামাররা অলস হতে থাকে। আপনার নিখরচায় সময় সর্বাধিক করার জন্য, আপনি এমন একটি প্রোগ্রাম লেখার সিদ্ধান্ত নিয়েছেন যা এতে পাঠানো পাঠ্যের জন্য ন্যূনতম সংখ্যক কীস্ট্রোককে আউটপুট করে।

ইনপুট : পাঠ্য যা কীস্ট্রোকে রূপান্তর করতে হয়। আপনি কীভাবে পাঠ্য ইনপুট করবেন সে বিষয়ে সিদ্ধান্ত নিতে পারেন (আর্গুমেন্টে সরবরাহ করা কোনও ফাইল থেকে STDIN / পড়া)

আউটপুট : নিম্নলিখিত বিন্যাসে প্রয়োজনীয় ক্রিয়া:

  • তাদের অবশ্যই নাম্বার করা উচিত
  • Hএটি: একটি কী টিপুন এবং অবিলম্বে এটিকে ছেড়ে দিন
  • Pপুনঃনির্বাচিত: একটি কী টিপুন এবং এটি প্রকাশ না করুন (কীটি Rপরবর্তী কীস্ট্রোক হিসাবে প্রদর্শিত হবে তা কখনই অনুকূল হবে না )
  • Rইলিজ: একটি Pরিসেসড কীটি ছেড়ে দেওয়া

উদাহরণ :

ইনপুট:

Hello!

আউটপুট:

একটি নিষ্পাপ সমাধান হবে:

1 P Shift
2 H h
3 R Shift
4 H e
5 H l
6 H l
7 H o
8 P Shift
9 H 1
10 R Shift

এটি আরও দক্ষ হবে:

1 P Shift
2 H h
3 H 1
4 R Shift
5 H Left
6 H e
7 H l
8 H l
9 H o

পরিবেশ:

  • সম্পাদক একটি মনসোপাসে ফন্ট ব্যবহার করে
  • পাঠ্যটি 80 টি অক্ষরে নরম আবৃত
  • এর মধ্যে ছোট লাইন থাকলেও তীর আপ এবং তীর ডাউন কলামটি সংরক্ষণ করে
  • ক্লিপবোর্ডটি খালি বলে ধরে নেওয়া হয়
  • নাম লক সক্ষম হয়ে থাকে বলে ধরে নেওয়া হয়
  • ক্যাপস লকটি অক্ষম বলে ধরে নেওয়া হয়
  • ক্যাপস লক কেবল অক্ষরের জন্য কাজ করে (অর্থাত্ শিফট লক নেই)

হটকি / শর্টকাটস :

  • Home: বর্তমান লাইনের শুরুতে ঝাঁপ দাও
  • End: বর্তমান লাইনের শেষ দিকে ঝাঁপুন
  • Ctrl+ A: সবকিছু চিহ্নিত করুন
  • Ctrl+ C: অনুলিপি করুন
  • Ctrl+ X: কাটা
  • Ctrl+ V: আটকান
  • Shift+ কার্সার সরানো: চিহ্নিত করা হচ্ছে
  • Ctrl+ F: একটি অনুসন্ধান সংলাপ খোলে।
    • বোকা পাঠ্য মেলানো, কোনও নিয়মিত অভিব্যক্তি নেই
    • সংবেদনশীল কেস
    • চারপাশে মোড়ানো অনুসন্ধানগুলি
    • অনুসন্ধানের জন্য একক লাইন পাঠ্য ইনপুট
    • ইনপুটটি বর্তমান নির্বাচনের সাথে প্রিফিলড রয়েছে, যদি না এর মধ্যে একটি নতুন লাইন থাকে তবে সম্পূর্ণ ইনপুটটি নির্বাচিত হয়
    • অনুলিপি / আটকানো যথারীতি কাজ করে
    • প্রেসিং Enterঅনুসন্ধানটি সম্পাদন করে, বর্তমান কার্সারের অবস্থানের পরে প্রথম ম্যাচটি নির্বাচন করে
  • F3: শেষ অনুসন্ধান পুনরাবৃত্তি
  • Ctrl+ H: একটি প্রতিস্থাপন ডায়ালগ খোলে
    • বোকা পাঠ্য মেলানো, কোনও নিয়মিত অভিব্যক্তি নেই
    • সংবেদনশীল কেস
    • চারপাশে মোড়ানো সহ, সমস্ত প্রতিস্থাপন করুন
    • একক লাইন পাঠ্য ইনপুট
    • অনুসন্ধানের ইনপুটটি বর্তমান নির্বাচনের সাথে পূর্বেই রয়েছে, যদি না এর মধ্যে কোনও নতুন লাইন না থাকে, সম্পূর্ণ ইনপুটটি নির্বাচিত হয়
    • প্রতিস্থাপন ইনপুট খালি
    • অনুলিপি / আটকানো যথারীতি কাজ করে
    • Tab প্রতিস্থাপন ইনপুট লাফ দেয়
    • টিপুন Enterসমস্ত প্রতিস্থাপন সম্পাদন করে। কার্সারটি সর্বশেষ প্রতিস্থাপনের পরে স্থাপন করা হয়

বিধি :

  • সমাধানগুলি অবশ্যই একটি সম্পূর্ণ প্রোগ্রাম হতে পারে যা সংকলন / পার্স এবং কোনও পরিবর্তন ছাড়াই সম্পাদন করে
  • উপরে প্রদর্শিত কীবোর্ডটি হ'ল ব্যবহারযোগ্য কীবোর্ড
    • এমন অক্ষরগুলি হ্যান্ডেল করার দরকার নেই যা এগুলি দিয়ে টাইপ করা যায় না
  • প্রতিটি কী অবশ্যই শেষে প্রকাশ করা উচিত
  • কার্সারটি ফাইলের শেষে থাকা দরকার নেই

স্কোরিং :

আপনার স্কোর নীচের পাঠ্য টাইপ করতে প্রয়োজনীয় পরিমাণের ক্রিয়াকলাপ। বিজয়ী হ'ল সর্বনিম্ন স্কোর সহ সমাধান। আমার নিষ্পাপ সমাধানটি আমি পেয়েছি 1371 + 833 + 2006 = 4210। মার! আমি দুই সপ্তাহের মধ্যে একটি বিজয়ী চয়ন করব।

1 আমার নিষ্পাপ সমাধান

number = 1

H = (char) -> console.log "#{number++} H #{char}"
P = (char) -> console.log "#{number++} P #{char}"
R = (char) -> console.log "#{number++} R #{char}"

strokes = (text) ->
    shiftActive = no

    for char in text
        if /^[a-z]$/.test char
            if shiftActive
                R "Shift"
                shiftActive = no

            H char
        else if /^[A-Z]$/.test char
            unless shiftActive
                P "Shift"
                shiftActive = yes

            H char.toLowerCase()
        else
            table =
                '~': '`'
                '!': 1
                '@': 2
                '#': 3
                '$': 4
                '%': 5
                '^': 6
                '&': 7
                '*': 8
                '(': 9
                ')': 0
                '_': '-'
                '+': '='
                '|': '\\'
                '<': ','
                '>': '.'
                '?': '/'
                ':': ';'
                '"': "'"
                '{': '['
                '}': ']'

            if table[char]?
                unless shiftActive
                    P "Shift"
                    shiftActive = yes

                H table[char]
            else
                H switch char
                    when " " then "Space"
                    when "\n" then "Enter"
                    when "\t" then "Tab"
                    else
                        if shiftActive
                            R "Shift"
                            shiftActive = no

                        char
    R "Shift" if shiftActive

input = ""

process.stdin.on 'data', (chunk) -> input += chunk
process.stdin.on 'end', -> strokes input

2 সহজ পুনরাবৃত্তি

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

3 আরও জটিল পুনরাবৃত্তি

We're no strangers to love
You know the rules and so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guy
I just wanna tell you how I'm feeling
Gotta make you understand

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

We've known each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it
And if you ask me how I'm feeling
Don't tell me you're too blind to see

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

(Ooh, give you up)
(Ooh, give you up)
(Ooh)
Never gonna give, never gonna give
(Give you up)
(Ooh)
Never gonna give, never gonna give
(Give you up)

We've know each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it

I just wanna tell you how I'm feeling
Gotta make you understand

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you

আপনার সমাধানগুলি পরীক্ষা করার জন্য আপনি আমার দ্বারা লেখা রিপ্লে প্রোগ্রামটি ব্যবহার করতে পারেন (দ্রষ্টব্য: এটি অনুসন্ধান / প্রতিস্থাপন এখনও সমর্থন করে না, সমস্ত কিছু কাজ করা উচিত)।


6
আমি ভিএম এর মতো একটি প্রোগ্রাম দেখতে পছন্দ করব।
ব্র্যাডেন সেরা

4
সাধারণত আমি এই জিনিসগুলির অংশের জন্য মাউস ব্যবহার করি।
ভিক্টর স্টাফুসা

1
অনেক আগ্রহব্যাঞ্জক. আমি সকালে যাব; 3
cjfaure

2
আপনি কি আমাদের রিক রোল করতে পারেন নি? :)
ফিলিপ হাগলুন্ড

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

উত্তর:


11

হাস্কেল 1309 + 457 + 1618 = 3384

অবশেষে, একটি উত্তর (স্কোরটি যখন আপনি বুঝতে পেরেছিলেন যে আপনার প্রথম পরীক্ষার ট্যাবগুলি রয়েছে তখন তা খুব ভালভাবে উন্নত হয়েছিল। সেগুলি দেখার জন্য প্রশ্ন সম্পাদনা করতে হবে)। স্টাইলিনে ghcসরবরাহ করুন ইনপুট দিয়ে সংকলন করুন। উদাহরণ:

$ ghc keyboard.hs && echo hello|./keyboard
1 H h
2 H e
3 H l
4 H l
5 H o
6 H Enter

আমি ডিজকস্ট্রার মতো সুস্পষ্ট স্টাফ চেষ্টা করেছিলাম তবে শাখা প্রশাখি একমাত্র কার্যকর চালচলনের পরে কমিয়ে দেওয়ার পরেও এটি বেশ ধীরে ধীরে ছিল, যা হ'ল: পরবর্তী কীটি আউটপুট, বা লাইনটির শুরু থেকে অনুলিপি করুন (Shift + Home, Ctrl + C, শেষ), বা পেস্ট করুন।

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

উপসর্গের দৈর্ঘ্য "কখনই হবে না" ফিট করতে বেছে নেওয়া হলে সর্বনিম্ন স্কোর অর্জন করা হয়। এটির উন্নতি করার উপায় রয়েছে তবে আমার কাছে রিক অ্যাস্টলি পড়ার যথেষ্ট পরিমাণ রয়েছে।

import Data.List (isPrefixOf,isInfixOf)
import Control.Monad (foldM)
plen=12
softlines text=sl 0 [] text
  where
    sl n [] [] = []
    sl n acc [] = [(n,reverse acc)]
    sl n acc (x:xs)
      |x=='\n'||length acc==79=(n,reverse (x:acc)):(sl (n+1) [] xs)
      |otherwise=sl n (x:acc) xs
pasteable (a,b) (c,d)=(c>a && b`isInfixOf`d)
                      || (c==a && b`isInfixOf`(drop (length b) d))
findprefixes l=filter (\(a,b,c)->c/=[])
               $ map (\(a,b)->(a, b, map fst $ filter (pasteable (a,b)) l))
               $ filter (\(a,b)->length b==plen && last b/='\n')
               $ map (\(a,b)->(a, take plen b)) l
mergePrefixes [] = []
mergePrefixes (p:ps) = mergePrefixes' p ps
 where mergePrefixes' p [] = [p]
       mergePrefixes' (a,x,b) ((c,y,d):qs) =
         if length (filter (>=c) b) >= length d then
           mergePrefixes' (a,x,b) qs
         else
           (a, x, (filter (<c) b)):(mergePrefixes' (c,y,d) qs)
uc = ("~!@#$%^&*()_+<>?:{}|\""++['A'..'Z'])
lc = ("`1234567890-=,./;[]\\'"++['a'..'z'])
down c = case [[lo]|(lo,hi)<-zip lc uc,c==hi] of []->error [c];p->head p
applyPrefixToLine prefix [] s=return s
applyPrefixToLine [] line s=emit line s
applyPrefixToLine prefix line@(ch:rest) s=
 if prefix`isPrefixOf`line then
   do { s<-emitPaste s; applyPrefixToLine prefix (drop (length prefix) line) s}
 else
   do { s<-emitch s ch; applyPrefixToLine prefix rest s}
type Keystroke = (Char, [Char])
key action k (n, shift) = do
  putStrLn ((show n)++" "++[action]++" "++k)
  if k=="Shift" then return (n+1, (not shift))
  else return (n+1, shift)
emitch (m, shift) ch=
  case ch of
    '\t'->key 'H' "Tab" (m,shift)
    '\n'->key 'H' "Enter" (m,shift)
    ' '->key 'H' "Space" (m,shift)
    _->
      if shift && ch`elem`lc then
        do { key 'R' "Shift" (m, True); key 'H' [ch] (m+1, False) }
      else if not shift && ch`elem`uc then
             do { key 'P' "Shift" (m, False); key 'H' (down ch) (m+1, True) }
           else if ch`elem`lc
                then key 'H' [ch] (m, shift)
                else key 'H' (down ch) (m, shift)
emit line s = foldM emitch s line
emitPaste s = do
  s<-key 'P'"Ctrl" s
  s<-key 'H' "v" s
  key 'R' "Ctrl" s
emitCopy s = do
  s<-key 'H' "Home" s
  s<-key 'P'"Ctrl" s
  s<-key 'H' "c" s
  s<-key 'R' "Ctrl" s
  s<-key 'R' "Shift" s
  key 'H' "End" s
applyPrefix pf ((a,b):xs) p@((c,y,d):ps) s=
  if (c==a) then
    do
      s@(n, shift) <- emit y s
      s <- if shift then return s else key 'P' "Shift" s
      s <- emitCopy s
      s <- applyPrefixToLine y (drop (length y) b) s
      applyPrefix y xs ps s
  else
    do
      s<-applyPrefixToLine pf b s
      applyPrefix pf xs p s
applyPrefix "" ((a,b):xs) [] s=
  do
    s <- emit b s
    applyPrefix "" xs [] s
applyPrefix pf ((a,b):xs) [] s=
  do
    s<-applyPrefixToLine pf b s
    applyPrefix pf xs [] s
applyPrefix _ [] _ s=return s

main=do
  input <- getContents
  let lines = softlines input
  let prefixes = mergePrefixes (findprefixes lines)
  (n,shift) <- applyPrefix "" lines prefixes (1, False)
  if shift then
    key 'R' "Shift" (n, shift)
  else
    return(n,shift)

খুব সুন্দর সমাধান :) বিটিডব্লিউ: আপনি পেস্টগুলি সংযুক্ত করে আরও কিছু চরিত্রগুলি শেভ করতে পারেন (সম্ভব হলে)।
টিমওয়োল্লা

এটি কেবলমাত্র উদাহরণ 2-কে প্রভাবিত করে - আমার একটি ডিজকস্ট্রা অ্যালগরিদম সংস্করণ ছিল যা এটি খুঁজে পায় তবে এটি প্রথম 3 লাইনের বিপরীতে কেবলমাত্র ব্যবহারযোগ্য। আপনি বিভিন্ন উপসর্গের আকার ব্যবহার করে সমস্ত পরীক্ষার জন্য আমার সমাধানকে উন্নত করতে পারেন; সমাধানটি যথেষ্ট দ্রুত যে আপনি নিষ্ঠুর শক্তি দ্বারা এটি করতে পারেন, কেবল প্রায় 10 রান প্রয়োজন। অদলবদল হ্যাশেল যদিও যে রিফ্যাক্টর।
বাজরাঘ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.