เสาหินมีความสูงเท่าใด?


29

นี่คือตัวอย่างของการป้อนข้อมูลของนักการสา มี 4 ในตัวอย่างนี้

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

เสาหินก้อนแรกมีความสูง 4 หน่วยตัวที่สองคือ 2 ตัวที่สามคือ 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

คนที่ไม่ได้กำหนดจะไม่ใช่แค่อาร์เรย์ที่ว่างเปล่าใช่ไหม
โซโลมอน Ucko

@isaacg ใช่ว่าจะโอเค
Graviton

@SolomonUcko ในทางเทคนิคใช่แล้ว แต่เพื่อให้ง่ายขึ้นสำหรับทุกภาษาฉันตัดสินใจที่จะไม่ให้พวกเขาจัดการกับมัน
Graviton

คำตอบ:


15

เยลลี่ , (8?) 9 ไบต์

Ỵ=”|Sḟ0m2

ลิงก์ monadic ยอมรับรายการอักขระตามที่ระบุและส่งคืนรายการจำนวนเต็ม

หมายเหตุ: 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. Courtois

1
@ V.Courtois ฉันไม่เห็นว่าทำไมเพราะเราอาจไม่เคยได้รับข้อมูลดังกล่าว
Erik the Outgolfer

โอเคนั่นเป็นเพราะฉันเห็นว่าคำตอบอื่น ๆ นับเป็นคำตอบ
V. Courtois

2
@ V. เข้าสู่ข้อมูลที่คุณแนะนำไม่ตรงกับข้อกำหนดเช่นเดียวกันกับการเพิ่มขีดล่างบนท้องฟ้า, monoliths ขึ้นทางเดียว, หรือใต้ดินอาจจะส่งผลงานอื่น ๆ อีกมากมาย
Jonathan Allan

ผู้ลงคะแนนเสียง - คุณอยากอธิบายเหตุผลของคุณหรือไม่
Jonathan Allan


6

JavaScript (ES6), 79 78 ไบต์

-1 ไบต์ขอบคุณ @Shaggy

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

@Shaggy replaceดีฉันทั้งหมดไม่ได้คิดว่าการใช้ ขอบคุณ!
Justin Mariner

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
ถ้าใช้กรัม ++ คุณสามารถใช้ที่ไม่ได้มาตรฐานf(auto s)และระบุว่าจะใช้เวลาภาชนะ random-access ใด ๆ ของภาชนะ random-access charของ
aschepler


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

ดูเหมือนว่ามันจะไม่แข่งขันมาก มันจะเปลี่ยน regex เพื่อเปลี่ยน towers เป็นคอลัมน์ 1 ทำให้อาร์เรย์เป็น 0 ความยาวของสตริงอินพุตจากนั้นทำตามขั้นตอนผ่านบรรทัดที่เพิ่ม 1s ลงไป

การทดสอบพร้อมที่จะทำงาน:

$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 48ไบต์

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

ลองออนไลน์! ลิงก์มีตัวอย่างแรก คำอธิบาย: บรรทัดนำหน้าซึ่งจะรวบรวมผลลัพธ์ เนื่องจากคอลัมน์แต่ละคอลัมน์จะถูกลบซ้ำ ๆ กันผู้ที่มี_ระดับพื้นดินด้านบนจะมีจำนวนบรรทัดที่เหลืออยู่ในคอลัมน์ ในที่สุดบรรทัดว่างตอนนี้จะถูกลบ แก้ไข: บันทึก 10 ไบต์ด้วยแรงบันดาลใจจาก @FryAmTheEggman


ดีฉันมีวิธีแก้ปัญหาที่สั้นกว่าเล็กน้อยแต่มันจะไม่ทำงานกับอินพุตขนาดใหญ่เนื่องจากมันจะทำให้ความสามารถในการเรียงลำดับของฉันยุ่งเหยิง การไปทีละคอลัมน์เป็นวิธีที่ดีในการหลีกเลี่ยงสิ่งนั้น!
FryAmTheEggman

@FryAmTheEggman ฉันเปลี่ยนไปใช้วิธีการนับจำนวนบรรทัดของคุณโดยใช้_s ซึ่งมีเหตุผลมากกว่าการพยายามใช้|s ขอบคุณ!
Neil

