ASCII টেস্ট টিউবগুলি অনুকূলিত করুন


13

আপনাকে এএসসিআইআই টেস্ট টিউবগুলির একটি গুচ্ছ দেওয়া হচ্ছে, আপনার কাজটি ব্যবহৃত টেস্ট টিউবগুলির সংখ্যা হ্রাস করা।

প্রতিটি পরীক্ষার টিউব এর মতো দেখাচ্ছে:

|  |
|  |
|  |
|~~|
|  |
|  |
|  |
|  |
|__|

স্পষ্টতই, ~~জল স্তর। টেস্ট-টিউবটি খালিও হতে পারে, সেক্ষেত্রে কোনও ~~অক্ষর নেই । একক নলটিতে 8 টি জল স্তর ইউনিট থাকতে পারে।

আপনাকে ভিতরে বিভিন্ন পানির স্তর সহ সীমাবদ্ধ টেস্ট টিউব দেওয়া হয়। আপনাকে কমপক্ষে টেস্ট-টিউবগুলিতে জল pourালতে হবে এবং ফলাফলটি আউটপুট করতে হবে।

|  | |  | |  | |  |         |~~| |  |
|  | |  | |  | |  |         |  | |  |
|  | |~~| |  | |  |         |  | |  |
|~~| |  | |  | |  |         |  | |~~|
|  | |  | |  | |  | ------> |  | |  |
|  | |  | |  | |  |         |  | |  |
|  | |  | |~~| |  |         |  | |  |
|  | |  | |  | |  |         |  | |  |
|__| |__| |__| |__|         |__| |__|

 05 + 06 + 02 + 00  ------>  08 + 05

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

পরীক্ষার কেসগুলি: http://pastebin.com/BC0C0uii

শুভ গল্ফিং!


আমরা কি জল পুনরায় বিতরণ করতে পারি? উদাহরণস্বরূপ, যেমন 7 + 6 একটি বৈধ আউটপুট হবে?
মার্টিন এন্ডার

@ মার্টিনইেন্ডারে আপনার কমপক্ষে কম পরিমাণে টিউব ব্যবহার করা উচিত। আমি মনে করি এটি এক্ষেত্রে গ্রহণযোগ্য।
জ্যাকাজ্যাক

@ স্টেভি গ্রিফিন আমি এখানে এখনও তেমন কিছু দেখিনি, তাই যদি এটি একটি
দয়াল

পেছনের সাদা স্থান অনুমোদিত?
পূর্কাকুডারী

আরও ভাল শিরোনাম - "অপ্টিমাইজার এএসসিআইআই টেস্ট টিউব শিশু"
অপ্টিমাইজার

উত্তর:



4

জাভাস্ক্রিপ্ট (ES6), 159 148 বাইট

s=>s.replace(/~~|\n/g,c=>1/c?i++:n+=7-i,n=i=-1)&&`012345678`.replace(/./g,i=>`|${g(+i)}| `.repeat(n>>3)+`|${g(~n&7^i)}|
`,g=i=>i?i>7?`__`:`  `:`~~`)

একটি ট্রেলিং লাইনফিড আউটপুট দেয়। সম্পাদনা করুন: @ আরনল্ডের কিছু সহায়তায় 11 বাইট সংরক্ষণ করা হয়েছে।


s.replace(/~~/g,(_,i)=>n+=9-i/s.indexOf`\n`|0,n=0)4 বাইট সংরক্ষণ করা উচিত পরিবর্তে আপনি এন -1 থেকে আরম্ভ করতে এবং ব্যবহার করতে n>>3এবং ~n&7^iআরও একটি বাইট সংরক্ষণ করতে চাইতে পারেন।
আর্নল্ড

@ আরনাউল্ড এই -1ধারণার জন্য ধন্যবাদ তবে আমি ধারণার উন্নতি করতে সক্ষম হয়েছি replace
নীল

1
নিস! আমি 1/"\n"সত্যই বুঝতে পারি নি ।
আর্নৌল্ড

@ আর্নল্ড ওয়েল, এটি কেবলমাত্র কেকের আইসিংয়ের অতিরিক্ত বাইট ছিল ...
নীল

3

পার্ল, 150 বাইট

149 বাইট কোড + -nপতাকা।

