মুদ্রণ-স্টাইল স্ট্রিং বিন্যাস


9

চ্যালেঞ্জ

একটি ফাংশন লিখুন যা সি- printfস্টাইল স্ট্রিং ফর্ম্যাটিং প্রয়োগ করে ।

বিধি

  1. আপনি আবশ্যক বাস্তবায়ন অন্তত %%, %c, %s, %dএবং %f
  2. আপনার অবশ্যই একটি অন্তর্নির্মিত স্ট্রিং বিন্যাস পদ্ধতি ব্যবহার করবেন না
  3. আপনাকে অবশ্যই বাহ্যিক প্রোগ্রামগুলি চালাবেন না বা আপনার প্রোগ্রাম থেকে ইন্টারনেটের সাথে সংযুক্ত করতে হবে না
  4. কীভাবে অবৈধ ইনপুট হ্যান্ডেল করবেন তা সিদ্ধান্ত নেওয়ার বিষয় আপনার উপর নির্ভর করে তবে আপনার প্রোগ্রামটি অস্বাভাবিকভাবে শেষ করতে হবে না
  5. আপনি উচিত একটি লিখতে variadic ফাংশন সম্ভব হলে।

এই দস্তাবেজের মূল শব্দগুলি "আবশ্যক", "আবশ্যক নয়", "আবশ্যক", "শাল", "শট নয়", "উচিত", "উচিত নয়", "প্রস্তাবিত", "মাই" এবং "বিকল্প" আরএফসি 2119-তে বর্ণিত হিসাবে ব্যাখ্যা করা ।


কি করে %c? বেশ নিশ্চিত %s, %dএবং %fস্ট্রিং, ইনট এবং স্বতঃস্ফুট ভাসমানের জন্য, তবে সম্পর্কে অনিশ্চিত %c
সুমুরাই 8

%cআইআইআরসি-পাস করা ইন-এর ASCII মান প্রদর্শন করে
মেরিনাস

এটি অক্ষর মুদ্রণ করে, তাই 97এবং 'a'উভয় aআউটপুট হয়ে উঠবে ।
nyuszika7h

%-02dডান মত কিছু ফর্ম সমর্থন করার প্রয়োজন নেই? শুধু যে তিন% সি,% s,% d?
আপনি

@ আপনি সঠিক। তাতেই চলবে.
nyuszika7h

উত্তর:


4

এপিএল (73)

{⊃,/,⌿↑(⊂2∘↓¨Z⊂G),⊂{'c'0≡⍵,∊⊃⍺:⎕UCS⍺⋄⍕⍺}/⍵,⍪⌷∘G¨1↓1+(Z←G='%')/⍳⍴G←'%!',⍺}

কিছু পরীক্ষা:

      'a:%c b:%s c:%d'{⊃,/,⌿↑(⊂2∘↓¨Z⊂G),⊂{'c'0≡⍵,∊⊃⍺:⎕UCS⍺⋄⍕⍺}/⍵,⍪⌷∘G¨1↓1+(Z←G='%')/⍳⍴G←'%!',⍺} 65 'foo' 67
a:A b:foo c:67 

      printf←{⊃,/,⌿↑(⊂2∘↓¨Z⊂G),⊂{'c'0≡⍵,∊⊃⍺:⎕UCS⍺⋄⍕⍺}/⍵,⍪⌷∘G¨1↓1+(Z←G='%')/⍳⍴G←'%!',⍺}
      '1:%s 2:%s 3:%d 4:%c 5:%c' printf 'foo' 'bar' 100 110 'z'
1:foo 2:bar 3:100 4:n 5:z   
      'The %s brown %c%c%c jumps over the %s dog.' printf 'quick' 102 111 'x' 'lazy'
The quick brown fox jumps over the lazy dog.

