কোড-গল্ফ আস্কি শিল্পের সহজ উপায়!


18

টাস্ক:

এই সাইটে ASCII আর্ট মধ্যে সাজানো থাকে, মত উত্তর অনেক আছে এই এক । সাধারণত ব্যবস্থাটি ম্যানুয়ালি করা হয়, তবে কোনও প্রোগ্রাম কি তাতে সহায়তা করবে না? :)

আপনার প্রোগ্রামে 3 ইনপুট লাগবে:

  • কোডটি, একক লাইন হিসাবে
  • প্যাটার্নে রেখার সংখ্যা (প্রয়োজনীয় না হলে বাদ দেওয়া যেতে পারে)
  • প্যাটার্ন নিজেই, *এস বা অন্য চর হিসাবে

নিয়মাবলী:

  • আপনাকে স্ট্যান্ডিন থেকে পড়া একটি প্রোগ্রাম (কোনও ফাংশন নয়) লিখতে হবে
  • পাঠ্যটি প্রতি লাইনে বাম থেকে ডানে স্থান দেওয়া হয়
  • প্যাটার্নটি পূরণ করার জন্য পর্যাপ্ত পাঠ্য .না থাকলে, বাকি জায়গাগুলিতে গুলি রাখুন
  • যদি প্যাটার্নটি পূরণ করার জন্য খুব বেশি পাঠ্য থাকে তবে আউটপুট পরে এটি মুদ্রণ করুন
  • , তাই সংক্ষিপ্ততম কোড, বাইটে জিততে পারে

নমুনা রান:

ইনপুট (সঠিক ফিট পরীক্ষা) :

qwertyuiopasdfghjklzxcvbnm
4
***** * ***
*   * * *
*   * * *
***** * ***

আউটপুট :

qwert y uio
p   a s d
f   g h j
klzxc v bnm

ইনপুট (অতিরিক্ত অক্ষরের পরীক্ষা) :

qwertyuiopasdfghjklzxcvbnm12345
4
***** * ***
*   * * *
*   * * *
***** * ***

আউটপুট :

qwert y uio
p   a s d
f   g h j
klzxc v bnm
12345

ইনপুট (অপর্যাপ্ত অক্ষর পরীক্ষা) :

qwertyuiopasdfg
4
***** * ***
*   * * *
*   * * *
***** * ***

আউটপুট :

qwert y uio
p   a s d
f   g . .
..... . ...

2
প্রোগ্রামটির শব্দার্থবিজ্ঞান পরিবর্তন না করে স্পেস এবং নিউলাইন সন্নিবেশ করা যেখানে অনুমতিপ্রাপ্ত তা সম্পর্কে কী অনুমান করা উচিত?
পিটার টেলর

1
@ পিটারটেলর মনে হয় কোড স্থাপন / পৃথক করার কোনও উপায় নেই, সুতরাং আমি মনে করি শব্দার্থবিজ্ঞান উপেক্ষা করা হচ্ছে?
মার্টিন ইন্ডার

1
অনুমানের অংশগুলি কি "বাদ দেওয়া যায়" এবং "বা অন্য চর" এর অর্থ এই যে আমরা মুক্ত বলতে পারি, বলতে চেয়েছি যে নির্দিষ্ট করে রেখার সংখ্যা বাদ দিতে হবে এবং নক্ষত্রগুলি প্রতিস্থাপন করা উচিত, বলুন, Xআমাদের জন্য এস কর্মসূচির কাজ?
ইলমারি করোনেন

1
@ বাকুরিউ আমি আপনার মন্তব্য বুঝতে পারি না। আপনি যদি ASCII তে কোনও প্রোগ্রাম লিখেন তবে প্রতিটি অক্ষর একটি বাইট। আপনি যদি ইউটিএফ -32 এ লিখেন তবে প্রতিটি অক্ষর 4 বাইট হয়। বাইটের মধ্যে সংক্ষিপ্ততম কোড , অক্ষর নয়, বর্তমান অনুমান অনুযায়ী জিতেছে। দেখে মনে হচ্ছে আপনি এনকোডিংটি প্রয়োজনীয় হয়ে উঠতে চান তবে কেন এটি প্রয়োজনীয় তা আমি দেখতে পাচ্ছি না। আমি আপনার মন্তব্য ভুল বুঝেছি?
রেইনবোল্ট

