স্লো টাইপিস্ট ক্লারেন্স


35

ভূমিকা

ক্লেরাস একটি ডেটা এন্ট্রি ক্লার্ক যিনি একটি ইন্টারনেট পরিষেবা সরবরাহকারীর সাথে কাজ করেন। তার কাজ হ'ল ম্যানুয়ালি আইএসপি-র সমস্ত গ্রাহকের আইপি ঠিকানা ডাটাবেসে প্রবেশ করা। তিনি একটি কীপ্যাড ব্যবহার করে এটি করছেন যার নীচের লেআউট রয়েছে:

123
456
789
.0

অনুভূমিকভাবে বা উল্লম্ব সংলগ্ন কীগুলির কেন্দ্রের মধ্যবর্তী দূরত্ব হ'ল এক সেন্টিমিটার। উদাহরণস্বরূপ, কেন্দ্র মধ্যে দূরত্ব 3এবং 9দুই সেন্টিমিটার হতে হবে। কেন্দ্র মধ্যে দূরত্ব 3এবং 5√2cm হবে। পাইথাগোরাস উপপাদ্য যে কোনও দুটি কী এর মধ্যকার দূরত্ব গণনা করার জন্য যথেষ্ট।

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

উদাহরণস্বরূপ, এখানে কীভাবে ক্ল্যারেন্স নম্বরটি টাইপ করবেন 7851:

  1. সে তার আঙ্গুলটি শুরু করে 7এবং চাবিটি চাপ দেয়।
  2. তিনি নিজের আঙুলটি ডান 1 সেমিতে সরান 8এবং কীটি টিপান।
  3. তিনি নিজের আঙুলটি 1 সেমি পর্যন্ত উপরে নিয়ে যান 5এবং চাবিটি ধাক্কা দেয়।
  4. সে তার আঙুলটি তির্যকভাবে উপরের দিকে নিয়ে যায় এবং 2 সেমি থেকে বাম দিকে চলে যায় এবং কীটি চাপ 1দেয়।

অতএব মোট দূরত্ব যে ক্লারেন্স টাইপ করতে তার আঙুল সরানো 7851হয় 1 + 1 + √23.41cm সম্পর্কে যা।

আপনার কাজ হ'ল এমন একটি প্রোগ্রাম লিখুন যা দূরত্ব গণনা করে ক্লারেন্সকে অবশ্যই নিজের আঙুলটি স্বেচ্ছাসেবী আইপি অ্যাড্রেসগুলিতে লিখতে হবে।

ইনপুট বিবরণ

ইনপুট একটি স্ট্রিং যা ফর্মটিতে থাকবে

().().().()

যেখানে প্রতিটি ()পরিসরের একটি পূর্ণসংখ্যা 0- 999। এটি ক্লেরেন্সের যে আইপি ঠিকানাটি টাইপ করতে হবে তা উপস্থাপন করে An উদাহরণ ইনপুট হতে পারে:

219.45.143.143

আমি এটিও উল্লেখ করতে চাই যে ইনপুটগুলি যেমন অবৈধ আইপি ঠিকানা সত্ত্বেও যেমন বৈধ ইনপুট 0.42.42.42বা 999.999.999.999এখনও বৈধ ইনপুট। সুতরাং আপনার প্রোগ্রামে কোনও আইপি ঠিকানা যাচাইকরণ কোড অন্তর্ভুক্ত করার দরকার নেই।

আউটপুট বিবরণ

নির্দিষ্ট আইপি ঠিকানা টাইপ করার জন্য ক্লারেন্সকে অবশ্যই তার আঙুলটি সরিয়ে ফেলতে হবে Out যেখানে প্রয়োজন সেখানে দুটি দশমিক জায়গায় রাউন্ড উত্তর cmএবং আপনার আউটপুটে ইউনিটটি ব্যবহার করুন । উদাহরণ 27.38cmইনপুটটির আউটপুট (1 + √8 + √5 + 2 + 1 + √5 + 3 + 1 + .5 + √13 + 3 + 1 + .5)।


29
মানুষ, আইএসপিগুলিতে অদ্ভুত কীবোর্ড রয়েছে ...
ডেনিস

1
@ রেটোকোরাদি আমি একটি প্রোগ্রাম আশা করি, হ্যাঁ। stdin, কমান্ড লাইন আর্গুমেন্ট, বা ব্যবহারকারী ইনপুট ফাংশন গ্রহণযোগ্য।
25:55

