モノリスの高さは?


29

モノリスの入力の例を次に示します。この例には4つあります。

  _
 | |        _
 | |  _    | |
 | | | |   | |     _
_| |_| |___| |____| |_

最初のモノリスの高さは4ユニット、2番目は2ユニット、3番目は3ユニット、最後は1ユニットです。

タスク

プログラムは、モノリスの高さを左から右の順に出力する必要があります。出力形式は、任意の種類のリストまたは配列にすることができます。

ノート

  • 入力は、任意の次元の文字列、文字列のリスト、または文字のリストとして取得できます。
  • これはであるため、最低バイトが勝ちます。
  • モノリスは常に同じ幅を持ち、常に少なくとも1つ_離れていると仮定する必要があります。
  • それらはどんな高さでも、どんな数量でも来ることができます。

I / O

  _
 | |        _
 | |  _    | |
 | | | |   | |     _
_| |_| |___| |____| |_   >> [4,2,3,1]

           _
          | |
  _       | |
 | |  _   | |  _
_| |_| |__| |_| |_   >> [2,1,4,1]


 _   _   _ 
| |_| |_| |_____   >> [1,1,1]

____________________   >> undefined behavior

 _
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |   >> [11]

     _       _       _       _       _
 _  | |  _  | |  _  | |  _  | |  _  | |
| |_| |_| |_| |_| |_| |_| |_| |_| |_| |  >> [1,2,1,2,1,2,1,2,1,2]

2
入力にスペースが正しく埋め込まれていると仮定できますか?
isaacg

17
あなたの[10]モノリスではありません[11]か?
TessellatingHeckler

未定義のものは単なる空の配列ではないでしょうか?
ソロモンウッコ

@isaacgはい、それは大丈夫でしょう
グラビトン

@SolomonUckoは技術的にはいです。ただし、すべての言語をより簡単にするために、それらに対応させないことにしました。
グラビトン

回答:


15

ゼリー、(8?)9 バイト

Ỵ=”|Sḟ0m2

指定された文字のリストを受け入れ、整数のリストを返す単項リンク。

注:文字列のリスト(1行に1つ)が実際に許可された入力形式である場合、8バイトです-を削除するだけです。

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

どうやって?

Ỵ=”|Sḟ0m2 - Link: list of characters, s
Ỵ         - split at newlines
  ”|      - literal '|'
 =        - equals (vectorises)
    S     - sum (vectorises, hence counts the number of '|' in every column)
     ḟ0   - filter out zeros (only keep the results from the sides of the towers)
       m2 - modulo index with 2 (keep only the left side measurements)

わかりませんが、これでいいですか?
V.クルトワ

1
@ V.Courtoisなぜそうなのかわからない。おそらくそのような入力は決して得られないからだ。
エリックアウトゴルファー

私が見たので大丈夫、それはいくつかの他の回答には数にそれを取ることだ
V.クルトワ

2
@ V.Courtoisは、あなたが提案した入力が仕様に合わないことを示しています。同様に、空にアンダースコアを追加したり、モノリスを途中まで上げたり、アンダーグラウンドにしたりすると、他の多くの提出物が壊れてしまいます
ジョナサンアラン

ダウン投票-あなたの理由を説明してくれませんか?
ジョナサンアラン


6

JavaScript(ES6)、79 78バイト

@Shaggyのおかげで-1バイト

a=>a.map((b,i)=>b.replace(/_/g,(_,j)=>o[j]=a.length-i-1),o=[])&&o.filter(x=>x)

入力を文字列の配列として受け取ります。

テストスニペット

f=
a=>a.map((b,i)=>b.replace(/_/g,(_,j)=>o[j]=a.length-i-1),o=[])&&o.filter(x=>x)
I.value="           _\n          | |\n  _       | |\n | |  _   | |  _\n_| |_| |__| |_| |_"
<textarea id=I rows=7 cols=30></textarea><br><button onclick="O.value=`[${f(I.value.split`\n`).join`, `}]`">Run</button> <input id=O disabled>


1
78バイト:a=>a.map((x,y)=>x.replace(/_/g,(_,z)=>c[z]=a.length-y-1),c=[])&&c.filter(n=>n)
シャギー

@Shaggy Nice、私はまったく使用することを考えていませんでしたreplace。ありがとう!
ジャスティンマリナー