ব্যাখ্যা:

  • G←'%!',⍺: স্ট্রিংয়ের একটি ডামি সুনির্দিষ্ট উপসর্গ (সহজ প্রক্রিয়াজাতকরণের জন্য)
  • (Z←G='%')/⍳⍴G: %স্ট্রিংয়ের সমস্ত অক্ষরের সূচকগুলি সন্ধান করুন; একটি বিটমাস্ক সংরক্ষণ করুনZ
  • ⌷∘G¨1↓1+: %s এর পাশে থাকা সমস্ত অক্ষর নির্বাচন করুন এবং ডামিটি ফেলে দিন।
  • ⍵,⍪: প্রতিটি তদন্তকারীকে তার মানটি ডান যুক্তি থেকে মিলিয়ে নিন।
  • {... }/: প্রতিটি জুটিতে নিম্নলিখিত ফাংশনটি চালান:
    • 'c'0≡⍵,∊⊃⍺: যদি আর্গুমেন্টটি একটি নম্বর হয় এবং নির্দিষ্টকারকটি হয় c:
    • :⎕UCS⍺: তারপরে আর্গুমেন্টের ইউনিকোড মানটি ফিরিয়ে দিন,
    • ⋄⍕⍺: অন্যথায়, যুক্তির স্ট্রিং উপস্থাপনাটি ফিরিয়ে দিন return
  • : ঘিরা
  • ⊂2∘↓¨Z⊂G: স্ট্রিংগুলিতে এসটি বিভক্ত করুন %এবং তারপরে প্রতিটি স্ট্রিংয়ের প্রথম দুটি অক্ষর সরিয়ে ফেলুন (এটি যেখানে ডামি আসবে) এবং এর ফলাফলটি আবদ্ধ করুন।
  • : দুটি বদ্ধ অ্যারে থেকে একটি ম্যাট্রিক্স তৈরি করুন, প্রতিটি স্ট্রিংয়ের মানটি অনুসরণ করা উচিত যা এটি অনুসরণ করা উচিত।
  • ,⌿: প্রতিটি স্ট্রাস্টিং এর মান সহ যোগ দিন।
  • ⊃,/: তারপরে ফলাফলযুক্ত স্ট্রিংগুলিতে যোগদান করুন।

গির্জার মতো দেখতে গৌরবময় ভাষা দেখতে এটি সবসময় মজাদার। ;)
nyuszika7h

2
@ নিউউজিকা 7 হ: এটি আসলে একটি গুরুতর ভাষা। এটি 1960 এর দশকের এবং এটি এখনও ব্যবহৃত। এটি গল্ফ না করা হলে গীবির মতো কিছুটা কম লাগবে।
মেরিনাস

আমি দেখতে, আকর্ষণীয়।
nyuszika7h

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

@xfix আমি ভেবেছিলাম এলআইএসপি তালিকাভিত্তিক প্রোগ্রামিং ভাষা ছিল? আমরা প্রকৃত কাজের জন্য বিশ্ববিদ্যালয়ে এপিএল ব্যবহার করেছি - স্থানীয়ভাবে অ্যারেগুলি পরিচালনা করতে সক্ষম হওয়া সত্যিই সহজ। জে এপিএলের অন্যতম উদ্ভাবক তার "উত্তরসূরি" হিসাবে ডিজাইন করেছিলেন - অবশ্যই এর অর্থ এই নয় যে এটি কোড গল্ফের জন্য কার্যকর নয় ...
জেরি জেরেমিয়া

2

রুবি: ১০২ টি অক্ষর

f=->s,*a{s.gsub(/%(.)/){$1==?%??%:a.shift.send({?c=>:chr,?s=>:to_s,?d=>:to_i,?f=>:to_f}[$1])rescue$&}}

নমুনা রান:

irb(main):001:0> f=->s,*a{s.gsub(/%(.)/){$1==?%??%:a.shift.send({?c=>:chr,?s=>:to_s,?d=>:to_i,?f=>:to_f}[$1])rescue$&}}
=> #<Proc:0x96634ac@(irb):1 (lambda)>

irb(main):002:0> puts f["percent : %%\n   char : %c or %c\n string : %s or %s or %s\ndecimal : %d or %d or %d\n  float : %f or %f or %f\ninvalid : %x or %s or %d or %f", 65, 'B', 'format me', 42, Math::PI, 42, Math::PI, '2014', 42, Math::PI, '2014', 'more']
percent : %
   char : A or B
 string : format me or 42 or 3.141592653589793
decimal : 42 or 3 or 2014
  float : 42.0 or 3.141592653589793 or 2014.0
invalid : %x or  or 0 or 0.0
=> nil

অবৈধ ফর্ম্যাট স্পেসিফায়ারগুলি স্থানে রাখা হয়েছে। আর্গুমেন্ট মান ব্যতীত ফর্ম্যাট স্পেসিফায়ারকে প্রদত্ত ধরণের খালি মান দিয়ে প্রতিস্থাপন করা হয়।


আপনি একটি বেনামী ফাংশন সরবরাহ করতে পারেন, তাই শীর্ষস্থানীয়f
বিড়াল

প্রকৃতপক্ষে. তবে যেমনটি আমার মনে আছে, এটি পোস্ট করার সময় বেনামী ফাংশনগুলি সর্বসম্মতভাবে গৃহীত হয়নি। আপাতত দু'জনেরই লুয়া উত্তর বেনামে ফাংশনে আপডেট করা হয়নি (একই পরিমাণে চরিত্রগুলি সংরক্ষণ করার জন্য), আমি মনে করি আমি আপডেট প্রচার শুরু করব না।
manatwork

