বিপরীত ইন্ডেন্টেশন


63

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

            function fib(n) {
        var a = 1, b = 1;
        while (--n > 0) {
    var tmp = a;
    a = b;
    b += tmp;
    if (a === Infinity) {
return "Error!";
    }
        }
        return a;
            }

তবে কোনও কারণে নোটপ্যাডের স্বয়ংক্রিয়ভাবে এটি করার কোনও সেটিংস নেই, তাই আমার কাছে এটি করার জন্য আমার একটি প্রোগ্রামের প্রয়োজন।

বিবরণ

সাবমিশনগুলিকে ইনপুট হিসাবে একটি কোড স্নিপেট নিতে হবে, ইনডেন্টেশনটি বিপরীত করতে হবে এবং ফলাফলের কোডটি আউটপুট করতে হবে।

এটি নিম্নলিখিত পদ্ধতি দ্বারা করা হয়:

  • কোডটিকে লাইনে ভাগ করুন। প্রতিটি লাইন শূন্য বা আরও বেশি স্পেস দিয়ে শুরু হবে (কোনও ট্যাব থাকবে না)।

  • কোডে সমস্ত অনন্য ইন্ডেন্টেশন স্তরগুলি সন্ধান করুন। উদাহরণস্বরূপ, উপরের উদাহরণের জন্য, এটি হবে

    0
    4
    8
    12
    
  • ইন্ডেন্টেশন স্তরের এই তালিকার ক্রমটিকে বিপরীত করুন এবং বিপরীত তালিকাটিকে মূল তালিকায় মানচিত্র করুন। এটি কথায় ব্যাখ্যা করা শক্ত, তবে উদাহরণস্বরূপ, এটির মতো লাগবে

    0  — 12
    4  — 8
    8  — 4
    12 — 0
    
  • এই কোডিংটি মূল কোডটিতে প্রয়োগ করুন। উদাহরণস্বরূপ, 0-স্পেস-ইন্ডেন্টেশন সহ একটি লাইন 12 স্পেস দ্বারা ইন্টেন্টেড হবে, 4 স্পেস 8 স্পেস ইত্যাদি হয়ে যাবে etc.

ইনপুট আউটপুট

আপনি চাইলে ইনপুট এবং আউটপুট সরবরাহ করা যেতে পারে (STDIN / STDOUT, ফাংশন প্যারামিটার / রিটার্ন মান ইত্যাদি); যদি আপনার ভাষা মাল্টলাইন ইনপুট সমর্থন করে না (বা আপনি কেবল চান না), আপনি |পরিবর্তে লাইনগুলি পৃথক করতে অক্ষরটি ব্যবহার করতে পারেন ।

ইনপুটটিতে কেবল প্রিন্টযোগ্য এএসসিআইআই + নিউলাইন থাকবে, এবং এতে খালি লাইন থাকবে না।

পরীক্ষার মামলা

ইনপুট:

function fib(n) {
    var a = 1, b = 1;
        while (--n > 0) {
            var tmp = a;
            a = b;
            b += tmp;
            if (a === Infinity) {
                return "Error!";
            }
        }
    return a;
}

আউটপুট: উপরের উদাহরণ কোড।

ইনপুট:

a
  b
  c
d
   e
        f
  g
   h

আউটপুট:

        a
   b
   c
        d
  e
f
   g
  h

ইনপুট:

1
 2
  3
 2
1

আউটপুট:

  1
 2
3
 2
  1

ইনপুট:

  foo

আউটপুট:

  foo

21
এর "জাভাস্ক্রিপ্ট" "জাভা স্ক্রিপ্টিং" নয়: /
অপ্টিমাইজার 21

75
@ অপ্টিমাইজার আমি দেখতে পাচ্ছি যে প্রথম দুটি অনুচ্ছেদে যতটা সম্ভব লোককে উত্সাহিত করার আমার লক্ষ্য অর্জন করা হয়েছে। ;)
ডোরকনবব

7
1! = যত বেশি সম্ভব লোক।
অপ্টিমাইজার 21

