Misurare un mucchio di tronchi


16

introduzione

Questo è un registro di lunghezza 5:

#####

Voglio impilare un mucchio di questi ceppi uno sopra l'altro. In questo modo faccio scorrere un nuovo registro su quello più in alto da destra e smetto di scivolare quando le loro estremità sinistra o destra sono allineate (non chiedere perché). Se il nuovo registro è più lungo, scorre fino all'estremità sinistra del registro più in alto:

########  <-
#####

Se è più corto, scorre solo fino a quando le estremità destra non si allineano:

  ######  <-
########
#####

Mentre faccio scorrere più tronchi nella pila, le loro posizioni sono determinate dal registro più in alto corrente:

           ##
       ######
       ###
      ####
      ##
  ######
########
#####

Sembra fisicamente impossibile, ma facciamo finta che funzioni.

L'obiettivo

Il tuo input deve essere un elenco non vuoto di numeri interi positivi, che rappresentano le lunghezze dei miei registri. Il numero più a sinistra è il primo registro che ho inserito nella pila, quindi finisce in fondo. Nell'esempio sopra, l'input sarebbe [5,8,6,2,4,3,6,2]. L'output deve essere, per ogni colonna della pila risultante, il numero di tronchi che attraversano quella colonna. Nell'esempio sopra, l'output corretto sarebbe [2,2,3,3,3,2,4,6,3,3,1,2,2].

Regole e punteggio

L'input e l'output possono essere in qualsiasi formato ragionevole. L'output può contenere solo numeri interi positivi, ovvero non deve avere 0s iniziali o finali . Si applicano le normali regole del code-golf: è possibile scrivere un programma completo o una funzione, il conteggio dei byte più basso vince e le scappatoie standard sono vietate.

Casi test

[1] -> [1]
[4] -> [1,1,1,1]
[3,2] -> [1,2,2]
[2,3] -> [2,2,1]
[2,2,2] -> [3,3]
[2,3,2] -> [2,3,2]
[3,2,3] -> [1,3,3,1]
[1,3,2,2,1,3,1] -> [2,3,5,1,2]
[4,3,4,2,4,3,4,2] -> [1,3,3,5,5,3,4,2]
[5,8,6,2,4,3,6,2] -> [2,2,3,3,3,2,4,6,3,3,1,2,2]
[5,10,15,1,1,1,1,1,2] -> [3,3,3,3,3,2,2,2,2,2,1,1,1,1,7,1]
[13,12,2,10,14,12] -> [1,2,2,2,2,2,2,2,2,2,2,5,5,3,3,3,3,3,3,3,3,2,2,2,2]
[12,14,3,6,13,1,1] -> [2,2,2,2,2,2,2,2,2,2,2,5,4,4,2,2,2,1,1,1,1,1,1,3]
[7,5,12,5,1,10,14,5] -> [1,1,3,3,3,3,3,1,1,2,2,2,2,5,2,2,2,2,2,2,2,2,3,2,2,2,2]
[14,5,1,3,12,6,2,2,1,7,9,15] -> [1,1,1,1,1,1,1,1,1,2,2,2,2,5,2,2,1,1,1,2,2,2,2,4,8,3,3,3,3,3,3,2,2,1,1,1,1,1,1]

2
Possiamo facilmente "fingere" che funzioni, semplicemente mettendoli tutti a terra invece di impilarli in aria (facendoli scorrere uno accanto all'altro).
Jonathan Allan,

1
L'ultimo test case sembra la Norvegia!
Stewie Griffin,

Risposte:


7

Gelatina ,  18  16 byte

-2 byte richiesti dall'aiuto da miglia

Forse c'è un modo più rapido di usare la matematica piuttosto che la costruzione come questa?

IN0;»0+\0ẋ;"1ẋ$S

Provalo online! o vedi la suite di test .

Come?

IN0;»0+\0ẋ;"1ẋ$S - Link: list of positive integers, logLengths  e.g. [4, 3, 3, 1, 4, 3]
I                - incremental differences                            [-1, 0,-2, 3,-1]
 N               - negate (vectorises)                                [ 1, 0, 2,-3, 1]
  0;             - zero concatenated with that                      [0, 1, 0, 2,-3, 1]
    »0           - maximum (vectorises) of that and zero            [0, 1, 0, 2, 0, 1]
      +\         - cumulative reduce with addition                  [0, 1, 1, 3, 3, 4]
        0ẋ       - zero repeated (vectorises)    [[],[0],[0],[0,0,0],[0,0,0],[0,0,0,0]]
              $  - last two links as a monad (right is implicitly logLengths):
            1ẋ   -   one repeated     [[1,1,1,1],[1,1,1],[1,1,1],[1],[1,1,1,1],[1,1,1]]
           "     - zip with:
          ;      -   concatenation
              [[1,1,1,1],[0,1,1,1],[0,1,1,1],[0,0,0,1],[0,0,0,1,1,1,1],[0,0,0,0,1,1,1]]
              ... this is an upside-down version of the logs like those in the OP
                  with 0 for spaces and 1 for # with any right-hand-side spaces missing.
               S - sum                                           [1, 3, 3, 5, 2, 2, 2]

Siamo in grado di arrivare a 17 byte se combiniamo le nostre soluzioni:IN»0+\0;;"x@€0,1S
miglia

7

Gelatina , 19 13 byte

IN0»0;+\+"RṬS

Provalo online!

Salvato 2 byte grazie a @Jonathan Allan.

Spiegazione

IN0»0;+\+"RṬS  Input: array A
I              Increments
 N             Negate
  0»           Max with 0
    0;         Prepend 0
      +\       Cumulative sum
        +"     Vectorized add with
          R    Range, vectorizes over each integer
           Ṭ   Create a list with 1's at the specified indices
            S  Sum


3

Buccia , 16 byte

Fż+Ṡzo`Ṙ↔ḋ2eo∫Ẋ<

Provalo online!

Spiegazione

              Ẋ    For all adjacent pairs, x y
               <   return max(0,x-y)
            o∫     Cumulative sum, with an extra 0 at the start
   Ṡz              Zip the input list and ^ with ...
           e         Make a two element list
        ↔ḋ2          The list [0,1]
     o`Ṙ             Repeat each in ^ by ^^
Fż+               Sum the columns



0

Kotlin 1.1, 113 103 byte

{var l=0
var r=0
it.flatMap{l=maxOf(l,r-it+1)
r=l+it-1
(l..r).toList()}.groupBy{it}.map{it.value.size}}

Abbellire

{
    // Current row leftmost value
    var l = 0
    // Current row rightmost value
    var r = 0
    // For each log
    it.flatMap {
        // Work out the new leftmost point
        l = maxOf(
                l,
                r - it+1)
        // Use it to work out the new rightmost point
        r = l + it-1
        // Record the used columns
        (l..r).toList()}
            // Group the column numbers together
            .groupBy { it }
            // Count the amount of times each column is used
            // Put the results into a list
            .map { it.value.size }
}

Test

var z:(List<Int>)->List<Int> =
{var l=0
var r=0
it.flatMap{l=maxOf(l,r-it+1)
r=l+it-1
(l..r).toList()}.groupBy{it}.map{it.value.size}}

fun main(args: Array<String>) {
    println(z(listOf(5, 8, 6, 2, 4, 3, 6, 2)))
    println(listOf(2,2,3,3,3,2,4,6,3,3,1,2,2))
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.