中かっこを右中かっこに変換(悲しい中かっこ)


26

右中括弧は、中括弧とセミコロンがすべてaaファイルの右側の単一ポイントに揃えられるコードブラケットのスタイルです。

サンプル画像はこちら

一般的に、これはいくつかの理由で悪い習慣と考えられています。

チャレンジ

任意の方法で複数行の文字列を取得し、そのブレーススタイルを右手ブレースに変換します。

この課題では、Javaコードでのみ動作する必要がありますが、理論的にはブレースとセミコロンを使用するコードで動作するはずです。

すべての{};文字を連続して取得する必要がありますが、それらの間に空白を入れてください。例えば。}}; } }\n\t\t}、および空白を使用してファイルの右側にそれらを並べます。

例えば:

a {
b;
{c

になるはずです

a {
b ;{
c

または、より抽象的に、すべての左から任意のすべての空白をプッシュします {};右へ、。

それ以外の場合は、行のインデントを保持する必要があります。移動後の空白のみを含む行{};オプションで削除できます。

例えば:

a{
    b{
        c;
    }
}
d;

どちらかになります

a        {
    b    {
        c;}}
d        ;

または

a        {
    b    {
        c;}}


d        ;

右に押すと、すべての {};文字が最も長い行よりも短くない位置に揃えられます。それ以降のスペースは許容されます。

したがって、以下はすべて受け入れられます。

a {
bc;

a  {
bc ;

a   {
bc  ;

等...

コードの行には、{};他の非ウィットスペース文字の間に文字が含まれている場合があります。この場合の処理​​は必要ありませんが、気になる場合はそのままにしておく必要があります。行には{};文字がまったく含まれない場合もあり、これは正しく処理する必要があります。以下に示すように。

a {
b ;
c
d }

コードレビューが必要ないためが私たちが行っている恐ろしいことを見、コードをできるだけ小さくする必要があります。

例/テストケース

汎用Java

public class HelloWorld{
       public static void main(String[] args){
           System.out.println("Hello, World!");
       }
}

になる...

public class HelloWorld                        {
    public static void main(String[] args)     {
        System.out.println("Hello, World!")    ;}}

画像自体

public class Permuter{
    private static void permute(int n, char[] a){
        if (n == 0){
            System.out.println(String.valueOf(a));
        }else{
            for (int i=0; i<= n; i++){
                permute(n-1, a);
                swap(a, n % 2 == 0 ? i : 0, n);
            }
        }
    }
    private static void swap(char[] a, int i, int j){
        char saved = a[i];
        a[i] = a[j];
        a[j] = saved;
    }
}

になる...

public class Permuter                                {
    private static void permute(int n, char[] a)     {
        if (n == 0)                                  {
            System.out.println(String.valueOf(a))    ;}
        else                                         {
            for (int i=0; i<= n; i++)                {
                permute(n-1, a)                      ;
                swap(a, n % 2 == 0 ? i : 0, n)       ;}}}
    private static void swap(char[] a, int i, int j) {
        char saved = a[i]                            ;
        a[i] = a[j]                                  ;
        a[j] = saved                                 ;}}

完全に汎用的なPythonではない

対照的に

def Main():
    print("Hello, World!");

Main();

になる...

def Main():
    print("Hello, World!")    ;
Main()                        ;

ノート

  • 標準の抜け穴が適用されます
  • 標準IOが適用されます
  • これはなので、バイト単位の最短プログラムが勝ちです!
  • 私は右手ブレーススタイルのプログラミングに関連する損害について責任を負いません
  • 楽しむ!

メモを編集

私はチャレンジの詳細を書き直しました。うまくいけば、ルールに対する誰の見方も壊さなかったと思います。これは、はるかに明確で自己矛盾の少ない仕様でなければなりません。


複数のセミコロンを含む行の判定は何ですか?何かのようなint a=0;System.out.println(a);
バリューインク

2
サンプル画像のようにforループを処理する必要がない場合、それはチャレンジに最適な画像ではないでしょうか?
デニス

1
問題の画像のように見えますがから来たこの例で追跡しました、このフォローアップより複雑な例があり、
レイTOAL

2
;{}キャラクターが別々の行にある場合、キャラクターをまとめることを明確にすることができます(ルールからではなく、例から、そして実際に行が\t}、インデント保持が最後まで移動しないことを意味する場合}前の行の)
クリスH

2
良い神、Java._のような冗長言語のために実際に誰も実際にこれを行っていないことを教えてください。
魔法のタコUr

回答:


5

V + Bashユーティリティ、64 62 61 60 62バイト

exコマンドをまとめてくれた@DJMcMayhemのおかげで1バイト節約

:se ve=all|%!wc -L
y$uò/^ *<93>[{};]
xk$pòò/<84> {};][{};]«$
lDî^R0|p

^R<C-r>0x12)の文字リテラルで、<84>is 0x84および<94>is 0x94です。

wc -Lほとんどの* nixベースのシステムで動作しますが、macOSでは動作しません。macOSの場合は、gwc -L brewを使用してcoreutilsを取得した後に実行する必要があります(まだ実行していない場合)。

オンラインでお試しください!(Java)

オンラインでお試しください!(Python)

オンラインでお試しください!(再びJava)

これによりすべての空白行が保持され、タブは処理されず、スペースのみが処理されます。

Hexdump:

00000000: 3a73 6520 7665 3d61 6c6c 7c25 2177 6320  :se ve=all|%!wc 
00000010: 2d4c 0a79 2475 f22f 5e20 2a93 5b7b 7d3b  -L.y$u./^ *.[{};
00000020: 5d0a 786b 2470 f2f2 2f84 207b 7d3b 5d5b  ].xk$p../. {};][
00000030: 7b7d 3b5d ab24 0a6c 44ee 1230 7c70       {};].$.lD..0|p

説明

まず、バッファ内の任意の場所にカーソルを移動できるようにする必要があるため、

:se ve=all|...

そして、これを別のexコマンドで連鎖させます |

入力の最も長い行の長さを取得する必要があります。これは、シェルコマンドを使用して実行できますwc -L

       ...|%!wc -L

これにより、現在のバッファ(入力を含む)がの結果で上書きされますwc -L。次のような出力が得られます。

            42

そして、カーソルが上の土地4の中で42。次にy$、カーソルの位置から行末までのテキストをヤンクして、この番号をコピーします。これにより、この番号がレジスタに保存され0ます。しかし、それについては後で。入力はこの番号に置き換えられるため、元に戻すにはundoを使用します。

入力が次のようになったとしましょう。

public class HelloWorld{
    public static void main(String[] args){
        System.out.println("Hello, World!");
    }
}

中括弧}をバッファーの最後からprintlnステートメントの直後に移動する必要があります。

ò                  " recursively do this until a breaking error:
 /^ *<93>[{};]     "   this compressed regex becomes /^ *\zs[{};]
                   "   this finds any character from `{};` after leading spaces
                   "   the cursor then goes to the `{};`

x                  "   delete character
 k$                "   go to the end of the line above
   p               "   and paste
    ò

正規表現が見つからない場合、ブレークエラーが発生し、次の原因による再帰から抜け出します。 òます。

次に、このプログラムの主要部分になります。すべてのブレースとセミコロンを移動し、質問で述べられているようにそれらを揃えます。

ò                  " starts recursion
 /<84> {};][{};]«$ "   compressed form of [^ {};][{};]\+$
                   "   finds a sequence of `{};`s at the end of the line with a non-`{};` char to preceding it
 l                 "   move the cursor 1 to the right (since we were on the non-`{};` char now)
  D                "   delete everything from this position to the end of line
                   "   the deleted text contains `{};`
   î               "   execute as normal commands:
    ^R0            "   contains what's in register `0`, ie the length of the longest line
       |           "   now go to the column specified by that number
        p          "   and paste the contents 
                   " implicit ending `ò`