2

লুয়া 5.2, 115 বাইট

-- Function definition, 115 chars
function f(f,...)n,t=0,{...}return(f:gsub('%%(%a)',function(s)n=n+1return(({c=s.char})[s]or tostring)(t[n])end))end

-- Usage example
print(f('Happy %cew %d %s %f',78,2014,'Year!',math.pi))
-- Output: Happy New 2014 Year! 3.1415926535898

সুন্দর. লুয়ার কোন সংস্করণ? 5.1.5 "1return 'এর নিকটে ত্রুটিযুক্ত নম্বর দেয়"। "% সি" এর সাথে ছোট সমস্যা, এটি 78 78 এর পরিবর্তে 'এন' এ ব্যর্থ হয় Or বা এটি কি কেবল আমার পুরানো লুয়ার বিশেষত্ব?
manatwork

@ মান্যাটওয়ার্ক - এখানে
এগার স্ক্রিপটুনফ

ইয়েপ, সেখানে কাজ করে।
manatwork

লুয়া 5.2.3 এ আমার জন্য কাজ করে।
nyuszika7h

1

সি ++ (২৮১ টি অক্ষর)

#include<sstream>
#include<cstdarg>
#define q(x)va_arg(v,x);break;case
std::string p(char*f,...){std::ostringstream r;va_list v;va_start(v,f);while(*f)if(*f=='%')switch(++f,*f++){case's':r<<q(char*)'d':r<<q(int)'c':r<<(char)q(int)'%':r<<'%';}else r<<*f++;va_end(v);return r.str();}

আমি সি ++ ঘৃণা করি, তবে এটি একটি ভাল পছন্দ বলে মনে হয়েছিল (আমি সত্যিই সি এর সাথে যাব, যদি না যে char*পয়েন্টারটি আসলে দরকারী হওয়ার জন্য খুব বেশি পরিশ্রমের প্রয়োজন হয়)। char*যুক্তি, এবং std::stringফলাফল নেয় , কিন্তু ওহে, এটি সি ++, সুতরাং ধারাবাহিকতা সম্পর্কে কে যত্নশীল (যে ভাষায় নিজেই ধারাবাহিক নয়)?


এটি সংকলন করে না, কারণ এটির মূল কার্যকারিতা নেই।
nyuszika7h

@ নিউজিকা 77 ঘন্টা: প্রশ্নটি একটি অনুষ্ঠান তৈরির বিষয়ে ছিল, তা নয় main। তবে আপনার যদি নমুনার প্রয়োজন হয় তবে gist.github.com/xfix/8238576main চেষ্টা করুন (এই ফাংশনটি পরীক্ষা করার সময় আমি এটি ব্যবহার করেছি)।
কনরাড বোরোস্কি

সত্য, আপনি সত্যই একটি অর্থবহ mainকার্যকরী করতে পারবেন না , একটি যুক্ত করলে কেবল চরিত্রের সংখ্যা বাড়বে। আমি কোডটি সংশোধন করতে না চাইলে, আমি #includeআমার পরীক্ষার প্রোগ্রাম থেকে একটি শিরোনামের ফাইল এবং এটি যুক্ত করতে পারি।
nyuszika7h

1

জাভা , 201 186 174 বাইট

কেভিন ক্রুইজসেনকে 12 বাইট ধন্যবাদ

String f(String s,Object...a){String r="";for(char c,i=0,j=0;i<s.length();r+=c==37?(c=s.charAt(i++))<38?c:c==99?(char)(int)a[j++]:a[j++]:c==37?"":c)c=s.charAt(i++);return r;}

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


আমি সম্পূর্ণরূপে নিশ্চিত নই, কিন্তু আমি মনে করি আপনি অপসারণ করতে পারেন =s.charAt(0)থেকে char c=s.charAt(0)এটি টিআইওতে কাজ করে যখন আমি এটি করি।
কেভিন ক্রুইজসেন

@ কেভিন ক্রুইজসেন আমি কসম খেয়েছি এটি বেশ চালাক।
ফাঁস নুন

আমি জানি যে এটি হয়ে গেছে, তবে আপনি সরাসরি মুদ্রণ করে আরও 8 টি বাইট সংরক্ষণ করতে পারেন: void f(String s,Object...a){for(char c,i=0,j=0;i<s.length();System.out.print(c==37?(c=s.charAt(i++))<38?c:c==99?(char)(int)a[j++]:a[j++]:c==37?"":c))c=s.charAt(i++);} 166 বাইট (এবং আরও কিছু জাভা 8 তে রূপান্তর করে, তবে এটি আসলে আপনার জিনিস নয়, তাই না?)
কেভিন ক্রুইজসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.