$l+=9-$.for/~~/g}if($l){$%=($v=$l/8)+($r=$l!=8);say"|~~| "x$v.($@="|  | ")x$r;say$:=$@x$%for$l%8..6;say$@x$v."|~~|"x$r;say$:for 2..$l%8;say"|__| "x$%

আমি সমস্ত কোডটি ব্যাখ্যা করব না, কেবল কয়েকটি জিনিস:
$l+=9-$.for/~~/gইনপুটটিতে কতটা জল রয়েছে তা গণনা করে।
কোডের দ্বিতীয় অংশটি আউটপুট প্রিন্ট করে। ধারণাটি হ'ল যথাসম্ভব সম্পূর্ণ পরিপূর্ণ টিউবগুলি রেখে দেওয়া এবং একটি শেষেরটি যাতে জলটি থাকে (যদি থাকে তবে)। সুতরাং অ্যালগরিদম 4 যন্ত্রাংশ রয়েছে: ছাপে প্রথম (টিউব শীর্ষ) পানির লাইন: say"|~~| "x$v.($@="| | ")x$r। তারপর, টিউব খালি অংশের প্রিন্ট যতক্ষণ না আমরা গত নল জল মাত্রা পৌঁছানোর: say$:=$@x$%for$l%8..6। তারপর স্তর মুদ্রণ যেখানে গত নল জল হল: say$@x$v."|~~|"x$r। তারপর, সমস্ত অবশিষ্ট "খালি" মাত্রা মুদ্রণ: say$:for 2..$l%8;। এবং পরিশেষে, বটম লাইন মুদ্রণ: say"|__| "x$%
পরিবর্তনশীল নামের এটি হার্ড পড়তে করতে ( $%, $@, $:) কিন্তু মত কীওয়ার্ড জন্য করতে পারবেন xএবংfor একটি স্থান ছাড়া চলক পরে লেখা হবে।

এটি চালানোর জন্য:

perl -nE '$l+=9-$.for/~~/g}if($l){$%=($v=$l/8)+($r=$l!=8);say"|~~| "x$v.($@="|  | ")x$r;say$:=$@x$%for$l%8..6;say$@x$v."|~~|"x$r;say$:for 2..$l%8;say"|__| "x$%' <<< "|  | |  | |  | |  |
|  | |  | |  | |  |
|  | |~~| |  | |  |
|~~| |  | |  | |  |
|  | |  | |  | |  |
|  | |  | |  | |  |
|  | |  | |~~| |  |
|  | |  | |  | |  |
|__| |__| |__| |__| "

এই উত্তর কত দিন আমি তাতে খুব সন্তুষ্ট নই। আমি আমার অ্যালগরিদম থেকে সেরাটি তৈরি করার চেষ্টা করেছি, তবে একটি ভিন্ন পদ্ধতি সম্ভবত সংক্ষিপ্ত হতে পারে। আমি খুব শীঘ্রই এটিতে কাজ করার চেষ্টা করব।


@ জেমসহোল্ডারনেস আমি পরীক্ষার সমস্ত মামলার চেষ্টা করেছিলাম (এবং এখনই আবার চেষ্টা করেছি কারণ আপনি আমাকে সন্দেহ করেছিলেন) এবং এটি আমার কাছে ভাল লাগছে। "সর্বশেষ এক" 3 টি টিউব সহ একটি: 4 টি পানির স্তর সহ 2, এবং 1 স্তর 2 জলের সাথে ডান? যদি তাই হয় তবে আমি এটি চেষ্টা করেছি এবং এটি পাস্তবিনের মতোই আউটপুট দেয়
দাদা

@ জেমসহোল্ডারহনে ওহ ঠিক আছে, এটি অনেক কিছু ব্যাখ্যা করে! ধন্যবাদ :)
দাদা

3

বেফুঞ্জ, 144 138 বাইট

9>1-00p>~$~2/2%00gv
 |:g00_^#%4~$~$~+*<
$< v01!-g01+*8!!\*!\g00::-1</8+7:<p01-1<9p00+1%8-1:_@#:
_ ~>g!-1+3g:"|",,," |",,:>#^_$55+,10g:#^_@

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

প্রথম দুটি লাইন ইনপুট প্রক্রিয়া করে, মূলত প্রতিটি টিউবের প্রথম অক্ষর বাদে যা কিছু স্তর চিহ্নিতকারী হতে পারে তা বাদ দিয়ে সবকিছু উপেক্ষা করে। আমরা সেই চরিত্রের ASCII মান নিই, 2 এবং Mod 2 দ্বারা বিভক্ত (আমাদের 1 বা 0 প্রদানের উপর নির্ভর করে আমরা একটি স্তর চিহ্নিতকারী কিনা তা উপর নির্ভর করে), সারি সংখ্যা দ্বারা গুণা (8 থেকে নিচে গণনা, এভাবে আমাদের প্রদান করা) এই টিউবের জন্য স্তরের মান) এবং এটিকে চলমান মোটে যুক্ত করুন।