@FryAmTheEggman ไม่สามารถแก้ไขปัญหาได้ แต่ขั้นตอนการเรียงลำดับของคุณสามารถลดความซับซ้อนลงได้โดยการวาง lookbehind และการเรียงลำดับตาม$.%`และขั้นตอนสุดท้ายอาจเป็น!`\d+ได้ และถ้าคุณเปลี่ยนด่านแรกเป็น lookahead คุณไม่จำเป็นต้องวนซ้ำ
Martin Ender

@FryAmTheEggman และนี่คือวิธีการแก้ไขของคุณ แต่มันสิ้นสุดที่ 46 ไบต์
Martin Ender

@MartinEnder 45 บางที? ลองออนไลน์!
Neil

4

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

ใช้อินพุตเป็น(←บันทึก 16 ไบต์) -2 ไบต์ในการแลกเปลี่ยนสำหรับการส่งออกน้อยขอบคุณที่อ่านได้จะ@ OlivierGrégoireโดยการเปลี่ยนไป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 มัน :)
Kevin Cruijssen

ฉันทำได้เพียงแค่ลงไปที่ 150 โดยใช้ Linq แต่ควรมีห้องสำหรับเล่นกอล์ฟ
TheLethalCoder

ใน C # เรามีอาร์เรย์หลายมิติที่ชอบ: แทนอาร์เรย์ขรุขระคุณกำลังใช้เป็นnew[,] new[][]หากคุณมีสิ่งนั้นใน Java มันจะช่วยให้คุณประหยัดบางไบต์
TheLethalCoder

1
System.out.println(l-j);ดูพอสำหรับฉันที่จะสำรอง 2 ไบต์ นอกจากนี้ในคำอธิบายคุณลืมที่จะเปลี่ยนlength()เป็นlength(ไม่เกิดการนับไบต์ตามที่ถูกต้องในการส่ง)
Olivier Grégoire

3

Haskell, 75 74 ไบต์

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

คาดว่าอินพุตเป็นรายการของสตริง (rowwise)


เหตุใดจึงใช้เครื่องหมายอัฒภาคหลังจากการนำเข้าเมื่อขึ้นบรรทัดใหม่มีความยาวเท่ากันและมีความหมายมากกว่า?
จูลส์

@Jules: ใช่ฉันมักจะทำ
siracusa




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

ลองออนไลน์!

Ungolfed:

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[] l: ใช้String[]lงานได้เหมือนกันและสั้นกว่า ใช้แทนprintln(l.length-i-1) println(l.length-i-1+",")อย่าเริ่มต้นj: เพียงแค่เขียน: ,j;. ถ้าคุณใช้int[]ตามที่แนะนำก่อนหน้านี้ประกาศเช่นนี้และลบประกาศจากint m[]=new int[99],i=0,j; for-loop
Olivier Grégoire

1
OlivierGrégoireถูกต้องแน่นอนเกี่ยวกับการนำเข้าที่จำเป็นสำหรับแผนที่ 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>ใช้แผนที่เมื่อคุณสามารถส่งไปยังint; a.length-1จะใช้สองครั้งดังนั้นคุณสามารถใช้ตัวแปรได้ โดยการใส่ทุกอย่างไว้ในลูปคุณสามารถกำจัดวงเล็บทั้งหมด โอ้และยินดีต้อนรับสู่ PPCG! :)
Kevin Cruijssen

@KevinCruijssen ขอบคุณ! การแปลงเนื้อหาของลูปแรกเป็นลูปไร้ร่างกายสำหรับลูปนั้นเป็นแรงบันดาลใจ! ฉลาดหลักแหลม
Michael

@Michael คุณยินดีต้อนรับ :) โอ้และถ้าคุณยังไม่เห็น: เคล็ดลับสำหรับการเล่นกอล์ฟใน Javaและเคล็ดลับสำหรับการเล่นกอล์ฟใน <ทุกภาษา>อาจน่าสนใจในการอ่าน ช่วยฉันได้มากตอนที่ฉันเริ่มครั้งแรก (และบางครั้งก็ยังทำ)
Kevin Cruijssen


2

Mathematica, 48 47 39 ไบต์

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

ลองออนไลน์!