23
@ জনডভোরাক একই ছেলেরা যারা বিধায়ক শৈলীর উদ্ধৃতি আবিষ্কার করেছেন তারা মনে করেন এটি একটি ভাল ধারণা।
রেইনবোল্ট

6
মনে হয়, এটি আরও দ্রুত। আসুন এটির জন্য একটি কমিটি নিযুক্ত করুন এবং আমরা এর উদ্দেশ্যটি ভুলে গিয়ে কয়েক বছর অপেক্ষা করব।
কনর ও'ব্রায়েন

উত্তর:


10

সিজেম, 43 39 36 35 বাইট

qN/_{_Sm0=#}%___&$_W%er]z{~S*@+>N}%

এটি খুব দীর্ঘ দেখায়। আমি নিশ্চিত যে আমি যথেষ্ট অপ্টিমাইজ করছি না !

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

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

দীর্ঘতম অংশটি হ'ল প্রতিটি লাইনে কতগুলি নেতৃস্থানীয় স্পেস রয়েছে তা নির্ধারণ করা কারণ সিজেএমের এটি করার সহজ উপায় নেই।

কোড সম্প্রসারণ:

qN/_                                      "Split the string on newline and take copy";
    {_Sm0=#}%                             "Map this code block on the copy";
     _Sm                                  "Copy the string and remove spaces from the copy";
        0=                                "Get first non space character";
          #                               "Gets its index in original string";
             ___                          "Get 3 copies of the above array";
                &$_W%                     "Get unique elements, sort, copy and reverse";
                     er                   "Transliterate unique sorted elements with";
                                          "the unique reverse sorted in the copy";
                       ]z                 "Get array of [row,
                                          " original number of leading spaces,
                                          " required number of leading spaces]";
                         {~S*@+>N}%       "For each above combination";
                          ~S*             " unwrap and get leading space string";
                             @+           " prepend to the row";
                               >          " remove original spaces";
                                N         " put newline";

এবং প্রশ্নের চেতনায় কোডের একটি বাস্তব সম্প্রসারণ:

                                          qN/_                                      "Split the string on newline and take copy";
                                {_Sm0=#}%                             "Map this code block on the copy";
                               _Sm                                  "Copy the string and remove spaces from the copy";
                             0=                                "Get first non space character";
                          #                               "Gets its index in original string";
                         ___                          "Get 3 copies of the above array";
                       &$_W%                     "Get unique elements, sort, copy and reverse";
                     er                   "Transliterate unique sorted elements with";
"the unique reverse sorted in the copy";
                ]z                 "Get array of [row,
" original number of leading spaces,
" required number of leading spaces]";
             {~S*@+>N}%       "For each above combination";
          ~S*             " unwrap and get leading space string";
        @+           " prepend to the row";
     >          " remove original spaces";
    N         " put newline";

মার্টিনের জন্য 7 বাইট এবং ডেনিসকে 1 বাইট ধন্যবাদ রক্ষা করেছে

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


১. {}#একটি বাগ রয়েছে: এটি একটি পূর্ণসংখ্যার ফেরত দেয় তবে এটি একটি দীর্ঘ ফিরিয়ে দেওয়া উচিত। হাস্যকরভাবে, i(পূর্ণসংখ্যাতে কাস্ট করা) এটি ঠিক করে। ২. যেহেতু ""#একই বাগ নেই, _Sm0=#এটি একটি বাইট ছোট sh
ডেনিস

@ ডেনিস হ্যাঁ, বাগটি অদ্ভুত। কাজের জন্য ধন্যবাদ!
অপ্টিমাইজার 7

2
এই প্রসারিত ইনডেন্টেশন পড়া এত সহজ! আপনি এটি বিপরীত করা উচিত!
ডিএলহ

13

পাইথন 2 - 137 131 বাইট

i=raw_input().split('|')
f=lambda s:len(s)-len(s.lstrip())
d=sorted(set(map(f,i)))
for l in i:print' '*d[~d.index(f(l))]+l.lstrip()

এর |পরিবর্তে ইনপুট নেয় \n

ব্যাখ্যা

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

শেষ লাইনটি আরও মজাদার।

                                 l               # string with the line
                               f(l)              # amount of leading whitespace
                       d.index(f(l))             # where it is in list of whitespace amounts
                      ~d.index(f(l))             # bitwise NOT (~n == -(n+1))
                    d[~d.index(f(l))]            # index into the list (negative = from end)
           print' '*d[~d.index(f(l))]            # print that many spaces...
           print' '*d[~d.index(f(l))]+l.lstrip() # plus everything after leading whitespace
for l in i:print' '*d[~d.index(f(l))]+l.lstrip() # do the above for every line


@ ফ্রাইয়া ধন্যবাদ :)
আন্ডারগ্রাউন্ডোমোরিলে

