การวัดกองบันทึก


16

บทนำ

นี่คือบันทึกของความยาว 5:

#####

ฉันต้องการกองของบันทึกเหล่านี้อยู่ด้านบนของกันและกัน ฉันจะทำสิ่งนี้ได้อย่างไรว่าฉันเลื่อนบันทึกใหม่ไปยังด้านบนสุดจากด้านขวาและหยุดเลื่อนเมื่อแนวด้านซ้ายหรือด้านขวาของพวกเขาอยู่ในแนวเดียวกัน (ไม่ต้องถามสาเหตุ) หากบันทึกใหม่ยาวขึ้นมันจะเลื่อนไปจนสุดทางด้านซ้ายของบันทึกสูงสุด:

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

ถ้ามันสั้นกว่ามันจะเลื่อนจนกระทั่งขวาสุดชิด:

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

ขณะที่ฉันเลื่อนบันทึกลงในกองมากขึ้นตำแหน่งของพวกเขาจะถูกกำหนดโดยบันทึกสูงสุดปัจจุบัน:

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

สิ่งนี้ดูเป็นไปไม่ได้ทางร่างกาย แต่ลองทำเป็นว่ามันใช้ได้

งาน

ข้อมูลที่คุณป้อนจะต้องเป็นรายการจำนวนเต็มบวกที่ไม่ว่างเปล่าซึ่งแสดงถึงความยาวของบันทึกของฉัน จำนวนซ้ายสุดคือบันทึกแรกที่ฉันใส่ไปยังเสาเข็มดังนั้นมันจะจบลงที่ด้านล่าง [5,8,6,2,4,3,6,2]ในตัวอย่างข้างต้นใส่จะเป็น ผลลัพธ์ของคุณจะต้องมีจำนวนบันทึกที่ข้ามคอลัมน์นั้นแต่ละคอลัมน์ [2,2,3,3,3,2,4,6,3,3,1,2,2]ในตัวอย่างข้างต้นแสดงผลที่ถูกต้องจะเป็น

กฎและการให้คะแนน

อินพุตและเอาต์พุตสามารถอยู่ในรูปแบบที่สมเหตุสมผล เอาท์พุทสามารถมีจำนวนเต็มบวกคือมันต้องไม่นำหน้าหรือต่อท้าย0s ใช้กฎการเล่นกอล์ฟรหัสปกติ: คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบการนับจำนวนไบต์ที่ต่ำที่สุดและห้ามไม่ให้มีช่องโหว่มาตรฐาน

กรณีทดสอบ

[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
เราสามารถ "เสแสร้ง" มันใช้งานได้ง่ายเพียงแค่ให้พวกเขาทั้งหมดอยู่บนพื้นดินแทนที่จะวางพวกมันขึ้นไปในอากาศ (เลื่อนไปติดกัน)
Jonathan Allan

1
กรณีทดสอบสุดท้ายดูเหมือนว่านอร์เวย์!
Stewie Griffin

คำตอบ:


7

เยลลี่ ,  18  16 ไบต์

-2 ไบต์ได้รับแจ้งโดยความช่วยเหลือจากไมล์

อาจมีวิธีที่เร็วกว่าในการใช้คณิตศาสตร์มากกว่าการสร้างแบบนี้

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

ลองออนไลน์! หรือดูการทดสอบในตัว

อย่างไร?

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]

เราสามารถไปถึง 17 ไบต์ถ้าเรารวมการแก้ปัญหาของเรา:IN»0+\0;;"x@€0,1S
ไมล์



3

Husk , 16 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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

{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}}

เชิดชู

{
    // 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 }
}

ทดสอบ

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))
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.