1
কিছু নিয়ম অনুপস্থিত কিছু উত্তরের ভিত্তিতে, আমি দুটি উদাহরণ যুক্ত করেছি এবং অতিরিক্ত স্পষ্টতার জন্য নিয়ম ব্লকের পুরো উদাহরণটি ব্লককে সরিয়েছি।
ভেস্কাহ

উত্তর:


5

গল্ফস্ক্রিপ্ট, 30 টি অক্ষর

n/(\(;n*'*'/{@.!'.'*+([]+@+}*\

অনলাইন চালান

উদাহরণ:

> qwertyuiopasdfghjklzxcvbnm
> 4
> ***** * ***
> *   * * *
> *   * * *
> ***** * ***

qwert y uio
p   a s d
f   g h j
klzxc v bnm

> qwertyuiopasdfghjklzxcvbnm
> 1
> ***** * ***

qwert y uio
pasdfghjklzxcvbnm

> qwerty
> 2
> ***** * ***
> *   * * *

qwert y ...
.   . . .

10

পার্ল 6: 60 অক্ষর সম্পাদনা : 38 পয়েন্ট (নীচে দেখুন)

  #C#O     D#E#G#O       #L#
#F    #.#S#       T#A#C#K
  get\     .subst(       "*"
,{    shift       BEGIN [
  get\     .comb,\       "."
xx    * ]},       :g)\ .\
  say\     xx get\       ()\
#E    #X#C#       H#A#N#G
  #E#.     #C#O#M#       #!#

আপনি যদি আমার ভয়ঙ্কর শিল্প দক্ষতার প্রশংসা না করেন তবে এখানে গল্ফ রয়েছে:

get.subst("*",{shift BEGIN [get.comb,"."xx*]},:g).say xx get

এটি মূল্যায়নের সময়গুলির সাথে অদ্ভুত কাজ করে।

প্রথমত, BEGINকীওয়ার্ডটি [get.comb, "." xx *]প্রথমে মূল্যায়ন করতে বাধ্য করে, একটি অ্যারেতে "কোড" তৈরি করে এমন অক্ষরের তালিকা তৈরি করে, এর পরে অসীম পরিমাণ অনুসরণ করে "."

এরপরে, getএএসসিআইআই আর্ট টেমপ্লেটের লাইনের সংখ্যা পেয়ে শেষে প্রান্তটি মূল্যায়ন করা হয়। xxঅপারেটর প্রোগ্রাম প্রথম অংশ অনেক বার পুনরাবৃত্তি করে। আপনি যখন বুঝতে পারবেন যে এটির code() xx count()জন্য মূলত চিনি code() for 1..count(): count()এটি প্রথমে মূল্যায়ন করা উচিত This

শেষ অবধি, getপ্রোগ্রামের শুরুতে ASCII আর্ট টেম্পলেটটির একটি লাইন পাওয়া যায় এবং "*"আমরা সমস্ত কিছুর আগে তৈরি অ্যারের শুরুতে স্থান পরিবর্তন করে একটি মান সহ প্রতিস্থাপিত করি {shift BEGIN …}

সম্পাদনা করুন:

কমান্ড লাইন সুইচটির জন্য 37 টি অক্ষর এবং আরও একটিতে গল্ফ হয়েছে:

perl6 -pe's:g[\*]=shift BEGIN [get.comb,"."xx*]'

এটি আসল হিসাবে একই ধারণা, -pপ্রতিটি লাইনের উপর সুইচটি পুনরাবৃত্তি করে ( BEGIN"কোড" এ পড়ার পরে ), এবং *মুদ্রণের আগে "কোড" থেকে পরবর্তী অক্ষরের সাথে সমস্তগুলি প্রতিস্থাপন করে। এর জন্য ইনপুট ফর্ম্যাটটিতে বিন্যাসের লাইনের সংখ্যা অন্তর্ভুক্ত করা উচিত নয়।


6

রুবি ২.০, 53 52 অক্ষর

c=gets.chop
$><<gets($n).gsub(?*){c.slice!(0)||?.}+c

অনুমান অনুসারে, 'পংক্তির সংখ্যা' পরামিতি ব্যবহার করবেন না।

উদাহরণ রান:

qwertyuiopasd
***** * ***
*   * * *
*   * * *
***** * ***

আউটপুট:

qwert y uio
p   a s d
.   . . .
..... . ...

1
./ascii.rb: line 2: syntax error near unexpected token `(' ./ascii.rb: line 2: `puts gets($n).gsub(?*){c.slice!(0)||?.},c'
চার্লস

@ চার্লস আমি যে ত্রুটিটি রুবি ইনস্টল করেছি তার কোনও সংস্করণে পেয়েছি বলে মনে হচ্ছে না। আইডোনটিতে কোডটি এখানে চলছে: ideone.com/3HG3Fb
পল প্রেস্টিজ 6'14

অদ্ভুত। আইডোন ভাল কাজ করে। যাই হোক, আপনি প্রতিস্থাপন করে CHAR (স্থান) সংরক্ষণ করতে পারবেন puts সঙ্গে $><<এবং পরিবর্তন ,একটি থেকে শেষে+
এমন নয় যে চার্লস

@ চার্লস শুভ কল। ধন্যবাদ!
পল প্রেস্টিজ 6:44

2

পাওয়ারশেল , 63 86 83 82 বাইট

+20 বাইট ধন্যবাদ @ ভেস্কাহ

param($s,$p)-join($p|% *ht($s|% Le*)'*'|% t*y|%{if($_-eq42){$_=$s[$i++]}"$_."[0]})

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

কম গল্ফড:

param($string,$pattern)

$chars = $pattern |
    % PadRight ($string|% Length) '*' |
    % toCharArray |
    % {
        if($_-eq42){$_=$string[$i++]}    # $_ can become $null
        "$_."[0]                         # $_ or '.' if $_ is $null
    }
-join($chars)


2

টি-এসকিউএল, 142 বাইট

@h ইনপুট পাঠ্য

@ প্যাটার্নটি

DECLARE @h varchar(max)='qwertyuiopasdfg'
DECLARE @ varchar(max)='
***** * ***
*   * * *
*   * * *
***** * ***'

WHILE @ like'%*'SELECT @=left(@,charindex('*',@)-1)+left(@h+'.',1)+stuff(@,1,charindex('*',@),''),@h=substring(@h,2,999)PRINT
concat(@,'
'+@h)

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



1

জাভাস্ক্রিপ্ট - 199

text="qwertyuiopasdfghjklzxcvbnm";
pattern="***** * ***\n*   * * *\n*   * * *\n***** * ***";

function p(a,c){z=c.length,y=a.length,x=0;for(i=z;i-->0;)if(c[i]=="*")x+=1;if(x-y>0)for(i=x-y;i-->0;)a+=".";for(;i++<x;)c=c.replace(new RegExp("[*]"),a[i]);console.log(c);console.log(a.substring(x))}

p(text,pattern);

প্যাটার্নে ব্যবহার না করা হলে টেক্সট ইনপুটগুলিতে অতিরিক্ত অক্ষরগুলি আউটপুট দেয়, প্যাডযুক্ত ব্যবহার করে ""। যদি যথেষ্ট না হয়

সম্পাদনা: পাঠ্য এবং প্যাটার্ন গ্রহণ করে এমন একটি ফাংশন হিসাবে পরিবর্তিত


4
চমৎকার ... তবে এটি হার্ড-কোডেড ইনপুট ব্যবহার করে।
TheDoctor

আমি জেএস থেকে স্ট্যান্ডিন কীভাবে পরিচালনা করব তা নিশ্চিত ছিলাম না, বিশেষত নতুন লাইনের সাথে। পরামর্শ?
ম্যাট

@ ম্যাট নোড? মাকরশা টাকা?
চার্লস

সম্ভবত এটি একটি ফাংশন তৈরি করছে ...
থিওডাক্টর

4
136:function p(a,c){x=c.split(s='*').length-1;for(i=x-a.length;i--;)a+='.';for(;i++<x;)c=c.replace(s,a[i]);console.log(c+'\n'+a.substring(x))}
মাইকেল এম

1

জাভাস্ক্রিপ্ট (ES6) - 96 87

r=(c,p)=>{c=0+c;console.log(p.replace(/\*/g,t=>(c=c.substr(1),c[0]||'.'))+c.substr(1))}

দ্রষ্টব্য: ওপির পরামর্শ অনুসারে , আমি একটি ফাংশন ব্যবহার করছি। তবে যদি এটির কোনও প্রোগ্রামের প্রয়োজন হয় তবে এখানে একটি 93 টি চরিত্র সমাধান রয়েছে

c=0+(x=prompt)();p=x();console.log(p.replace(/\*/g,t=>(c=c.substr(1),c[0]||'.'))+c.substr(1))

এডিআইটি 1: বড় পরিবর্তন, আমি কেন জানি না যে আমি প্রথমবারের মতো এটি উপলব্ধি করতে পারি নি: পি 40 অক্ষর সংরক্ষণ করেছেন।


ব্যবহার :

// r(code, pattern)
r("qwertyuiopasdfghjklzxcvbnm", "***** * ***\n*   * * *\n*   * * *\n***** * ***\n** ** **)

পরীক্ষার ইনপুট : (অনুমান অনুসারে অপ্রয়োজনীয় numberচ্ছিক নম্বর ছাড়াই)

qwertyuiopasdfghjklzxcvbnm
***** * ***
*   * * *
*   * * *
***** * ***
** ** **

আউটপুট :

qwert y uio
p   a s d
f   g h j
klzxc v bnm
.. .. ..      // not much text was there to fill *s - replaced with dots as per spec

অবহেলিত কোড :

function run(code, pattern){
  code = "0" + code;  // prepend a zero; useful for the substring operation ahead

  pattern = pattern.replace(/\*/g, function(){  // replace the dots
    // by removing the first letter of code
    // and replacing dot with the first-letter of leftover code 
    // and if it isn't there (code finished)
    // return a dot

    code = code.substr(1); 
    return c[0] || '.';
  });
  }

  // after this operation; code contains the last letter of the org. code

  console.log(  p +  // the pattern has now code
                "\n" +   // and a newline
                c.substr(1) // if there is more than one letter of code left; display it
             );
}

ব্যবহারকারীদের কাছ থেকে কোনও পরামর্শ শুনে খুব ভাল লাগবে :)


1

পার্ল, 70 টি অক্ষর

@_=split'',<>=~s/\n//r;<>;print/\*/?shift@_||'.':$_ for map{split''}<>

বা, বাউন্ডারি চেক ছাড়াই, 56 টি অক্ষর

@_=split'',<>;<>;print/\*/?shift@_:$_ for map{split''}<>

দ্রষ্টব্য, এই কোডটি অনুমান অনুসারে দ্বিতীয় লাইন ব্যবহার করছে না এবং তিনটি অক্ষর দ্বারা সংক্ষিপ্ত করা যেতে পারে <>;


1

ব্যাশ, 166 156 111 106

স্ট্যান্ডার্ড ইনপুট থেকে পড়া, একটি লাইন গণনা নেয় না। ইনপুট প্রথম লাইনটি আপনি কোডটি ascii শিল্প স্থাপন করতে চান, পরবর্তী সমস্ত লাইন @অক্ষর সমন্বিত ascii শিল্প হয় । ইনপুটটির সর্বাধিক দৈর্ঘ্যের 999 অক্ষর রয়েছে এবং এতে ফোরওয়ার্ড স্ল্যাশ থাকার অনুমতি নেই । (আমি ব্যবহার না করা *বা #বাশের তাদের বিশেষ অর্থ রয়েছে বলে বেছে নিয়েছি )।

read -n999 -d/ i p
while [[ $p =~ @ && -n $i ]];do
p="${p/@/${i:0:1}}"
i=${i:1}
done
tr @ .<<<"$p"
echo $i

সতর্কতা: এই প্রোগ্রামটি নামক একটি ফাইল ব্যবহার করে p। প্রোগ্রামটি কার্যকর করার পরে, মুছুন p- এটি দ্বিতীয়বার প্রোগ্রামটি চালানোর পরে এটি বিভ্রান্ত করবে।

এখানে বেশিরভাগ কাজই সম্পন্ন করে

p="${p/@/${i:0:1}}"
i=${i:1}

প্রথম লাইনটি @কোডের প্রথম চরিত্রের সাথে শিল্পে প্রথম স্থান করে । দ্বিতীয় লাইন কোডের প্রথম অক্ষরটি সরিয়ে দেয়।

যদি আকারটি পূরণ করার জন্য পর্যাপ্ত কোড না থাকে তবে মূল আসকি শিল্প আউটপুট পরে একটি নতুন লাইন প্রিন্ট করা হয় echo $i


1

সি, 98 , 91 টি অক্ষর

এখানে 100 টি অক্ষরের নীচে একটি দুর্দান্ত সোজা-ফরোয়ার্ড সি সমাধান solution এটি লাইন গণনা ইনপুট ব্যবহার করে না। (অন্যথায় দ্বিতীয় অপ্রয়োজনীয় পায় () প্রয়োজন হবে)।

char b[999],*s;c;main(){gets(s=b);while(~(c=getchar()))putchar(c^42?c:*s?*s++:46);puts(s);}

ungolfed:

char b[999],*s;c;
main(){
    gets(s=b);
    while(~(c=getchar()))
        putchar(c^42?c:*s?*s++:46);
    puts(s);
}

আপনি 7 বাইট সংরক্ষণ করার puts(s)পরিবর্তে ব্যবহার করতে পারেন printf("%s",s)
nyuszika7h

@ nyuszika7h ধন্যবাদ! তবে অতিরিক্ত \nসমস্যা আছে কিনা তা আমি জানি না ।
মারকডিফিয়ান্ট

1

পাইথন ২.7, 165 155 150 138 ১১৯ টি অক্ষর

ঠিক আছে, বেশ তবে তবে আমি অনুমান করি এটি পাইথনের সাথে করার সবচেয়ে ক্ষুদ্রতম উপায়।

import sys
r=raw_input
l=list(r())
w=sys.stdout.write
for c in"\n".join([r()for _ in[1]*input()]):w(c=='*'and(l and l.pop(0)or'.')or c)
w("".join(l))

সম্পাদনা করুন: নতুন কম ব্যবহৃত বাইট সহ 1.0.1 সংস্করণ:

Edit2: map(r,['']*input()) 2 পরিবর্তে [r()for _ in[1]*input()]এবং অব্যবহৃত আমদানি সরানো হয়েছে

সম্পাদনা 3: '>'*input() পরিবর্তে ['']*input()একটি চরিত্র সংরক্ষণ এবং প্যাটার্নের জন্য প্রম্পট অক্ষর যুক্ত করুন :)

r=raw_input
l=list(r())
print''.join(map(lambda c:c=='*'and(l and l.pop(0)or'.')or c,"\n".join(map(r,'>'*input())))+l)

আপনি 9 টি বাইট সংরক্ষণ করার (['.']+l).pop(0)পরিবর্তে ব্যবহার করতে পারেন (len(l)and l.pop(0)or'.')। এবং 1 টি বাইট সংরক্ষণ করার input()পরিবর্তে int(r())
nyuszika7h

ধন্যবাদ input! দুর্ভাগ্যক্রমে আপনার প্রথম পরামর্শ কার্যকর হয় না কারণ এটি স্ট্রিং দৈর্ঘ্য> 0 পর্যন্ত দীর্ঘ বিন্দুগুলিকে আউটপুট করে।
এভল

আমি দেখতে পাচ্ছি কেন আমার পরামর্শটি সঠিক নয়। ব্যবহার করে দেখুন (l+['.']).pop(0)পরিবর্তে, কিন্তু যে যদি পারেন কাজ করে না, আপনি এখনও 4 বাইট সংরক্ষণ দ্বারা ব্যবহার করতে পারেন l andপরিবর্তে len(l)and
nyuszika7h

(l+['.']).pop(0)lকেবলমাত্র প্রথম চরিত্রটি মুদ্রিত থেকে উপাদানগুলি সরিয়ে দেয় না তবে lশর্তটি কাজ করে :)
all

1

সি # (ভিজ্যুয়াল সি # ইন্টারেক্টিভ সংকলক) , 122 বাইট

var n=ReadLine();int k=0;foreach(var z in In.ReadToEnd())Write(z>33?(n+new string('.',999))[k++]:z);Write(n.Substring(k));

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


সুনির্দিষ্ট এবং অন্যান্য উত্তরগুলি না করার কারণে আপনি সম্ভবত "\n"+একই লাইনে অতিরিক্ত অক্ষর যুক্ত করতে
খাঁজটি করতে পারেন

0

05 এ বি 1 , 18 17 15 বাইট

s0¢.$«0¹S.;0'.:

কোডটিকে প্রথম ইনপুট হিসাবে, দ্বিতীয় হিসাবে প্যাটার্ন নেয় (সহ) 0 পরিবর্তে এর )# )।

এটি অনলাইনে চেষ্টা করুন বা সমস্ত পরীক্ষার কেস যাচাই করুন

বিপরীত ক্রমে ইনপুট গ্রহণ করে 18 15 বাইট বিকল্প:

0¢.$¹ì0IS.;0'.:

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

ব্যাখ্যা:

s                # Swap with implicit inputs, so the stack order is now: [code, pattern]
 0¢              # Count the amount of "0" in the pattern
   .$            # Remove that many leading characters from the code
     «           # Append it to the (implicit) pattern input
      0¹S.;      # Replace every "0" one by one with the characters of the first code input
           0'.: '# Then replace any remaining "0" with "."
                 # (after which the result is output implicitly as result)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.