Berapa tinggi monolit?


29

Berikut adalah contoh input monolit . Ada 4 dalam contoh ini.

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

Monolit pertama adalah 4 unit tinggi, yang kedua adalah 2, yang ketiga adalah 3, dan yang terakhir adalah 1.

Tugas

Program Anda harus menampilkan ketinggian monolit secara berurutan dari kiri ke kanan. Format output dapat berupa daftar atau larik apa pun.

Catatan

  • Input dapat diambil sebagai string dimensi, daftar string, atau daftar karakter.
  • Ini adalah , sehingga byte terendah menang .
  • Anda harus berasumsi bahwa monolit selalu memiliki lebar yang sama, dan selalu _berjarak 1 dari yang lain.
  • Mereka bisa datang dalam ketinggian berapa pun, dan dalam jumlah berapa pun.

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
Bolehkah saya berasumsi bahwa input sudah diisi dengan spasi?
isaacg

17
Apakah [10]monolit Anda tidak [11]?
TessellatingHeckler

Bukankah yang tidak terdefinisi hanya menjadi array kosong?
Solomon Ucko

@isaacg ya, tidak apa
Graviton

@SolomonUcko secara teknis ya, meskipun untuk membuatnya lebih mudah untuk semua bahasa, saya memutuskan untuk tidak mengatasinya.
Graviton

Jawaban:


15

Jelly , (8?) 9 byte

Ỵ=”|Sḟ0m2

Tautan monadik yang menerima daftar karakter seperti yang ditentukan dan mengembalikan daftar bilangan bulat.

Catatan: 8 byte jika daftar string, satu per baris, benar-benar dimaksudkan sebagai format input yang diizinkan - hapus saja .

Cobalah online!

Bagaimana?

Ỵ=”|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)

Saya tidak tahu, tetapi apakah ini baik-baik saja?
V. Courtois

1
@ V.Courtois Saya tidak mengerti mengapa tidak, karena kita mungkin tidak akan pernah mendapatkan masukan seperti itu.
Erik the Outgolfer

Oke, itu karena saya melihat bahwa beberapa jawaban lain menghitungnya
V. Courtois

2
@ V.Courtois input yang Anda sarankan tidak sesuai dengan spesifikasi, juga menambahkan garis bawah di langit, sebagian naik monolit, atau bawah tanah mungkin akan merusak banyak kiriman lainnya.
Jonathan Allan

Down-voter - apakah Anda mau menjelaskan alasan Anda?
Jonathan Allan


6

JavaScript (ES6), 79 78 byte

-1 byte terima kasih kepada @Shaggy

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

Mengambil input sebagai array string.

Cuplikan Tes

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 byte:a=>a.map((x,y)=>x.replace(/_/g,(_,z)=>c[z]=a.length-y-1),c=[])&&c.filter(n=>n)
Shaggy

@ Shaggy Bagus, saya sama sekali tidak berpikir untuk menggunakan replace. Terima kasih!
Justin Mariner

6

C ++, 171 169 byte

#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<<" ";}}

Cobalah online!

C ++ (GCC), 150 byte

Terima kasih kepada @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<<" ";}}

Cobalah online!


1
Jika menggunakan g ++, Anda dapat menggunakan non-standar f(auto s)dan menentukan dibutuhkan wadah akses acak dari wadah akses acak char.
aschepler


5

Dyalog APL, 29 byte

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

Jalankan dengan ⎕IO←0.

Cobalah online!

Bagaimana?

⌽⍵='_'- di mana adalah '_', baris pertama atas

×- kalikan dengan ...

(⍳≢⍵)- kisaran (nol diindeks)

↑¨ - untuk setiap baris, pad dengan nol dengan ...

(⌈/⍴¨⍵) - panjang maksimal

↑+/ - jumlah baris zip dan ratakan

0~⍨ - menghapus nol



5

PowerShell, 133 byte

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

Sepertinya itu tidak terlalu kompetitif; itu mengganti regex untuk mengubah menara menjadi kolom 1, membuat array 0 panjang string input, kemudian melangkah melalui garis menambahkan 1s.

Tes siap dijalankan:

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


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

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


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

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

4

Japt , 11 byte

z ·mb'_ fw0

Uji secara online!

Penjelasan

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

Retina , 48 38 byte

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

Cobalah online! Tautan termasuk contoh pertama. Penjelasan: Baris diawali yang akan mengumpulkan hasil. Karena setiap kolom secara berulang dihapus pada gilirannya, mereka yang berisi _permukaan tanah di atas memiliki jumlah baris yang tersisa dalam kolom dihitung. Akhirnya baris kosong sekarang dihapus. Sunting: Disimpan 10 byte berkat inspirasi dari @FryAmTheEggman.


Bagus, saya punya solusi yang sedikit lebih pendek , tetapi tidak akan bekerja pada input besar karena akan mengacaukan kemampuan saya untuk mengurutkannya. Pergi kolom demi kolom adalah cara yang bagus untuk menghindari itu!
FryAmTheEggman