আউটপুটটি দ্বিতীয় দুটি লাইনে হ্যান্ডল করা হয়, তৃতীয় লাইনের ডানদিক থেকে শুরু করে starting আমরা প্রথমে মোট 8 স্তরের প্লাস 7 সমান জলের স্তর নিয়ে টিউবগুলির সংখ্যা গণনা করি এবং তারপরে সমস্ত টিউবের সারিগুলির উপর পুনরাবৃত্তি করার সময়, আমরা একটি নির্দিষ্ট নলের ভিতরে ( টি , 0 থেকে নিচে গণনা করা) জন্য প্রদর্শিত অক্ষরটি গণনা করি a প্রদত্ত সারি ( আর , 8 থেকে 0 পর্যন্ত গণনা করা):

last_level = (total_water - 1)%8 + 1
level      = last_level*!t + 8*!!t
char_type  = !(level - r) - !r

গণনা করা চর_প্রকারটি নীচের সারি (নলের ভিত্তি) এর জন্য -1, অন্য কোনও জায়গার জন্য 0 যা পানির স্তর নয়, এবং জলের স্তরের জন্য 1। এটি আউটপুট থেকে উপযুক্ত চরিত্রের জন্য সাধারণ টেবিল অনুসন্ধান হিসাবে ব্যবহার করা যেতে পারে (আপনি লাইন 4 এর শুরুতে এই টেবিলটি দেখতে পারেন)।


2

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