1
অজগর 3 এ এটি সমস্ত সূক্ষ্ম বলে মনে হচ্ছে যা আপনাকে 2 বাইট বাঁচাতে হবে ( ()4 এর জন্য 4 টি সংরক্ষণ করতে হবে raw_)
FryAmTheEggman

1
f(s)for s in iহওয়া উচিত map(f,i)
ফেডারস

1
এক টুকরো ম্যাজিক: এর d=[];d+=set(L)সংক্ষিপ্ত সংস্করণ d=sorted(set(L))
xnor

7

জাভাস্ক্রিপ্ট, ES6, 113 103 101 বাইট

আমি নিশ্চিত যে এটি কমপক্ষে আরও কিছুটা এগিয়ে যেতে পারে, তবে এখানে রয়েছে।

পাইথনকে মারধর করে 101 বাইট জেএস সলিউশন হবে তা কখনই ভাবেনি!

f=a=>(b=c=[...Set(a.match(r=/^ */gm).sort())],c.map((x,i)=>b[x]=c.slice(~i)[0]),a.replace(r,x=>b[x]))

এটি নামের একটি পদ্ধতি তৈরি করে fযা ইনপুট স্ট্রিং সহ কল ​​করা যেতে পারে। আপনি যদি সর্বশেষতম ফায়ারফক্সে থাকেন তবে আপনার কাছে টেম্পলেট স্ট্রিং রয়েছে এবং আপনি এই পদ্ধতিটিকে কল করতে পারেন

f(`a
  b
  c
d
   e
        f
  g
   h`)

অন্যথায়, আপনি এটি পছন্দ করতে পারেন

f("a\n\
  b\n\
  c\n\
d\n\
   e\n\
        f\n\
  g\n\
   h")

বা, নীচে স্নিপেট চেষ্টা করুন:

g=_=>O.textContent=f(D.value)

f=a=>(b=c=[...Set(a.match(r=/^ */gm).sort())],c.map((x,i)=>b[x]=c.slice(~i)[0]),a.replace(r,x=>b[x]))
<textarea id=D></textarea><button id=B onclick=g()>Inverse!</button>
<pre id=O></pre>


আপনি রেগেক্সকে ভেরিয়েবল হিসাবে সংরক্ষণ করে একটি কুপস বাইট সংরক্ষণ করতে পারেন, কারণ এটি দুটিবার ব্যবহৃত হয় (আপনার \sকোনও স্থানের অক্ষর দিয়ে প্রতিস্থাপন করতে সক্ষম হওয়া উচিত ) এবং xপ্রতিস্থাপন ফাংশনে চারপাশে প্রথম বন্ধনী সরিয়ে ফেলা যেতে পারে।
নিনজাবিয়ারমনেকি

@ এসএসএল জি, ধন্যবাদ! আমি কেন জানি কেন জানি না (x): /
অপটিমাইজার

আপনার দুজনেরই দরকার নেই bএবং cকরবেন? তারা কেবল যাইহোক একই অ্যারে উল্লেখ করে।
নীল

5

রুবি, 63 বাইট

->s{l=s.scan(r=/^ */).uniq.sort;s.gsub r,l.zip(l.reverse).to_h}