@FryAmTheEggman Saya beralih ke metode Anda menghitung garis menggunakan huruf _s yang jauh lebih masuk akal daripada mencoba menggunakan huruf |s, terima kasih!
Neil

@FryAmTheEggman Tidak memperbaiki masalah, tetapi tahap penyortiran Anda dapat disederhanakan dengan menjatuhkan tampilan di belakang dan menyortir $.%`, dan tahap akhir bisa !`\d+. Dan jika Anda mengubah tahap pertama menjadi lookahead, Anda tidak perlu mengulang.
Martin Ender

@FryAmTheEggman Dan di sini adalah memperbaiki pendekatan Anda, tapi itu berakhir pada 46 byte.
Martin Ender

@MartinEnder 45 mungkin? Cobalah online!
Neil

4

Java 8, 133 117 116 114 byte

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+",");}}

Mengambil input sebagai (← menghemat 16 byte). -2 byte sebagai ganti untuk output yang kurang mudah dibaca berkat @ OlivierGrégoire dengan mengubah ke .String[] char[][]
print(l-j+",")println(l-j)

Penjelasan:

Coba di sini.

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

Saya belum mencobanya tetapi ide saya untuk tantangan ini adalah untuk pergi ke atas dan mencari _jika menemukan toko itu lokasi kemudian memesan itu, mengabaikan baris bawah tentu saja. Mungkin bisa membantu menghemat byte ...
TheLethalCoder

@TheLethalCoder Itu adalah pemikiran awal saya juga, tetapi di mana Anda ingin menyimpannya di / pesan? Saya awalnya berpikir Peta, tetapi itu tidak disortir sehingga Anda akan membutuhkan LinkedMap. Di kepala saya, semua itu terdengar terlalu banyak byte, tetapi jika Anda dapat menemukan cara untuk mencapainya lebih pendek daripada ini, jangan ragu untuk mengirim jawaban dan saya akan memberi +1. :)
Kevin Cruijssen

Saya hanya berhasil menurunkannya menjadi 150 menggunakan Linq tetapi masih harus ada ruang untuk bermain golf.
TheLethalCoder

Dalam C # kami memiliki array multidimensi seperti: new[,]alih-alih array bergerigi yang Anda gunakan new[][]. Jika Anda memilikinya di Jawa, Anda bisa menghemat beberapa byte.
TheLethalCoder

1
System.out.println(l-j);terlihat cukup mencolok bagi saya untuk cadangan 2 byte. Juga, dalam penjelasannya, Anda lupa untuk mengubahnya length()menjadi length(tidak ada kejadian pada byte-count seperti yang benar dalam pengiriman).
Olivier Grégoire

3

Haskell, 75 74 byte

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

Input diharapkan sebagai daftar string (searah).


Mengapa menggunakan titik koma setelah impor, saat baris baru memiliki panjang yang sama dan lebih idiomatis?
Jules

@ Jules: Ya, saya biasanya melakukannya
siracusa




3

C #, 150 144 137 byte

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)

Versi Lengkap / Terformat:

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 Bytes 213 Bytes

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+",");}}

Cobalah online!

Tidak Terkumpul:

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 + ",");
    }
}

Woo, posting pertama. Setiap bantuan untuk meningkatkannya akan sangat bagus. Saya tahu saya bisa menyingkirkan indexOftulisan itu dua kali. Tahu itu! Saya bermain-main dengan gagasan untuk mengubah jenis di peta dari Integer ke Long tapi saya pikir itu jalan buntu.


Saya tahu ada solusi Java 8 yang jauh lebih baik , tapi itu mengambil char[][]input yang saya pikir lebih mudah untuk digunakan dalam hal ini daripada String.


1
Anda belum memasukkan impor (wajib untuk jawaban Java). Jangan gunakan Maptapi int[](mungkin diinisialisasi new int[99]?). Tidak perlu ruang setelah String[] l: String[]lbekerja sama dan lebih pendek. Gunakan println(l.length-i-1)sebagai ganti println(l.length-i-1+","). Jangan initialize j: hanya menulis: ,j;. Jika Anda menggunakan int[]seperti yang disarankan sebelumnya, deklarasikan seperti ini: int m[]=new int[99],i=0,j;dan hapus deklarasi dari for-loop.
Olivier Grégoire

1
OlivierGrégoire memang benar tentang impor yang diperlukan untuk Peta. Adapun beberapa golf kode Anda saat ini dengan Peta, Anda dapat mengubahnya ke ini: 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);}. Tidak perlu untuk <Integer,Integer>peta saat Anda dapat melakukan cast int; a.length-1digunakan dua kali, jadi Anda bisa menggunakan variabel untuk itu; dengan meletakkan segala sesuatu di dalam untuk loop Anda dapat menyingkirkan semua tanda kurung. Oh, dan selamat datang di PPCG! :)
Kevin Cruijssen

