Monolitler ne kadar uzun?


29

İşte bir monolit girişi örneği . Bu örnekte 4 tane var.

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

İlk monolit 4 ünite yüksek, ikincisi 2, üçüncüsü 3 ve sonuncusu 1'dir.

Görev

Programınız, soldan sağa sırayla monolitlerin yüksekliğini çıkarmalıdır. Çıktı formatı herhangi bir listede veya dizide olabilir.

notlar

  • Girdi, herhangi bir boyutlu dize, dize listesi veya karakter listesi olarak alınabilir.
  • Bu , yani en düşük bayt kazanır .
  • Monolitlerin her zaman aynı genişliğe sahip olduğunu ve her zaman _diğerinden en az 1 uzakta olduğunu varsaymalısınız .
  • Herhangi bir yükseklikte ve herhangi bir miktarda gelebilirler.

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
Girişin sağ boşlukla doldurulduğunu varsayabilir miyim?
isaacg

17
Sizin mi [10]monolit değil [11]?
MozaiklerHeckler

Tanımsız olan sadece boş bir dizi olmaz mıydı?
Solomon Ucko

@isaacg evet, tamam olur
Graviton

@SolomonUcko teknik olarak evet, ancak bütün diller için daha basit hale getirmesine rağmen, onunla ilgilenmemeye karar verdim.
Graviton

Yanıtlar:


15

Jöle , (8?) 9 bayt

Ỵ=”|Sḟ0m2

Belirtildiği şekilde bir karakter listesini kabul eden ve tamsayıların bir listesini döndüren bir tek renkli bağlantı.

Not: Her satırda bir tane olmak üzere bir dizi dizinin gerçekten izin verilen bir giriş formatı olması isteniyorsa 8 bayt - sadece kaldırın .

Çevrimiçi deneyin!

Nasıl?

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

Bilmiyorum, ama bu iyi mi?
V. Courtois,

1
@ V.Courtois Neden olmasın, çünkü muhtemelen asla böyle bir giriş elde edemeyiz.
Outgolfer Erik,

Tamam, çünkü bazı başka cevapların saydığını biliyordum
V. Courtois

2
@ V.Courtois, önerdiğinize uygun değil, benzer şekilde gökyüzüne alt çizgiler ekleyerek, yarı yukarı monolitler veya yeraltı muhtemelen diğer birçok gönderimi kıracaktır.
Jonathan Allan,

Aşağı oy veren - sebeplerini açıklar mısın?
Jonathan Allan,


6

JavaScript (ES6), 79 78 bayt

@Shaggy sayesinde -1 bayt

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

Dizeleri bir dizi olarak girdi alır.

Test Parçacığı

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

@Shaggy Nice, tamamen kullanmayı düşünmedim replace. Teşekkürler!
Justin Mariner

6

C ++, 171 169 bayt

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

Çevrimiçi deneyin!

C ++ (GCC), 150 bayt

@Aschepler'e teşekkürler!

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

Çevrimiçi deneyin!


1
G ++ kullanıyorsanız, standart dışı kullanabilirsiniz f(auto s)ve bunun herhangi bir rastgele erişimli kapsayıcısının rastgele erişimli kapsayıcısı alacağını belirtebilirsiniz char.
aschepler 12


5

Dyalog APL, 29 bayt

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

İle koş ⎕IO←0.

Çevrimiçi deneyin!

Nasıl?

⌽⍵='_'- nerede , '_'ilk önce üst satırlar

×- çarparak ...

(⍳≢⍵)- aralığı (sıfır dizinli)

↑¨ - Her satır için, sıfır ile ped ile ...

(⌈/⍴¨⍵) - maksimum uzunluk

↑+/ - sıkıştırılmış ve düzleştirilmiş satırları toplamı

0~⍨ - sıfırları kaldırır



5

PowerShell, 133 bayt

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

Rekabetçi değil gibi görünüyor; kuleleri 1 sütununa dönüştürmek için bir regex değişimini yapar, girdi dizisinin uzunluğunu 0 dizisi yapar, ardından 1'ler ekleyen satırlar boyunca ilerler.

Çalışmaya hazır testler:

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


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

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


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

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

4

Japt , 11 bayt

z ·mb'_ fw0

Çevrimiçi test edin!

açıklama

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 bayt

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

Çevrimiçi deneyin! Bağlantı ilk örneği içerir. Açıklama: Sonuçları alacak olan bir satır eklenmiştir. Her sütun sırayla tekrar tekrar silinirken, bir yer _üstü seviyesi içerenler, sayılan sütunda kalan satır sayısını içerir. Sonunda şimdi boş satırlar silinir. Düzenleme: @FryAmTheEggman 'den ilham alınarak 10 bayt kaydedildi.