2
@ ডাকাপোয়ারিয়া - 'agগল অনুসন্ধান' আরও ভারী হাতের টাইপিস্টদের জন্য 'হান্ট অ্যান্ড পেক' বা 'অনুসন্ধান এবং ধ্বংস' নামে পরিচিত।

12
@ আর্টফকোড ক্লেরাস একটি আইএসপিতে কাজ করে এবং কখনও কখনও আইএসপি তাকে ডেটাবেজে টাইপ করার জন্য অবৈধ ডেটা প্রেরণ করে। ক্লেয়ারেন্স যাইহোক ডেটা টাইপ করে। এটাই যাই হোক না কেন মূল কারণ। আসল কারণটি হ'ল কারণ আমি অনুমানটি লেখার সময় এটি উপেক্ষা করেছি।
অ্যাবসিন্থে

3
কেবলমাত্র বৈধ পরিসীমা বিবেচনা করে (0-255) আইপি অ্যাড্রেসগুলি, যা সংক্ষিপ্ত পথে সমস্ত ঠিকানা টাইপ করার জন্য কীবোর্ডের সর্বোত্তম বিন্যাস হওয়া উচিত?
ইস্রায়েল মোরেলেস

উত্তর:


16

সিজেম, 46 44 43 38 37 34 বাইট

rA,sd`f#3fmd2/2ew::.-::mh:+2mO"cm"

@ ব্যবহারকারী23013 কে পরামর্শ দেওয়ার জন্য ধন্যবাদ mh, যার ফলে 5 টি বাইট সংরক্ষণ করা সম্ভব হয়েছে।

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

কিভাবে এটা কাজ করে

r     e# Read a token from STDIN.
A,    e# Push [0 1 2 3 4 5 6 7 8 9].
s     e# Stringify: [0 1 2 3 4 5 6 7 8 9] -> "0123456789"
d     e# Cast to Double: "0123456789" -> 123456789.0
`     e# Inspect: 123456789.0 -> "123456789.0"
f#    e# Push the index of each character from the input in "123456789.0".
3fmd  e# Push the quotient and residue of each index divided by 3.
2/    e# Split the resulting array into pairs.
2ew   e# Convert the array of pairs in the array of all overlapping pairs of pair.
::.-  e# Reduce each pair using vectorized difference: [[a b][c d]] -> [a-b c-d]
::mh  e# Reduce each reduced pair to its 2-norm distance: [a b] -> sqrt(aa + bb)
:+    e# Sum all distances.
2mO   e# Round to two decimal places.
"cm"  e# Push "cm".

2
{3fmd~@-@@-mh}%
জিমি 23013

@ ব্যবহারকারী23013: ধন্যবাদ mhএমনকি আমার কোন ধারণা ছিল না ।
ডেনিস

16

পাইথ, 38 35 34 বাইট