@KevinCruijssen Terima kasih! Mengonversi konten pertama untuk loop ke tanpa tubuh untuk loop sangat menginspirasi! Sangat pintar.
Michael

@Michael Sama-sama. :) Oh, dan jika Anda belum melihatnya: Tips untuk bermain golf di Jawa dan Tips untuk bermain golf di <semua bahasa> mungkin menarik untuk dibaca. Banyak membantu saya ketika saya mulai (dan masih terkadang).
Kevin Cruijssen


2

Mathematica, 48 47 39 byte

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

Cobalah online!

Functionyang mengharapkan array karakter persegi panjang. Mengambil Mostarray (semua kecuali baris terakhir), Reverses itu, lalu ambil Transpose*, lalu temukan semua Positiondi mana _karakter muncul. Ketinggian yang relevan adalah Lastelemen dari masing-masing Position.

* adalah 3karakter penggunaan byte pribadi U+F3C7yang mewakili \[Transpose]dalam Mathematica. Perhatikan bahwa ini tidak berfungsi dalam Matematika , jadi tautan TIO hanya menggunakan Transpose.


2

SOGL V0.12 , 9 byte

I{ _WH╥?O

Coba Di Sini!
Mengambil input sebagai array array string (karakter).

Penjelasan:

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 byte

Disimpan 16 byte berkat @JustinMariner

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

Input diambil sebagai larik string

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))


88 byte di sini
Justin Mariner

Terima kasih @JustinMariner! Saya tertarik tentang inisialisasi variabel sebagai parameter yang tidak digunakan diberikan Array.map, itu trik keren.
alexanderbird

Apakah Anda benar-benar perlu menetapkan RegEx ke variabel? Anda dapat menggunakannya secara langsung di execdan menyimpan beberapa byte.
Shaggy

Sebenarnya, itu perlu - loop sementara iterates atas setiap pertandingan pada baris, dan tanpa keadaan internal regex dalam variabel itu akan cocok dengan kejadian pertama setiap kali dan loop tak terhingga. Setiap iterasi itu akan membuat regex baru sehingga execakan cocok dengan yang pertama. Itu benar-benar crash editor snipet pertukaran pertukaran jika Anda inline regex. Kecuali saya kehilangan sesuatu?
alexanderbird

@shaggy Saya lupa memberi tag Anda di komentar terakhir saya
alexanderbird

2

CJam, 15 14 byte

1 byte disimpan berkat @BusinessCat

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

Ini adalah blok yang mengambil array string pada stack dan menghasilkan array.

Penjelasan:

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

Anda dapat menyimpan 1 byte dengan membalikkan seluruh array sebelum mentransposisi.
Business Cat

1

Pip , 18 17 byte

15 byte kode, +2 untuk -rpbendera.

_FI_@?'_MRVgZDs

Mengambil input dari stdin. Cobalah online!

Penjelasan

                 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

Pyth , 19 15 14 byte

f>T0mx_d\_.tQd

Uji secara online! Input adalah daftar baris.

Penjelasan

          .tQd     # Transpose, pad with spaces
    mx_d\_         # For each line, reverse it, find the position of "_" (-1 if not found)
f>T0               # Filter on positions greater than zero


1

Perl 6 , 65 byte

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

Cobalah online!

  • m:exhaustive/^^(\N+)_([\N*\n]+:)/mencari string input untuk semua garis bawah, dan mengembalikan objek yang cocok untuk masing-masing, di mana tanda kurung menangkap pertama berisi bagian sebelumnya dari garis di mana garis bawah ditemukan, dan tanda kurung menangkap kedua berisi seluruh sisa string. Sisa string harus mengandung setidaknya satu baris baru, jadi kami tidak menghitung garis bawah pada permukaan tanah. Itu:exhaustive Bendera memungkinkan pertandingan ini untuk tumpang tindih.
  • .sort(*[0].chars)mengurutkan objek yang cocok ini dengan jumlah karakter di bagian garis sebelum setiap garis bawah. Ini memerintahkan mereka dari kiri ke kanan.
  • .map(+*[1].comb("\n"))memetakan setiap objek yang cocok ke jumlah karakter baris baru di bagian string input yang mengikuti setiap garis bawah - yaitu ketinggian. Ini \nadalah karakter baris baru yang sebenarnya, menghemat satu byte.

0

PHP, 119 byte

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

Mari kita hancurkan ini! Masukan kami di sini adalah array karakter 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

Dibawa dalam string multiline. Kredit untuk pengaturan (header dan footer) ke @GarethPW

Python 2 , 29 byte

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

Cobalah online!

Ini hanya akan membagi array dengan baris baru dan mengembalikan panjang-1.


Ini tidak memenuhi seluruh tantangan. Anda harus mengembalikan array atau daftar dengan semua ketinggian, bukan hanya yang tertinggi.
Scott Milner
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.