Güzel, biraz daha kısa bir çözüme sahiptim , ancak büyük girdilerde işe yaramayacaktı, çünkü bunları sıralama yeteneğimi bozuyordu. Sütuna göre sütun gitmek, bundan kaçınmak için güzel bir yoldur!
FryAmTheEggman

@FryAmTheEggman Ben _s kullanmaya çalışmaktan çok daha mantıklı olan s kullanarak satırları sayma yöntemine geçti |, teşekkürler!
Neil

@FryAmTheEggman Sorunu çözmüyor, ancak sıralama aşaması, göz atma çubuğunu bırakarak ve sıralayarak basitleştirilebilir $.%`ve son aşama olabilir !`\d+. Ve ilk aşamayı bir göz alıcı olarak değiştirirseniz, döngü yapmanız gerekmez.
Martin Ender

@FryAmTheEggman Ve işte yaklaşımınıza bir çözüm: ancak 46 baytta bitiyor.
Martin Ender

@MartinEnder 45 belki? Çevrimiçi deneyin!
Neil

4

Java 8, 133 117 116 114 bayt

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

Girişi a olarak alır (← 16 bayt kaydeder). -2 daha az okunabilir çıkış sayesinde karşılığında bayt @ OlivierGrégoire değiştirerek için .String[] char[][]
print(l-j+",")println(l-j)

Açıklama:

Burada dene.

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

Henüz denemedim ama bu zorluk için benim düşüncem yukarıdan aşağıya gidip _, bulunduğu yerin bulunduğu yerde bulunup bulunmadığına bakmaktı, bunun için sipariş, elbette alt sırayı görmezden gelmekti.
Baytları

@ TheLethalCoder Bu benim de ilk düşüncemdi, ama nerede / sırayla saklamak istersiniz? İlk başta bir Harita düşündüm, ama bunlar sıralanmamış, bu yüzden LinkedMap'e ihtiyacınız olacak. Kafamda hepsi biraz fazla bayt gibiydi, ancak bunu başarmanın daha kısa bir yolunu bulabilirseniz cevap yazmaktan çekinmeyin ve + 1'leyeceğim. :)
Kevin Cruijssen

Sadece Linq kullanarak 150'ye düşürmeyi başardım ama hala golf oynamak için yer olmalı.
TheLethalCoder

C # 'da çok boyutlu dizilerimiz var: new[,]kullandığınız pürüzlü dizinin yerine new[][]. Java'da varsa, size bazı baytları kurtarabilir.
TheLethalCoder

1
System.out.println(l-j);2 bayt ayıracak kadar yeterli görünüyor. Ayrıca açıklamada, değiştirmek unuttum length()içine length(o sunulması doğru olduğu gibi bayt sayısı üzerinde hiçbir insidansı).
Olivier Grégoire

3

Haskell, 75 74 bayt

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

Giriş bir dizge listesi olarak beklenir (rowwise).


Bir yeni satır aynı uzunlukta ve daha deyimsel olduğunda, neden içe aktarma işleminden sonra noktalı virgül kullanıyorsunuz?
Jules

@Jules: Evet, genelde yaparım
siracusa,




3

C #, 150 144 137 bayt

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)

Tam / Biçimli sürüm:

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

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

Çevrimiçi deneyin!

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

Woo, ilk gönderi. Bunu geliştirmek için herhangi bir yardım çok iyi olurdu. Ben biliyorum bunu kurtulabilirsiniz indexOfiki kez yazılı. Bunu biliyordum! Haritadaki türleri Integer'dan Long'a değiştirme fikri ile oynuyordum ama sanırım bu bir çıkmaz.


Biliyorum , çok daha iyi bir Java 8 çözümü zaten var , ancak char[][]bu durumda çalışması için String'ten daha kolay olduğunu düşündüğüm bir girdi.


1
İçe aktarma işlemlerini eklemediniz (Java cevapları için gereklidirler). Bir Mapama kullanmayın int[](belki için başlatılmış olabilir new int[99]?). Sonrasında boşluğa gerek yok String[] l: String[]laynı şekilde çalışır ve daha kısadır. Yerine println(l.length-i-1)kullanın println(l.length-i-1+","). Değil, başlat yapın j: Sadece yazma: ,j;. Daha int[]önce önerildiği gibi kullanırsanız, bunu şöyle int m[]=new int[99],i=0,j;bildirin : ve bildirimi for-loop.
Olivier Grégoire

1
OlivierGrégoire , Harita için gereken ithalat konusunda haklı. Harita ile mevcut kod bazı golf gelince, bu değiştirebilirsiniz: 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>Harita kullanabilmeniz için haritaya gerek yok int; a.length-1iki kez kullanıldığından, bunun için bir değişken kullanabilirsiniz; döngüler içine her şeyi koyarak tüm parantezlerden kurtulabilirsiniz. Oh, ve PPCG'ye hoş geldiniz! :)
Kevin Cruijssen