+.Rs.aM-M.:m.jF.Dx`ciUTT1b3z2 2"cm

প্রদর্শন.

@ ডেনিসকে ধন্যবাদ ভাসা ধারণাটির স্ট্রিংয়ের সাথে সূচক।

ফোনি ইনপুটটিতে ব্যাখ্যা 15.0:

  • প্রথমত, আমরা ইনপুট নিই। এটি সুস্পষ্টভাবে সংরক্ষণ করা হয় z। '15 ২.0 '
  • নিম্নরূপ আমরা এই তালিকা মানচিত্র: m.jF.Dx`ciUTT1k3z

    • UT: আমরা তালিকা তৈরি করি [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    • iUTT: এরপরে, আমরা এই তালিকাটি একটি বেস 10 নম্বর প্রদান করে 123456789
    • ciUTT1: পরবর্তী, আমরা এই নম্বরে একটি float ফ্লোটিং পয়েন্ট 1 দ্বারা এটা বিভাজক, দিয়ে রূপান্তর 123456789.0
    • `: একটি স্ট্রিং রূপান্তর। '123456789.0'
    • x k: ইনপুট অক্ষরের সূচিটি সেই স্ট্রিংয়ে নিন। [0, 4, 9, 10]
    • .D 3: .Dডিভোড ফাংশন, এর প্রথম ইনপুট আউটপুট আউট করে দ্বিতীয় ইনপুট দ্বারা বিভক্ত এবং মডুলোড হয়। দ্বিতীয় ইনপুটটি এখানে 3। এটি নামপ্যাডে অক্ষরের শারীরিক অবস্থান দেয়। [(0, 0), (1, 1), (3, 0), (3, 1)]
    • .jF: .jজটিল সংখ্যা নির্মাতা। Fএটি টিপলে প্রয়োগ করে। [0j, (1+1j), (3+0j), (3+1j)]
  • .: 2: এখন, আমরা এই তালিকার 2 টি এন্ট্রি সাবস্ট্রিংগুলি গ্রহণ করি যাতে আমরা জোড়াযুক্ত দূরত্বগুলি খুঁজে পেতে পারি। [[0j, (1+1j)], [(1+1j), (3+0j)], [(3+0j), (3+1j)]]
  • -M: দুটি জটিল সংখ্যার পার্থক্য নেয়। [(-1-1j), (-2+1j), -1j]
  • .aM: ফলাফলটির নিখুঁত মান নেয়। এটি কিপ্যাডের অবস্থানগুলির মধ্যে দূরত্ব।[1.4142135623730951, 2.23606797749979, 1.0]
  • s: দূরত্বের যোগফল দিন। 4.650281539872885
  • .R 2: রাউন্ড 2 দশমিক স্থানে। 4.65
  • + "cm: 'cm'শেষে যুক্ত করুন এবং মুদ্রণ করুন। 4.65cm

7

পিএইচপি - 108 বাইট

<?for(;$v=strpos(-.987654321,fgetc(STDIN));$l=$v)$l&&$t+=hypot($l/3%4-$v/3%4,$l%3-$v%3);printf('%.2fcm',$t);

স্ট্যান্ডিন থেকে ইনপুট নেওয়া হয়। -.987654321পাঠানো strposফাংশন মূল্যায়ণ '-0.987654321'একটি স্ট্রিং প্রেক্ষাপটে।


নমুনা ব্যবহার:

$ echo 219.45.143.143 | php isp.php
27.38cm

5

সি, 192 177 159 বাইট

আপডেট সংস্করণ, কমান্ড লাইন আর্গুমেন্ট ব্যবহার করে এখন সম্পূর্ণ প্রোগ্রাম। একই সময়ে, পূর্ববর্তী সংস্করণের তুলনায় এখনও কম হয়ে উন্নত হয়েছে:

#define G c=*a[1]++,c=c>48?c-49:c/2-14,u=c%3,v=c/3
float r;c,u,v,p,q;main(int n,char**a){for(G;*a[1];)p=u,q=v,G,p-=u,q-=v,r+=sqrt(p*p+q*q);printf("%.2fcm",r);}

Ungolfed:

#include <stdio.h>
#include <math.h>

float r;
int c, u, v, p, q;

int main(int n, char** a) {
    c = *a[1]++;
    c = c > 48 ? c - 49 : c / 2 - 14;
    u = c % 3;
    v = c / 3;
    for ( ; *a[1]; ) {
        p = u;
        q = v;
        c = *a[1]++;
        c = c > 48 ? c - 49 : c / 2 - 14;
        u = c % 3;
        v = c / 3;
        p -= u;
        q -= v;
        r += sqrt(p * p + q * q);
    }

    printf("%.2fcm",r);

    return 0;
}

গল্ফযুক্ত সংস্করণটি #defineসম্পূর্ণ সংস্করণে কয়েকটি পুনরাবৃত্তি কোড সংক্ষিপ্ত করতে প্রিপ্রোসেসর ব্যবহার করে।


2
1. আপনার গল্ফযুক্ত সংস্করণ শেষে একটি সেমিকোলন অনুপস্থিত। ২. আপনার গল্ফযুক্ত সংস্করণটি ভুল ফলাফল তৈরি করছে, যেহেতু আপনি শূন্য নয় এটি sযাচাই করার আগে আপনি বৃদ্ধি করেন *s। ৩. ওপি তার পোস্টে কর্মসূচি জানিয়েছে। আমি নিশ্চিত না কোনও ফাংশন গৃহীত হয়েছে কিনা। ৪. জিসিসির সাথে আপনার অন্তর্ভুক্তির দরকার নেই। ৫. এর sqrtচেয়ে কম sqrtf। 6. pow(u-p,2)তুলনায় খাটো (u-p)*(u-p)। I'm. আমি নিশ্চিত নই, তবে আমি মনে করি উভয় স্থানাঙ্ককে একক স্ট্রিং এবং সেটিংয়ে সংরক্ষণ করি u=x[c]/3এবং v=x[c]%3এটি আরও কম হওয়া উচিত।
ডেনিস

সংশোধন সমস্যা স্থির। দেখা যাচ্ছে যে সূক্ষ্ম টিউনিং করার সময় আমি পূর্ববর্তী সংস্করণটি সংকলন করেছিলাম। এর জন্যে দুঃখিত. 1, 2. স্থির। আমি সত্যিই অবাক হয়েছিলাম যে আমি তাদের ছেড়ে চলে যেতে পারি। ভাঙ্গা পরীক্ষাটি এটি ব্যাখ্যা করবে ... ৩. আমি উইকি / মেটাতে যা দেখেছি তার উপর ভিত্তি করে, শব্দটি আর্গুমেন্ট হিসাবে ইনপুটটি গ্রহণ করার মতো বলে মনে হয়েছিল যদি ইনপুটটি স্পষ্টভাবে নির্দিষ্ট না করা হয় allowed আমার ব্যাখ্যাটি ভুল হলে আমি এটি পরিবর্তন করব। ৪. আমি সর্বদা ভেবেছিলাম যে কেবল ফাংশনগুলি ফিরে আসে intতা অঘোষিত ব্যবহার করা যেতে পারে। তবে প্রকৃতপক্ষে, ঝনঝনানিও এটি একটি সতর্কতার সাথে গ্রহণ করে, তাই আমি এ থেকে মুক্তি পেয়েছি।
রেটো কোড়াদি

উইকিতে বলা হয়েছে যে ডিফল্টরূপে ফাংশনগুলি অনুমোদিত হয়, হ্যাঁ, তবে ওপি লিখেছিল আপনার কাজটি একটি প্রোগ্রাম লেখার জন্য ... লুপটি লিখলে আপনার বন্ধনীগুলির প্রয়োজন হবে না p=u,q=v,G,r+=...
ডেনিস

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

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

3

জাভাস্ক্রিপ্ট ( ES6 ), 132

পপআপের মাধ্যমে আই / ও। পরীক্ষার জন্য স্নিপেট চালান (কেবলমাত্র ফায়ারফক্স)

[for(a of prompt(d=''))[p,q,d]=[x=(a=a<'0'?9:-a?a-1:10)%3,y=a/3|0,d!==''?d+Math.sqrt((p-=x)*p+(q-=y)*q):0]],alert(d.toFixed(2)+'cm')


3

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

L=[x//3*1j+x%3for x in map("123456789.0".find,input())]
print("%.2fcm"%sum(abs(a-b)for a,b in zip(L,L[1:])))

স্বীকার করা খুব ভাল গল্ফ হয় না, তবে কমপক্ষে এটি পিএইচপি এর সাথে সম্পর্কযুক্ত।



2

পাইথন 199 171 166

এসপি 3000 এর জন্য এর জন্য একটি ছোট পাইথন কোড (108) রয়েছে:

https://codegolf.stackexchange.com/a/50854/41163

import sys
p=r=0
for i in sys.argv[1]:
 c=3,0
 if i!=".":c=divmod(int(i)-1,3)
 if i<1:c=3,1
 if p:r+=((p[1]-c[1])**2+(p[0]-c[0])**2)**0.5
 p=c
print"%.2fcm"%r

নমুনা ব্যবহার:

$ python isp.py 219.45.143.143
27.38cm

অনলাইনে চালান: http://codepad.org/h9CWCBNO

মন্তব্য করা কোড

import sys

# p - last position as (y,x) tuple - initialized with 0, because "if 0" -> equals to "False"
p = 0
# r - result of adding all distances - ini with 0, because not moved any distances on start
r = 0

# Loop over chars
for char in sys.argv[1]:
   # c - current position of typist as (y,x) tuple

   # Always set c to position of "." key 
   c = 3,0 # lazy for c=(3,0)

   # Check if char is not the "." key
   if char !=".":

      # Get position of char on keypad
      c=divmod(int(char)-1,3)

      if char<1:
         c=3,1  

   # If this is the first char, 
   # then STORE_OPERATION has not been executed, 
   # so p is still p=0 from original initialization 
   # calling "if 0" evaluates to False,
   # so we jump this code block, for the first char
   if p:                           
      # calculate delta of x, y from current and last position, 
      # then add both deltas squared (**2),
      # then get square root of it (**0.5 = **1/2)
      # add to r (+=)
      r+=( (p[1]-c[1])**2 + (p[0]-c[0])**2 )**0.5

   # STORE_OPERATION - Store current position as last position
   p = c

# .2f returns r with 2 trailing digits
print"%.2fcm"%r

1
আপনি ifএক লাইনে ধারাগুলি সংজ্ঞায়িত করে কিছু বাইট সংরক্ষণ করতে পারেন , যেমনif i<1:c=3,1
জাগারব ২

1
আপনি আপনার পোস্টের শীর্ষে এই মন্তব্যটি রেখে সিনট্যাক্স হাইলাইটিং যুক্ত করতে পারেন:<!-- language: lang-python -->
মার্টিন এন্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.