এটি একটি নামবিহীন ফাংশন সংজ্ঞা দেয় যা একটি স্ট্রিং গ্রহণ করে এবং প্রদান করে। আপনি এটি যুক্ত করে ["string here"]বা এটিকে একটি ভেরিয়েবলকে বরাদ্দ করে এবং তারপরে সেই পরিবর্তনশীলকে কল করে কল করতে পারেন ।

এটি কীভাবে কাজ করে: s.scan(r=/^ */)সমস্ত নেতৃস্থানীয় স্পেস এবং স্টোরের একটি তালিকা দেয় যা rপরবর্তীতে ব্যবহারের জন্য পুনরায় ব্যবহার করে। uniqসদৃশগুলি মুছে দেয়। sort... প্রকার।

এখন শেষ দিকে যান, l.zip(l.reverse)জোড়গুলির একটি অ্যারে দেয় যা আমরা প্রতিস্থাপন করতে চাই। to_hজোগুলিকে কী-মূল্যের জোড় হিসাবে ব্যাখ্যা করে এটি একটি হ্যাশে পরিণত হয়।

s.gsubপ্রতিস্থাপনটি সন্ধান করার জন্য সেই হ্যাশটিকে লিক আপ টেবিল হিসাবে ব্যবহার করে এখন রেজেক্সের সমস্ত মিল (সমস্ত শীর্ষস্থানীয় স্পেস) প্রতিস্থাপন করুন।



2

জাপট -R , 27 বাইট

·
mâ\S
Vâ n
Ëx2 iSpWg~WbVgE

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

আনপ্যাকড এবং কীভাবে এটি কাজ করে

Input: U = multiline string

qR    Split by newline and implicit assign to U

mâ\S
m     Map over U...
 â\S    .search(/\S/); first index of non-whitespace char
      Implicit assign to V (V = array of indentations)

Vâ n  Take unique elements of V, sort, and implicit assign to W