6

C ++、171 169バイト

#import<vector>
#import<iostream>
int f(std::vector<std::string>s){for(int a,j,i=0,k=s.size()-1;a=s[k][i];++i)if(a==32){for(j=0;(a=s[k-++j][i])-95;);std::cout<<j<<" ";}}

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

C ++(GCC)、150バイト

@ascheplerに感謝します!

#import<vector>
#import<iostream>
int f(auto s){for(int a,j,i=0,k=s.size()-1;a=s[k][i];++i)if(a==32){for(j=0;(a=s[k-++j][i])-95;);std::cout<<j<<" ";}}

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


1
g ++を使用している場合は、非標準f(auto s)を使用して、のランダムアクセスコンテナーの任意のランダムアクセスコンテナーを指定することができますchar
アシェプラー


5

Dyalog APL、29バイト

{0~⍨↑+/(⌈/⍴¨⍵)↑¨(⍳≢⍵)×⌽⍵='_'}

で実行し⎕IO←0ます。

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

どうやって?

⌽⍵='_'-ここ'_'、先頭行が最初

×-乗算...

(⍳≢⍵)- (ゼロインデックス)の範囲

↑¨ -各行について、...でゼロを埋め込みます

(⌈/⍴¨⍵) -最大長

↑+/ -圧縮された行を合計して平坦化する

0~⍨ -ゼロを削除します



5

PowerShell、133バイト

param($s)$r=,0*($l=($s=$s-replace'\| \|',' 1 ')[0].Length);1..$s.Count|%{$z=$_-1;0..($l-1)|%{$r[$_]+=(''+$s[$z][$_]-as[int])}};$r-ne0

あまり競争的ではないようです。正規表現の置換を実行して、タワーを1の列に変換し、0の配列を入力文字列の長さにした後、1を加算する行をステップスルーします。

すぐに実行できるテスト:

$s1 = @'
  _                   
 | |        _         
 | |  _    | |        
 | | | |   | |     _  
_| |_| |___| |____| |_
'@-split"`r?`n"


$s2 = @'
 _
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | 
'@-split"`r?`n"

$s3 = @'
           _      
          | |       
  _       | |           
 | |  _   | |  _   
_| |_| |__| |_| |_ 
'@-split"`r?`n"


$s4 = @'
 _   _   _      
| |_| |_| |_____ 
'@-split"`r?`n"

$s5 = @'
     _       _       _       _       _ 
 _  | |  _  | |  _  | |  _  | |  _  | |
| |_| |_| |_| |_| |_| |_| |_| |_| |_| | 
'@-split"`r?`n"

4

Japt、11バイト

z ·mb'_ fw0

オンラインでテストしてください!

説明

z ·mb'_ fw0   : Implicit input
z             : Rotate the input clockwise. This puts the "floor" against the left side.
  ·           : Split the 2D string into lines.
   m          : Replace each column (now row) X with
    b'_       :   the index of '_' in X (0-indexed). This gives us the output list, with
              :   0's and -1's mixed in representing the columns that are not monoliths.
        f     : Take only the items X where
         w0   :   max(X, 0) is truthy. Since 0 is falsy, this removes anything <= 0.
              : Implicit: output result of last expression

4

網膜48 38バイト