import Data.Lists
z=[8,7..0]
f x|s<-sum[i*length j-i|(i,j)<-zip z$splitOn"~~"<$>lines x],s>0=unlines$(\i->(#i)=<<(min 8<$>[s,s-8..1]))<$>z|1<2=""
l#i|i==l="|~~| "|i<1="|__| "|1<2="|  | "

ব্যবহারের উদাহরণ:

*Main> putStr $ f "|  | |  | |  | |  |\n|  | |  | |  | |  |\n|  | |~~| |  | |  |\n|~~| |  | |  | |  |\n|  | |  | |  | |  |\n|  | |  | |  | |  |\n|  | |  | |~~| |  |\n|  | |  | |  | |  |\n|__| |__| |__| |__|"
|~~| |  | 
|  | |  | 
|  | |  | 
|  | |~~| 
|  | |  | 
|  | |  | 
|  | |  | 
|  | |  | 
|__| |__| 

প্রতিটি লাইনে একটি ট্রেলিং স্পেস রাখে। কিভাবে এটা কাজ করে:

              lines x      -- split the input string at newlines             
      splitOn"~~"<$>       -- split every line on "~~"
    zip z                  -- pair every line with its water level, i.e.
                           -- first line = 8, 2nd = 7 etc.
   [i*length j-i|(i,j)   ] -- for each such pair take the number of "~~" found
                           -- times the level
 s<-sum                    -- and let s be the sum, i.e. the total amount of water

  s>0                      -- if there's any water at all

          [s,s-8..1]       -- make a list water levels starting with s
                           -- down to 1 in steps of 8
       min 8<$>            -- and set each level to 8 if its greater than 8
                           -- now we have the list of water levels for the output
  \i->(#i)=<<(  )<$>z      -- for each number i from 8,7..0 map (#i) to the
                           -- list of output water levels and join the results
unlines                    -- join output lines into a single string (with newlines)

l#i                        -- pick a piece of tube:
                           --  |__|  if l==0
                           --  |~~|  if l==i
                           --  |  |  else



  |1<2=""                  -- if there's no water in the input, return the
                           -- empty string

প্রধান ব্যথা হ'ল একটি ফাংশনের অভাব যা গণনা করে যে স্ট্রিংয়ের মধ্যে প্রায়শই একটি স্ট্রস্ট্রিং ঘটে। আছে countমধ্যে Data.Text, কিন্তু এটা আমদানির নাম দ্বন্দ্ব যে উপায় খুব সমাধান করতে ব্যয়বহুল একটি গুচ্ছ বাড়ে।


1

পাইথন, 261 বাইট

i=input().split('\n')
t=0
R=range(9)[::-1]
for n in R:t+=i[n].count('~')/2*(8-n)
m=t%8
e=t/8
o=t/8+1
T='|~~| '
b='|  | '
B='|__| '
n='\n'
if m:
 print T*e+b
 for n in R:
    if n==m:print b*e+T
    else:print b*o
 print B*o
elif t<1:1
else:print T*e+(n+b*e)*7+(n+B)*e

আমার মনে হচ্ছে আমি এখানে কিছু মিস করছি। এছাড়াও, যদি নতুন লাইনের একটি গোছা ফাঁকা আউটপুট জন্য উপযুক্ত হয় তবে আমি কিছু বাইট হারাতে পারি। ইনপুট লাগে '| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n|__| |__| |__|'


1

রুবি , 139 বাইট

(কোডের 138 বাইট প্লাস ওয়ান বাইট এর জন্য -n)

n||=0;b=gsub(/~~/){n=n+9-$.}[0,5];END{8.times{|i|puts (b*(n/8)).tr(?_,i>0??\ :?~)+(n%8>0?b.tr(?_,(8-i==n%8)??~:?\ ):"")};puts b*((n+7)/8)}

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

কয়েকটি ব্যাখ্যা:

এই প্রোগ্রামটির -nস্যুইচ প্রয়োজন ।

n - জল কাউন্টার।

b- নল নির্মাণের জন্য টেমপ্লেট; সমান"|__| "

i - নল নির্মাণের সময় বর্তমান লাইন সূচক।

gsub(/~~/){}- এই জালিয়াতি gsubকেবল জল স্তর গণনা। gsubআসলে প্রসারিত হয় Kernel.gsub, যা সমান $_.gsub!। এটি অযৌক্তিকভাবে বর্তমান লাইনে ( $_) হেরফের করে ; যাইহোক, এটি এর পরিবর্তে b=... আরও সংক্ষিপ্ত নিয়োগের অনুমতি দেয় ।[0,5]b=$_[0,5]

n=n+9-$.- জলের স্তর পরিমাপ করতে, অভিব্যক্তিটি প্রাক-সংজ্ঞায়িত ভেরিয়েবল ব্যবহার করে $., যা বর্তমান ইনপুট লাইন নম্বর বহন করে । এটি আমাকে সুস্পষ্ট লুপ ভেরিয়েবলটি হারাতে দেয়।

b=gsub(/~~/){}[0,5]- টেমপ্লেট হিসাবে বামতম নলটির নীচে ক্যাশে করে। (আমার কাছে কিছুটা "কায়রোতে এলিফ্যান্ট" প্যাটার্নের মতো মনে হয় কারণ নীচের লাইনটি জিততে পারে))
নলটির তলটি কখনই জল দেখায় না, তাই gsubসেখানে থাকাকালীন কোনও কিছুই প্রতিস্থাপন করা হবে না; অতএব শেষদিকে, bসর্বদা সমান "|__| "

END{}- পুরো ইনপুট স্ট্রিমটি প্রক্রিয়া করার পরে কল করা হবে। আমি লক্ষ্য টিউবগুলি তৈরি করতে এই পর্বটি ব্যবহার করি।

i>0??\ :?~- এটি কেবল স্বল্প হাতের জন্য i > 0 ? " " : "~"

আপডেট 1: ভেরিয়েবল, gsubকৌশল এবং END{}ধাপে বিশদ যুক্ত হয়েছে।

আপডেট 2: (সামগ্রিকভাবে ± 0 বাইট)

  • (-1 বাইট) এরn||=0 পরিবর্তে ব্যবহার করুনn=n||0
  • (+1 বাইট) এর জন্য মালাস নিয়েছে-n

0

পাইথন 3, 404 বাইট

এই প্রোগ্রামটি ASCII এবং সংখ্যা ফর্ম্যাট উভয়ই পানির স্তর সহ পূর্ণ উদ্দেশ্যযুক্ত আউটপুট তৈরি করে।

w,x,y=[],[],[];a,b,s=" ------> ","~","";y=input().split("\n")
for i in [i for i in zip(*y) if "_" in i][::2]:w+=[8-i.index(b)] if b in i else [0]
u=sum(w)
while u:x+=[[8],[u]][u<8];u-=x[-1]
for i,k in enumerate(y):
    s+=k+"%s"%[a," "*9][i!=4]
    for j,l in enumerate(x):
        c=["  ","__"][i==8];s+="|%s| "%(c,b*2)[l==8-i]
    s+="\n"
s+="\n"
for i in w:s+=" %02d  "%i
s+="\b"+a
for i in x:s+=" %02d  "%i
print(s)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.