mDEF{Dx2 iSpWg~WbVgE
mDEF{                 Map over U...
     Dx2                Trim left
         iSp            Indent by this many spaces...
                 VgE      Find the current indentation stored in V
               Wb         Find its index on W
            Wg~           Take the opposite element on W

-R    Join with newline

এটি সত্যিই কীভাবে কাজ করে

                 Input: U = multiline string

                 qR    Split by newline and implicit assign to U

                 mâ\S
                 m     Map over U...
               â\S    .search(/\S/); first index of non-whitespace char
         Implicit assign to V (V = array of indentations)

                 Vâ n  Take unique elements of V, sort, and implicit assign to W

                 mDEF{Dx2 iSpWg~WbVgE
                 mDEF{                 Map over U...
            Dx2                Trim left
      iSp            Indent by this many spaces...
VgE      Find the current indentation stored in V
 Wb         Find its index on W
     Wg~           Take the opposite element on W

                 -R    Join with newline

1

স্কালা, 176 171

def g(n:String)={val a=n.split('|').map(a=>a.prefixLength(' '==)->a)
(""/:a){case(s,(l,p))=>val b=a.unzip._1.distinct.sorted
s+" "*b.reverse(b.indexOf(l))+p.drop(l)+'\n'}}

এটি শেষে একটি অতিরিক্ত নিউলাইন যুক্ত করবে। লাইনের শেষে যদি আমাকে ফাঁকা স্থান সংরক্ষণ না করতে হয় তবে আমি এটি 167 এ পেতে পারি:

def t(n:String)={val a=n.split('|').map(a=>a.prefixLength(' '==)->a.trim)
(""/:a){(s,l)=>val b=a.unzip._1.distinct.sorted
s+" "*b.reverse(b.indexOf(l._1))+l._2+'\n'}}

Ungolfed:

      def reverseIndent(inString: String): String = {
    val lines = inString.split('\n')
    val linesByPrefixLength = lines.map { line =>
  line.prefixLength(char => char == ' ') -> line
    }
    val distinctSortedPrefixLengths = linesByPrefixLength.map(_._1).distinct.sorted
    val reversedPrefixes = distinctSortedPrefixLengths.reverse
    linesByPrefixLength.foldLeft("") { case (string, (prefixLength, line)) =>
  val newPrefixLength = reversedPrefixes(distinctSortedPrefixLengths.indexOf(prefixLength))
  val nextLinePrefix = " " * newPrefixLength
  string + nextLinePrefix + line.substring(prefixLength) + '\n'
    }
      }

1

পাওয়ারশেল , 112 বাইট

$x=@($args|sls '(?m)^ *'-a|% m*|% v*|sort -u)
[regex]::Replace($args,'(?m)^ *',{$x[-1-$x.IndexOf($args.Value)]})

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

কম গল্ফড:

$xIdents=@($args|select-string '(?m)^ *'-AllMatches|% matches|% value|sort -unique) # get a sorted set of indentations
[regex]::Replace($args,'(?m)^ *',{$xIdents[-1-$xIdents.IndexOf($args.Value)]})    # replace each indentation with opposite one


0

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

অপরিশোধিত কোডটি $vভেরিয়েবলে সংরক্ষণ করা উচিত :

<?php $f='preg_replace';$f($p='#^ *#me','$i[]='.$s='strlen("$0")',$v);$a=$b=array_unique($i);sort($a);rsort($b);echo$f($p,'str_repeat(" ",array_combine($a,$b)['.$s.'])',$v);

এখানে অসম্পূর্ণ এবং মন্তব্য করা সংস্করণটি রয়েছে:

<?php
// Get the level of indentation for each line
$preg_replace = 'preg_replace';
$pattern = '#^ *#me';
$strlen = 'strlen("$0")';
$preg_replace($pattern, '$indentationLevelsOldList[] = '. $strlen, $value);

// Create an array associating the old level of indentation with the new expected one
$sortedArray = array_unique($indentationLevelsOldList);
$reverseSortedArray = $sortedArray;

sort($sortedArray);
rsort($reverseSortedArray);

$indentationLevelsNewList = array_combine($sortedArray, $reverseSortedArray);

// Print the correctly indented code
echo $preg_replace($pattern, 'str_repeat(" ", $indentationLevelsNewList['. $strlen .'])', $value);

আমি বোধহয় এত খারাপ কিছু লিখিনি। আমি লজ্জিত.


0

জাভাস্ক্রিপ্ট, 351

var i=0;var a=$("#i").html().split("\n");var b=[];for(;i<a.length;i++){j=a[i].match(/\s*/)[0];if(b.indexOf(j)<0){b.push(j);}}b.sort(function(a,b){return a - b;});var c=b.slice().reverse();var d="";for(i=0;i<a.length;i++){d+=a[i].replace(/\s*/,c[b.indexOf(a[i].match(/\s*/)[0])])+"\n";j=a[i].search(/\S/);if(b.indexOf(j)<0){b.push(j);}}$("#i").html(d);

অবরুদ্ধ সংস্করণ:

var i = 0;
var a = $("#i").html().split("\n");
var b = [];
for (; i < a.length; i++) {
  j = a[i].match(/\s*/)[0];
  if (b.indexOf(j) < 0) {
    b.push(j);
  }
}
b.sort(function(a, b) {
  return a - b;
});
var c = b.slice().reverse();
var d = "";
for (i = 0; i < a.length; i++) {
  d += a[i].replace(/\s*/, c[b.indexOf(a[i].match(/\s*/)[0])]) + "\n";
  j = a[i].search(/\S/);
  if (b.indexOf(j) < 0) {
    b.push(j);
  }
}
$("#i").html(d);

পরীক্ষামূলক


0

পার্ল 5, 112

111 + 1 এর জন্য -n( -Eবিনামূল্যে)

@{$.[$.]}=/( *)(.*)/;++$_{$1}}{map$_{$_[$#_-$_]}=$_[$_],0..(@_=sort keys%_);say$_{$.[$_][0]}.$.[$_][1]for 0..$.

আমি নিশ্চিত যে এটি কম স্ট্রোকে করা যেতে পারে, তবে এই মুহুর্তে আমি তা দেখতে পাচ্ছি না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.