Functionซึ่งคาดว่าอาร์เรย์ของอักขระสี่เหลี่ยม ใช้Mostอาร์เรย์ (ทั้งหมดยกเว้นแถวสุดท้าย) Reverseจากนั้นใช้Transpose* จากนั้นค้นหาPositions ทั้งหมดที่_อักขระปรากฏ ความสูงที่เกี่ยวข้องคือLastองค์ประกอบของแต่ละPositionส่วน

* เป็น3อักขระใช้งานไบต์ส่วนตัวU+F3C7ซึ่งแสดง\[Transpose]ใน Mathematica โปรดทราบว่าวิธีนี้ใช้ไม่ได้ในMathicsดังนั้นลิงก์ TIO จึงใช้งาน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 ไบต์

บันทึกแล้ว 16 ไบต์ขอบคุณ @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)

อินพุตถูกใช้เป็นอาร์เรย์ของสตริง

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! ฉัน stoked เกี่ยวกับการเริ่มต้นตัวแปรเป็นพารามิเตอร์ที่ไม่ได้ใช้ให้Array.mapนั่นคือเคล็ดลับเด็ด
alexanderbird

คุณต้องการกำหนด RegEx ให้กับตัวแปรจริงๆหรือไม่? คุณสามารถใช้มันโดยตรงในexecและบันทึกไม่กี่ไบต์
Shaggy

ที่จริงแล้วมันเป็นสิ่งที่จำเป็น - ขณะที่วนซ้ำทุกการแข่งขันในบรรทัดและไม่มีสถานะภายในของ regex ในตัวแปรมันจะตรงกับการเกิดขึ้นครั้งแรกในแต่ละครั้งและวนซ้ำไม่สิ้นสุด การวนซ้ำแต่ละครั้งมันจะสร้าง regex ใหม่ดังนั้นexecจะจับคู่แรก จริง ๆ แล้วมันจะทำให้ตัวแก้ไขโค้ดสแต็กแลกเปลี่ยนล้มเหลวถ้าคุณอินไลน์ regex ถ้าฉันไม่ได้ทำอะไร
alexanderbird

@shaggy ฉันลืมที่จะแท็กคุณในความคิดเห็นสุดท้ายของฉัน
alexanderbird

2

CJam, 15 14 ไบต์

บันทึก 1 ไบต์ขอบคุณ @BusinessCat

{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 ไบต์โดยการย้อนกลับอาร์เรย์ทั้งหมดก่อนที่จะแปลง
ธุรกิจ Cat

1

Pip , 18 17 ไบต์

โค้ด 15 ไบต์, +2 สำหรับ-rpแฟล็ก

_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]+:)/ค้นหาสตริงอินพุตสำหรับขีดล่างทั้งหมดและส่งคืนอ็อบเจ็กต์การจับคู่สำหรับแต่ละรายการโดยที่วงเล็บที่จับภาพแรกมีส่วนก่อนหน้าของบรรทัดที่พบขีดล่างและวงเล็บจับภาพที่สองมีวงเล็บที่เหลือทั้งหมดของสตริง ส่วนที่เหลือของสตริงจะต้องมีอย่างน้อยหนึ่งบรรทัดใหม่ดังนั้นเราจึงไม่นับขีดเส้นใต้ที่ระดับพื้นดิน :exhaustiveธงช่วยตรงนี้จะทับซ้อนกัน
  • .sort(*[0].chars)เรียงลำดับวัตถุการจับคู่เหล่านี้ตามจำนวนตัวอักษรในส่วนของบรรทัดก่อนหน้าขีดล่างแต่ละอัน คำสั่งนี้พวกเขาจากซ้ายไปขวา
  • .map(+*[1].comb("\n"))จับคู่แต่ละวัตถุที่จับคู่กับจำนวนของอักขระบรรทัดใหม่ในส่วนของสตริงอินพุตที่ลากแต่ละขีดล่าง - นั่นคือความสูง \nเป็นตัวละครที่เกิดขึ้นจริงขึ้นบรรทัดใหม่ประหยัดหนึ่งไบต์

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

มาทำลายมันกันเถอะ! อินพุตของเราที่นี่คืออาร์เรย์ 2 มิติของตัวอักษร

$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


สิ่งนี้ไม่ได้ตอบสนองความท้าทายทั้งหมด คุณต้องส่งคืนอาร์เรย์หรือรายการด้วยความสูงทั้งหมดไม่ใช่แค่ที่สูงที่สุด
Scott Milner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.