^
¶
{`(¶.*)*¶_(.*¶)+
$#2 $&
}`¶.
¶
G`.

オンラインでお試しください!リンクには最初の例が含まれています。説明:結果を収集する行に接頭辞が付けられます。各列は順番に繰り返し削除されるため、_地上レベルを含む列には、列内の残りの行の数がカウントされます。最後に、現在空白行が削除されます。編集:@FryAmTheEggmanからのインスピレーションのおかげで10バイトを保存しました。


いいですね、私は少し短い解決策を持っていましたが、それらをソートする私の能力を台無しにするので、大きな入力では動作しません。列ごとに行くことはそれを避ける良い方法です!
-FryAmTheEggman

@FryAmTheEggman _sを使用して行をカウントする方法に切り替えました。これはsを使用しようとするよりもはるかに理にかなっています|、ありがとう!
ニール

@FryAmTheEggmanは問題を修正しませんが、後読みをドロップして並べ替えを行うことで並べ替え段階を簡素化でき$.%`、最終段階はになります!`\d+。また、最初のステージを先読みに変更する場合、ループする必要はありません。
マーティンエンダー

@FryAmTheEggmanそして、これはあなたのアプローチの修正ですが、46バイトになります。
マーティンエンダー

おそらく@MartinEnder 45?オンラインでお試しください!
ニール

4

ジャワ8、133の 117 116 114バイト

a->{for(int l=a.length-1,i=0,j;i<a[0].length;i++)if(a[l][i]<33){for(j=0;a[j][i]<33;j++);System.out.print(l-j+",");}}

入力をaとして受け取ります(←16バイトを保存します)。@OlivierGrégoireに変更すること により、読みにくい出力と引き換えに-2バイト。String[] char[][]
print(l-j+",")println(l-j)

説明:

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

a->{                         // Method with character 2D-array parameter and no return-type
  for(int l=a.length-1,      //  Length of the 2D char-array - 1
      i=0,j;                 //  Index-integers
    i<a[0].length;i++)       //  Loop (1) over the 2D char-array
    if(a[l][i]<33){          //   If the base of the current column is a space
      for(j=0;a[j][i]<33;    //    Loop (2) over the cells in this column as long as
                             //    we encounter spaces (from top to bottom)
        j++                  //     And increase `j` every time, to go down the column
      );                     //    End of loop (2)
      System.out.println(l-j);
                             //    Print the amount of rows - `j`
    }                        //   End of if-block
                             //  End of loop (1) (implicit / single-line body)
}                            // End of method

私はまだ試していませんが、このチャレンジの私のアイデアは、上から下に行き_、見つかった場合は場所を探し、それから注文し、もちろん一番下の行を無視することでした。バイトの節約に役立つ可能性があります...
TheLethalCoder

@TheLethalCoderそれも私の最初の考えでしたが、どこに保管/注文しますか?私はもともとマップを考えていましたが、これらはソートされていないため、LinkedMapが必要になります。私の頭の中でそれはすべてあまりにも多くのバイトを鳴らしましたが、これよりも短い方法を見つけることができるなら、気軽に答えを投稿してください、私はそれを+1します。:)
ケビンクルーイッセン

Linqを使用して150まで下げることができましたが、ゴルフをする余地がまだあるはずです。
TheLethalCoder

C#new[,]には、asとして使用しているギザギザの配列の代わりに、次のような多次元配列がありますnew[][]。Javaでそれを使用している場合は、バイトを節約できます。
TheLethalCoder

1
System.out.println(l-j);私は2バイトを節約するのに十分なリストに見えます。また、説明では、変更length()するのを忘れていましたlength(提出時に正しいため、バイトカウントは発生しません)。
オリヴィエグレゴワール

3

ハスケル、 75 74バイト

import Data.List;f=filter(>0).map(length.fst.span(<'!').reverse).transpose

入力は、文字列のリストとして期待されます(行ごと)。


改行の長さが同じで慣用的な場合、インポート後にセミコロンを使用するのはなぜですか?
ジュール

@Jules:ええ、私は通常行う
シラクーサ




3

C#、150 144 137バイト

using System.Linq;a=>a.SelectMany((i,h)=>i.Select((c,w)=>new{c,w,d=a.Length-1-h}).Where(o=>o.c==95&o.d>0)).OrderBy(o=>o.w).Select(o=>o.d)

フル/フォーマット済みバージョン:

using System;
using System.Collections.Generic;
using System.Linq;

class P
{
    static void Main()
    {
        Func<char[][], IEnumerable<int>> f = a =>
            a.SelectMany((i, h) => i.Select((c, w) => new { c, w, d = a.Length - 1 - h })
                                    .Where(o => o.c == 95 & o.d > 0))
             .OrderBy(o => o.w)
             .Select(o => o.d);

        Console.WriteLine(string.Concat(f(new char[][]
        {
            "  _                 ".ToArray(),
            " | |       _        ".ToArray(),
            " | |  _   | |       ".ToArray(),
            " | | | |  | |    _  ".ToArray(),
            "_| |_| |__| |___| |_".ToArray(),
        })));

        Console.ReadLine();
    }
}

3

Java 8-229バイト 213バイト

s->{Map<Integer,Integer> m=new TreeMap();String[] l=s.split("\n");for(int i=0,j=-1;i<l.length-1;++i){s=l[i];while((j=s.indexOf("_",j+1))>=0){m.put(j,i);}}for(int i:m.values()){System.out.print(l.length-i-1+",");}}

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

ゴルフをしていない:

public static void foo(String input)
{
    Map<Integer, Integer> map = new TreeMap(); // Raw types!!
    String[] lines = input.split("\n");

    for (int i = 0, j = -1; i < lines.length - 1; ++i)
    {
        input = lines[i];

        while ((j = input.indexOf("_", j + 1)) >= 0)
        {
            map.put(j, i);
        }
    }

    for(int i:map.values())
    {
        System.out.print(lines.length - i - 1 + ",");
    }
}

ウー、最初の投稿。それを改善する助けは素晴らしいでしょう。indexOf二度書かれたものを取り除くことができることを知っています。わかった!マップのタイプをIntegerからLongに変更するというアイデアをいじりましたが、それは行き止まりだと思います。


私はすでにはるかに優れたJava 8ソリューションがすでにあることを知っていますがそれはchar[][]入力として取りますが、この場合はStringよりも作業が簡単だと思います。


1
インポートが含まれていません(Javaの回答に必要です)。使用しないでくださいMapが、int[](多分に初期化new int[99]?)。後のスペースのための必要はありませんString[] lString[]l同じように機能していないし、短くなっています。のprintln(l.length-i-1)代わりに使用しますprintln(l.length-i-1+",")。初期化しないでくださいj:ちょうどライト:,j;int[]前に提案したようにaを使用する場合は、次のようint m[]=new int[99],i=0,j;に宣言し、から宣言を削除しfor-loopます。
オリビエグレゴワール

1
OlivierGrégoireは、Mapに必要なインポートについて確かに正しいです。Mapを使用した現在のコードのゴルフについては、次のように変更できますimport java.util.*;s->{Map m=new TreeMap();String[]a=s.split("\n");int l=a.length-1,j=-1,i=j;for(;++i<l;)for(s=a[i];(j=s.indexOf("_",j+1))>=0;m.put(j,i));for(Object o:m.values())System.out.println(l-(int)o);}。に<Integer,Integer>キャストできる場合は、マップの必要はありませんinta.length-1は2回使用されるため、変数を使用できます。forループ内にすべてを置くことにより、すべてのブラケットを取り除くことができます。ああ、PPCGへようこそ!:)
ケビンクルイッセン

@KevinCruijssenありがとう!その最初のforループの内容をボディのないforループに変換することは刺激的でした!とても賢い。
マイケル

@Michaelどういたしまして。あなたはまだそれを見ていない場合:)ああ、と:Javaでゴルフのヒント<すべての言語>でのゴルフのためのヒントを通じ読んでも面白いかもしれません。私が最初に始めたとき、私を大いに助けてくれました(そして、それでも時々そうします)。
ケビンCruijssen


2

Mathematica、48 47 39バイト

Last/@(Reverse@Most@#~Position~"_")&

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

Functionこれは、文字の長方形配列を想定しています。取りMost配列(すべてが、最後の行)、のReverseそして、それだけ取るTranspose*を、すべて見つけるPositionsの_文字が現れます。関連する高さは、Lastそれぞれの要素ですPosition

* は、Mathematica で表現される3バイト専用文字です。これはMathicsでは機能しないので、TIOリンクは単にを使用することに注意してください。U+F3C7\[Transpose]Transpose


2

SOGL V0.12、9つのバイト

I{ _WH╥?O

ここで試してみてください!
入力を文字列(文字)の配列の配列として受け取ります。

説明:

I          rotate the array clockwise
 {         for each element
   _       push "_"
    W      get its index in the array (0 if not found, 1 if its the ground, >1 if its what we need)
     H     decrease that
      ╥    palindromize (duplicates the number, if it's <0, then errors and pushes 0, if =0, pushes 0, if >0, then pushes the number palindromized (always truthy))
       ?   if that, then
        T  output in a new line the original decreased index

2

JavaScriptの(ES6)、108の 104 88バイト

@JustinMarinerのおかげで16バイト節約

i=>i.map((s,h)=>{while(t=r.exec(s))m[t.index]=i.length-h-1},m=[],r=/_/g)&&m.filter(e=>e)

文字列の配列として取得される入力

let input = [
'  _',
' | |           _',
' | |  _   _   | |',
' | | | | | |  | |     _',
'_| |_| |_| |__| |____| |_'
]

let anonymousFunction =
i=>i.map((s,h)=>{while(t=r.exec(s))m[t.index]=i.length-h-1},m=[],r=/_/g)&&m.filter(e=>e)

console.log(anonymousFunction(input))



ありがとう@JustinMariner!に与えられた未使用のパラメータとしての変数の初期化についてはうれしいですArray.map。これはクールなトリックです。
アレクサンダーバード

本当にRegExを変数に割り当てる必要がありますか?で直接使用してexec、数バイトを節約できます。
シャギー

実際には、whileループは行の各一致を反復処理し、変数に正規表現の内部状態がなければ、毎回最初の出現に一致し、無限にループします。反復ごとに新しい正規表現が作成されるためexec、最初の正規表現と一致します。正規表現をインライン化すると、スタック交換スニペットエディターが実際にクラッシュします。私が何かを逃していない限り?
アレクサンダーバード

@shaggy最後のコメントで
アレクサンダー

2

CJam、15 14バイト

@BusinessCatのおかげで1バイト節約

{W%z'_f#{0>},}

これは、スタック上の文字列の配列を受け取り、配列を出力するブロックです。

説明:

W%    e# Reverse
z     e# Zip
'_f#  e# Get the index of '_' in each element (-1 if not found)
{0>}, e# Filter where positive

転置する前に配列全体を逆にすることで1バイトを節約できます。
ビジネス猫

1

ピップ18 17バイト

15バイトのコード、-rpフラグの場合は+2 。

_FI_@?'_MRVgZDs

stdinから入力を受け取ります。オンラインでお試しください!

説明

                 g is list of lines from stdin (-r flag); s is space
         RVg     Reverse g
            ZDs  Zip (transpose), filling gaps with a default char of space
        M        Map this function:
   _@?'_          Index of _ in each line (or nil if it doesn't appear)
_FI              Filter, keeping only the truthy (nonzero, non-nil) values
                 Autoprint in repr format (-p flag)



1

Perl 6、65バイト

{m:ex/^^(\N+)_([\N*\n]+:)/.sort(*[0].chars).map(+*[1].comb("
"))}

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

  • m:exhaustive/^^(\N+)_([\N*\n]+:)/入力文字列ですべての下線を検索し、それぞれの一致オブジェクトを返します。最初のキャプチャ括弧にはアンダースコアが見つかった行の前の部分が含まれ、2番目のキャプチャ括弧には文字列の残り全体が含まれます。文字列の残りの部分には少なくとも1つの改行が含まれている必要があるため、グラウンドレベルでアンダースコアをカウントしません。:exhaustiveフラグは、これらのマッチが重複することを可能にします。
  • .sort(*[0].chars)これらの一致オブジェクトを、各アンダースコアの前の行の部分の文字数でソートします。これにより、左から右に順序付けられます。
  • .map(+*[1].comb("\n"))各一致オブジェクトを、各アンダースコアに続く入力文字列の一部、つまり高さの改行文字の数にマップします。\n1バイトを保存し、実際の改行文字です。

0

PHP、119バイト

function($s){$r=array_map(null,...$s);foreach($r as$k=>&$v)if($v=array_count_values($v)['|'])echo($v+$r[$k+2]=0)." ";};

これを分解しましょう!ここでの入力は、charsの2D配列です。

$r=array_map(null,...$s) // Neat little snippet to transpose the array

foreach($r as$k=>&$v)    // Loop through the array, grabbing each row of our 2D array 
(which is now each column of the monolith)

if($v=array_count_values($v)['|']) // Count the number of '|' characters in the column 
(which is the height of our monolith), and if it's greater than 0 (truthy in PHP)...

echo($v+$r[$k+2]=0)." "; // Output that number, and simultaneously set the row 2 indices
                            down to null (to remove duplicate values)

-1

複数行の文字列を受け取ります。セットアップ(ヘッダーとフッター)のクレジットは@GarethPWになります

Python 2、29バイト

lambda s:len(s.split('\n'))-1

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

これは単に改行で配列を分割し、長さ-1を返します。


これは、課題全体を満たしているわけではありません。最も高いだけでなく、すべての高さの配列またはリストを返す必要があります。
スコットミルナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.