@KevinCruijssen Teşekkürler! Döngü için ilk içeriğini döngü için bir vücutsuzluğa dönüştürmek ilham vericiydi! Süper zeki.
Michael,

@Michael Bir şey değil. Eğer henüz görmediyseniz :) Oh ve: Java golf için ipuçları ve <tüm dillerde> içinde golf için ipuçları okumaya ilginç olabilir. İlk başladığımda bana çok yardımcı oldu (ve bazen de oluyor).
Kevin Cruijssen


2

Mathematica, 48 47 39 bayt

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

Çevrimiçi deneyin!

FunctionBu, dikdörtgen bir karakter dizisini bekler. Alır Mostdizinin (tüm ama son satır) ait Reverseo zaman, s sürer Transpose*, sonra tüm bulur Positions de _karakter görünür. İlgili yüksekliklerLast her birinin öğeleridir Position.

* Mathematica'da temsil edilen 3bayt özel kullanım karakteridir . Bunun Matematikte çalışmadığını unutmayın , yaniU+F3C7\[Transpose] TIO bağlantısının sadece kullandığını unutmayın Transpose.


2

SOGL V0.12 , 9 bayt

I{ _WH╥?O

Burada dene!
Girdiyi bir dizi dizge (karakter) dizisi olarak alır.

Açıklama:

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 bayt

@JustinMariner sayesinde 16 bayt kaydedildi

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

Bir dizi dizisi olarak alınan girdi

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 teşekkürler! Kullanılmayan parametreler olarak verilen değişkenlerin başlatılmasından bıktım Array.map, bu harika bir numara.
alexanderbird

RegEx'i gerçekten bir değişkene atamanız gerekiyor mu? Doğrudan içinde kullanabilir execve birkaç bayttan tasarruf edebilirsiniz.
Shaggy

Aslında, gereklidir - süre döngü bir çizgideki her eşleşme üzerinde yinelenir ve değişkendeki regex'in iç durumu olmadan her seferinde ilk oluşuma eşleşir ve sonsuz döngü. Her yineleme yeni bir regex oluşturacak execve ilkini eşleştirecekti. Eğer regex satır içi eğer aslında yığın değişimi pasajı editörü çöküyor. Bir şey kaçırmıyorsam?
alexanderbird

@shaggy Son yorumumda sizi etiketlemeyi unuttum
alexanderbird

2

CJam, 15 14 bayt

@BusinessCat sayesinde 1 bayt kurtarıldı

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

Bu, yığında bir dizi dizeyi alan ve bir diziyi çıkaran bir bloktur.

Açıklama:

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

Aktarmadan önce tüm diziyi tersine çevirerek 1 byte tasarruf edebilirsiniz.
Business Cat

1

bip , 18 17 bayt

15 baytlık kod, -rpbayraklar için +2 .

_FI_@?'_MRVgZDs

Stdin'den girdi alır. Çevrimiçi deneyin!

açıklama

                 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 bayt

f>T0mx_d\_.tQd

Çevrimiçi test edin! Giriş, satırların bir listesidir.

açıklamalar

          .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 bayt

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

Çevrimiçi deneyin!

  • m:exhaustive/^^(\N+)_([\N*\n]+:)/giriş dizgisini tüm alt çizgi için arar ve her biri için bir eşleme nesnesi döndürür; burada birinci yakalama parantezleri, alt çizginin bulunduğu çizginin önceki bölümünü içerir ve ikinci yakalama parantezleri, dizenin geri kalanının tamamını içerir. İpin geri kalanı en az bir yeni satır içermelidir, bu nedenle alt çizgi'yi zemin seviyesinde saymayız. :exhaustiveBayrak örtüşme bu maçları verir.
  • .sort(*[0].chars)bu eşleme nesnelerini her alt çizgiden önceki satırın bölümündeki karakter sayısına göre sıralar. Bu onlara soldan sağa emreder.
  • .map(+*[1].comb("\n"))Her eşleme nesnesini, her alt çizgiyi izleyen giriş dizesinin bir kısmındaki yeni satır karakterlerinin sayısına eşleştirir - yani yükseklik. \nBir adet bit tasarruf gerçek bir yeni satır karakteridir.

0

PHP, 119 bayt

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

Hadi bunu kıralım! Buradaki girişimiz 2B karakter dizisidir.

$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

Çok satırlı bir dizgide alır. Kurulum için kredi (üstbilgi ve altbilgi) @GarethPW'ye gidiyor

Python 2,29 bayt

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

Çevrimiçi deneyin!

Bu sadece diziyi newline bölüp uzunluk-1 döndürür.


Bu, tüm mücadeleyi yerine getirmiyor. En yüksek olanı değil, tüm yükseklikleri içeren bir dizi veya liste döndürmelisiniz .
Scott Milner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.