繰り返しますが、この再帰は、正規表現がバッファ内で見つからなかった場合に発生するブレークエラーによって停止されます。

編集

  • D代わりに使用d$(最初にそれを逃した理由がわかりません)
  • [^(正規表現で)に圧縮<84>
  • を使用して\zs(圧縮して<93>)、$inを削除してバグを修正$xk$pò
  • 無駄な改行を削除しました
  • 正規表現を変更して、送信が新しいルールに準拠するようにし、2バイトを得ました

あなたが一緒にあなたの元のコマンドに参加する場合は、1つのバイトを救うことができる:se ve=all|%!wc -L
DJMcMayhem

@DJMcMayhemありがとう、TIL
Kritixi Lithos

4

ルビー、100 114 108バイト

ファイル名をコマンドライン引数として読み取ります。ファイル名が指定されていない場合は、STDINから読み取られます。タブを処理しません。

オンラインでお試しください!

f=$<.read.gsub(/[\s;{}]*$/){$&.tr"
 ",''}
$><<f.gsub(/(.*?)([;{}]+)$/){$1.ljust(f.lines.map(&:size).max)+$2}




@Pavel教えてくれてありがとう。ファイルにパイピングした後に見た2つの問題は、A。インデントされたcatchステートメントと、B。コードの最も長い行にインデントされすぎたセミコロンです。私はそれを修正するために必要なことだけを知っていると思います、ちょっと待ってください。(また、タブを処理できないこと、およびファイルにタブがあることを示すために仕様を更新しました。)
値インク

タブはありますか?私はちょうどそれを見つけて交換しましたが、変更はありませんでした。
パベル

3

Perl、90バイト

88バイトのコード+ -p0フラグ。

\@a[y///c]for/.*/g;s/(.*?)\K[{};]$/$"x(@a-$1=~y%%%c).$&/gme;1while s/ *
 *([{};]+)$/$1/m

オンラインでお試しください!

簡単な説明:
\@a[y///c]for/.*/g;最も長い行の長さをカウントします。y///c各行について、配列のインデックス(行のサイズ)にある要素を定義します@a。。最後に、の最大インデックス@a(つまりのサイズ@a)は、最も長い行のサイズです。
s/(.*?)\K[{};]$/$"x(@a-$1=~y%%%c).$&/gme置く{};行の末尾に文字を。
1while s/ *\n *([{};]+)$/$1/mmakeは、空行のブレースを上の行に移動します。

おかげ@primo最も長い行の長さを数えるために、ここからコードの先頭を部分的に「盗んだ」ます。


ない場合は、上記の中括弧は、彼らの前に、この答えはその行いません空白行まで戻って行かなければならない
KritixiのLithos

@KritixiLithos確かに、チャレンジが書き直される前は問題ありませんでした(チャレンジとコメントの両方から理解したことから)。とにかく、それは今修正されています(あなたが気づかなかった場合に備えて、すでに答えにコードを書いていました)。
ダダ

1

Python 2:228バイト

import re
g=re.search
def b(a):
    s,l="",a.split('\n')
    r=max([len(k)for k in l]) 
    for k in l:
        n,m=g('[;}{]',k),g('[\w]',k)
        if n:n=n.start()
        if m:m=m.start()
        if n>m and m!=None:s+="\n"+k[:n]+" "*(r-n)
        s+=k[n:]
    print s

ひどく長い。;{}前の行の最後に行くには孤独が必要だと気づいたとき、おそらく最初から始めたはずです。
クリスH

1

積み上げ、133バイト

'\s+([;{}])' '$1'repl lines{!n'[\s;{}]+$'match''join:n\'$'+del\,}"!tr:$size"!$MAXmap@k{e i:e[' 'k i#rpad]"!}map tr[' 'join]map'
'join

オンラインでお試しください!私はこれをかなり考えすぎているかもしれません... 明日もう一度見ます。いくつかの素晴らしいヒント:

  1. "!map次のトークンが単語で始まるかどうかに応じて、の代わりに1バイトまたは2バイトを節約することができます。ただし、配列の各アトムをマップする場合にのみ使用できます。ディープマップに似ています。
  2. スペースが引用された関数の後に必要とされていないので、$MAXmap同等です$MAX map順番にに相当します、[MAX] map。(各配列を最大要素にマッピングします。)

1

JavaScript(ESプロポーザル)、139 121バイト

f=
s=>s.replace(/^(.*?)\s*(([;{}]\s*)+)$/gm,(_,t,u)=>t.padEnd(Math.max(...s.split`
`.map(s=>s.length)))+u.replace(/\s/g,``))
<textarea rows=10 cols=40 oninput=o.textContent=f(this.value)></textarea><pre id=o>

Firefox 48 / Chrome 57 / Opera 44 / Safari 10 / Edge 15が必要padEndです。編集:@ValueInkのおかげで18バイトを保存しました。


s.replace(r,`$1`)行の長さを計算するときに本当に実行する必要がありますか?適切なパディングをいくらでも行えば十分なので、セミコロンと角かっこで行の長さ数えれば問題ありません。
バリューインク

0

PHP、201 194 185 172 167バイト

foreach($f=file(f)as$s)$x=max($x,strlen($a[]=rtrim($s,"{} ;
")));foreach($a as$i=>$c)echo str_pad($c,""<$c|!$i?$x:0),trim(substr($f[$i],strlen($c))),"
"[""==$a[$i+1]];

ファイルfから入力を取得します。単一バイトの改行とタブなしを想定しています。空白行を保持します。

  • 空白を区切るための+2バイト:+12番目のstr_padパラメーターに追加します。
  • それは何のコード行は、単一で構成されないことが保証された場合-6バイト0
    取り外し""<て交換""==して!

壊す

foreach($f=file(f)as$s)             // loop through file
    $x=max($x,strlen(                   // 3. set $x to maximum code length
        $a[]=                           // 2. append to array $a
            rtrim($s,"{} ;\n")          // 1. strip trailing whitespace and braces
    ));
foreach($a as$i=>$c)echo            // loop through $a
    str_pad($c,                         // 1. print code:
        !$i|""<$c                       // if first line or not empty
        ?$x                             // then padded to length $x
        :0                              // else unpadded (= print nothing)
    ),
    trim(substr($f[$i],strlen($c))),    // 2. print braces
    "\n"[""==$a[$i+1]]                  // 3. if next line has code, print newline
;

{}正規表現の中括弧をエスケープする必要がありますか?
KritixiのLithos

@KritixiLithosおそらくそうではありません。とにかく短いアプローチを見つけました。
タイタス

0

Java 8、312 305バイト

s->{String t="([;{}]+)",z[],r="",a;s=s.replaceAll(t+"[\\s\\n]*","$1").replaceAll(t,"$1\n");int m=0,l;for(String q:s.split("\n"))m=m>(l=q.length())?m:l;for(String q:s.split("\n")){z=q.split("((?<="+t+")|(?="+t+"))",2);for(a="",l=0;l++<m-z[0].length();a+=" ");r+=z[0]+a+(z.length>1?z[1]:"")+"\n";}return r;}

説明:

ここで試してみてください。

s->{                                  // Method with String parameter and String return-type
  String t="([;{}]+)",                //  Temp regex-String we use multiple times
    z[],a,                            //  Temp String-array and temp String
    r="";                             //  Result-String
  s=s.replaceAll(t+"[\\s\\n]*","$1")  //  We replace all ;{} in the input with zero or more whitespaces/newlines to just ;{}
     .replaceAll(t,"$1\n");           //  and then add a single newline after each group of ;{}
  int m=0,l;                          //  Two temp integers
  for(String q:s.split("\n"))         //  Loop (1) over the lines
    m=m>(l=q.length())?m:l;           //   To determine the longest line
                                      //  End of loop (1)
  for(String q:s.split("\n")){        //  Loop (2) over the lines again
    z=q.split("((?<="+t+")|(?="+t+"))",2);
                                      //   Split on groups of ;{}, but keep them in the array
    for(a="",l=0;l++<m-z[0].length();a+=" "); 
                                      //   Amount of spaces we should add
    r+=z[0]+a+(z.length>1?z[1]:"")+"\n"; 
                                      //   Append this line to the result-String
  }                                   //  End of loop (2)
  return r;                           //  Return the result-String
}                                     // End of method

ねえ、私はこの答えについてコメントしていますが、それはあなたの他の多くに当てはまります。 現在、ラムダパラメータにはJavaの型が必要です
ネイサンメリル

1
@NathanMerrill判決の日が来ることを恐れていた。Jk、これから追加します。回答を編集しました。ありがとう。;)
ケビンクルーッセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.