ขึ้นไปข้างบนและไปสู่ความรุ่งโรจน์ที่ยิ่งใหญ่กว่า!


15

ความท้าทายนี้อาจทำหน้าที่เป็น ( อีก ) ส่วยให้สแตนลีผู้ที่ล่วงลับไปอายุ 95

สแตนลีมีซ้ายเรามรดกอันล้ำค่าและแปลกจับคำ: Excelsior ดังนั้นนี่คือความท้าทายเล็กน้อยตามสิ่งที่เขาพูดว่าเป็นความหมาย :

ในที่สุด“ Excelsior” หมายถึงอะไร “ ขึ้นไปสู่ความรุ่งโรจน์ที่ยิ่งใหญ่ขึ้น!” นั่นคือสิ่งที่ฉันต้องการให้คุณทุกครั้งที่ฉันทวีต! Excelsior!

ท้าทาย

กำหนดชุดของจำนวนเต็มไม่ลบส่งออกบรรทัดด้วยExcelsior!ทุกครั้งที่มีจำนวนเต็มมากกว่าก่อนหน้านี้

กฎระเบียบ

  • ข้อมูลที่ป้อนจะเป็นอาร์เรย์ของจำนวนเต็มที่ไม่เป็นลบ
  • เอาต์พุตจะประกอบด้วยบรรทัดที่มีคำว่าExcelsior(ตัวพิมพ์เล็กและตัวน้อย) ตามด้วยจำนวน!ความยาวของการวิ่งในปัจจุบันที่มีจำนวนมากขึ้นเรื่อย ๆ นอกจากนี้คุณยังสามารถส่งกลับอาร์เรย์ของสตริง
  • รูปแบบอินพุตและเอาต์พุตมีความยืดหยุ่นตามกฎของไซต์ดังนั้นโปรดปรับเข้ากับรูปแบบภาษาของคุณ นอกจากนี้คุณยังสามารถเพิ่มช่องว่างที่ท้ายบรรทัดหรือเพิ่มบรรทัดใหม่หลังหรือก่อนข้อความหากคุณต้องการ

ตัวอย่าง

Input             Output
-----------------------------------
[3,2,1,0,5]       Excelsior!      // Excelsior because 5 > 0

[1,2,3,4,5]       Excelsior!      // Excelsior because 2 > 1
                  Excelsior!!     // Excelsior because 3 > 2 (run length: 2)
                  Excelsior!!!    // Excelsior because 4 > 3 (run length: 3)
                  Excelsior!!!!   // Excelsior because 5 > 4 (run length: 4)

[]                <Nothing>

[42]              <Nothing>

[1,2,1,3,4,1,5]   Excelsior!      // Excelsior because 2 > 1
                  Excelsior!      // Excelsior because 3 > 1
                  Excelsior!!     // Excelsior because 4 > 3 (run length: 2)
                  Excelsior!      // Excelsior because 5 > 1

[3,3,3,3,4,3]     Excelsior!      // Excelsior because 4 > 3

นี่คือดังนั้นอาจเป็นรหัสที่สั้นที่สุดสำหรับแต่ละภาษาที่ชนะ!


ouflak สมมติว่าเลขจำนวนเต็มมีความยาว 1 หลักก็โอเค
เท่านั้น

1
@ ASCII- เท่านั้นไม่ได้จริงๆ ฉันไม่รู้ว่า LUA มีข้อ จำกัด อยู่หรือไม่ แต่ถ้าไม่ใช่กรณีนั้นลวงตาควรแยกจำนวนเต็มทุกความยาว
ชาร์ลี

@Charlie ผมไม่ทราบว่า Lua แต่แม้ว่ามันจะเป็นอย่างละเอียดก็เป็นไปได้ที่จะใช้เช่นการป้อนข้อมูลคั่นด้วยช่องว่างและแยกเช่นนี้
Kevin Cruijssen

ฉันกำลังดูอยู่ เคล็ดลับคือการสามารถจัดการกับทั้งสองสถานการณ์
ouflak

ภาษา FWIW เช่น C หรือ Javascript จะจัดการเฉพาะจำนวนเต็มภายในความแม่นยำ (9/16 หลัก) เท่านั้น
user202729

คำตอบ:


9

JavaScript (ES6), 58 54 ไบต์

a=>a.map(c=>a<(a=c)?`Excelsior${s+='!'}
`:s='').join``

ลองออนไลน์!

แสดงความคิดเห็น

a =>                           // a[] = input array, also used to store the previous value
  a.map(c =>                   // for each value c in a[]:
    a <                        //   compare the previous value
    (a = c)                    //   with the current one; update a to c
                               //   this test is always falsy on the 1st iteration
    ?                          //   if a is less than c:
      `Excelsior${s += '!'}\n` //     add a '!' to s and yield 'Excelsior' + s + linefeed
    :                          //   else:
      s = ''                   //     reset s to an empty string and yield an empty string
  ).join``                     // end of map(); join everything

เหตุใดการนำ [] ไปใช้เพื่อเก็บค่าก่อนหน้านั้นปลอดภัย

มีสามกรณีที่เป็นไปได้:

  • หากว่างเปล่าฟังก์ชันการเรียกกลับของจะไม่ถูกเรียกใช้ทั้งหมดและเราเพิ่งได้รับอาร์เรย์ที่ว่างเปล่าซึ่งจะให้สตริงว่างa[ ].map()
  • ถ้ามีอีกหนึ่งองค์ประกอบก็จะถูกบังคับให้องค์ประกอบว่าในช่วงแรก (และไม่ซ้ำกัน) การทดสอบ ดังนั้นเรากำลังทดสอบซึ่งเป็นเท็จ เราจะได้รับอาร์เรย์ที่มีสตริงที่ว่างเปล่าทำให้ได้สตริงที่ว่างอีกครั้งa[ ]xa < (a = c)x<x
  • ถ้ามีองค์ประกอบหลายอย่างก็จะถูกบังคับให้ในระหว่างการทดสอบครั้งแรก ดังนั้นผลลัพธ์จะเป็นเท็จและสิ่งที่ดำเนินการคือการเริ่มต้นของกับสตริงว่าง - ซึ่งเป็นสิ่งที่เราต้องการ การเปรียบเทียบที่มีความหมายครั้งแรกเกิดขึ้นในการทำซ้ำครั้งที่ 2a[ ]NaNa < (a = c)s

5

Python 2 , 84 83 81 70 68 ไบต์

a=n=''
for b in input():
 n+='!';n*=a<b;a=b
 if n:print'Excelsior'+n

ลองออนไลน์!

-2 ไบต์ขอบคุณ ASCII-only



@ ASCII-only Thanks :)
TFeld

ฟังก์ชั่นยาวเกินไป :(
ASCII-only

วิธีการแบบเรียกซ้ำอย่างน้อย
ASCII เท่านั้น


5

05AB1E , 26 24 23 ไบต์

ü‹γvyOE.•1Š¥èò²•™N'!׫,

-2 ไบต์ขอบคุณที่@Kroppeb

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

ü                        # Loop over the (implicit) input as pairs
                        #  And check for each pair [a,b] if a<b is truthy
                         #   i.e. [1,2,1,3,4,1,5,7,20,25,3,17]
                         #   → [1,0,1,1,0,1,1,1,1,0,1]
  γ                      # Split it into chunks of equal elements
                         #  i.e. [1,0,1,1,0,1,1,1,1,0,1]
                         #   → [[1],[0],[1,1],[0],[1,1,1,1],[0],[1]]
   vy                    # Foreach `y` over them
     O                   #  Take the sum of that inner list
                         #   i.e. [1,1,1,1] → 4
                         #   i.e. [0] → 0
      E                  #  Inner loop `N` in the range [1, length]:
       .•1Š¥èò²•         #   Push string "excelsior"
                        #   Titlecase it: "Excelsior"
                 N'!׫  '#   Append `N` amount of "!"
                         #    i.e. N=3 → "Excelsior!!!"
                      ,  #   Output with a trailing newline

ดู 05AB1E นี้เคล็ดลับของฉัน (ส่วนวิธีการบีบอัดสตริงไม่ใช่ส่วนหนึ่งของพจนานุกรม? )จะเข้าใจว่าทำไมเป็น.•1Š¥èò²•"excelsior"


2
ผมไม่ทราบจริงๆ 05AB1E แต่คุณไม่สามารถแลกเปลี่ยน0KgกับO?
Kroppeb

@ Kroppeb Ah, พลาดอย่างสมบูรณ์ แต่ใช่ฉันสามารถทำได้อย่างแน่นอน ขอบคุณ! :)
Kevin Cruijssen


4

Java-8 118 113 Bytes

n->{String e="";for(int i=0;i<n.length-1;)System.out.print(""==(n[i+1]>n[i++]?e+="!":(e=""))?e:"Excelsior"+e+"\n");}

อ่านง่าย:

private static void lee(int num[]) {
    String exclamation = "";
    for (int i = 0; i < num.length - 1;) {
        exclamation = num[i + 1] > num[i++] ? exclamation += "!" : "";
        System.out.print("".equals(exclamation) ? "" : "Excelsior" + exclamation + "\n");
    }
}

2
นี่โรงแรมพร้อมสนามกอล์ฟบางอย่างเพื่อรับส่วนลด 10 n->{var e="";for(int i=0;i<n.length-1;System.out.print(""==e?e:"Excelsior"+e+"\n"))e=n[i++]<n[i]?e+="!":"";}ไบต์: ลองใช้ออนไลน์ ( 108 ไบต์ ) (Java 10+)
Kevin Cruijssen

@KevinCruijssen ขอบคุณ!
CoderCroc

2
n->{for(int e=0,i=0;i<n.length-1;)if(n[i++]<n[i])System.out.println("Excelsior"+"!".repeat(e++));else e=0;}( 107 ไบต์ )
Olivier Grégoire

แก้ไขปัญหาของฉัน: ++eแทนที่จะe++มีอย่างน้อยหนึ่งรายการ!ที่จะพิมพ์
Olivier Grégoire

1
พิมพ์ผิด @KevinCruijssen ขนาดเล็กในสนามกอล์ฟของคุณเพื่อให้คุณได้รับหนึ่งไบต์: แทนe=...?e+"!": e=...?e+="!":
Olivier Grégoire


4

05AB1E , 20 19 ไบต์

ü‹0¡€ƶ˜ε'!×”¸Îsiorÿ

ลองออนไลน์!

คำอธิบาย

ü‹                    # pair-wise comparison, less-than
  0¡                  # split at zeroes
    €ƶ                # lift each, multiplying by its 1-based index
      ˜               # flatten
       ε              # apply to each
        '!×           # repeat "!" that many times
                  ÿ   # and interpolate it at the end of
           ”¸Îsior    # the compressed word "Excel" followed by the string "sior"

4

C (gcc / clang), 106 99 97 ไบต์

f(a,n)int*a;{int r=0,s[n];for(memset(s,33,n);n-->1;)r*=*a<*++a&&printf("Excelsior%.*s\n",++r,s);}

ขอบคุณGastropnerสำหรับการเล่นกอล์ฟ 2 ไบท์

ลองออนไลน์ได้ที่นี่

Ungolfed:

f(a, n) // function taking a pointer to the first integer and the length of the array
  int *a; { // a is of type pointer to int, n is of type int

    int r = 0, // length of the current run
        i = 0, // loop variable
        s[n];  // buffer for exclamation marks; we will never need more than n-1 of those (we are declaring an array of int, but really we will treat it as an array of char)

    for(memset(s, 33, n); // fill the buffer with n exclamation marks (ASCII code 33)
        n -- > 1; ) // loop over the array

        r *= *a < *(++ a) // if the current element is less than the next:
             && printf("Excelsior%.*s\n", // print (on their own line) "Excelsior", followed by ...
                       ++ r, // ... r (incremented) of the ...
                       s) // ... n exclamation marks in the buffer s
             ; // else r is reset to 0

}

ฉันเริ่มแก้ปัญหา แต่สุดท้ายก็ใกล้เคียงกับคุณมากที่โพสต์ของฉันเป็นคำตอบที่แยกจากกันรู้สึกโง่เล็กน้อย ยังคงมีความแตกต่างเล็กน้อยที่มีสามารถช่วยคุณประหยัดไม่กี่ไบต์
Gastropner

@gastropner ขอบคุณที่แบ่งปันเวอร์ชันของคุณ ฉันรวมการปรับปรุงของคุณและเล่นกอล์ฟต่อไปที่ 99 ไบต์ ถ้าเพียง แต่เราไม่จำเป็นต้องจัดการอาเรย์ที่ว่างเปล่ามิฉะนั้นจะเป็น97 ไบต์โดยใช้รูปแบบลูปของคุณ
OOBalance

4

Japt -R, 25 22 ไบต์

ò¨ ËÅ£`Ex­lÐâ`ú'!Y+A
c

ลองมัน

บันทึกขนาด 3 ไบต์ด้วยKamil

ò¨                      :Partition at items that are greater than or equal to the previous item
   Ë                    :Map
    Å                   :  Slice off the first element
     £                  :  Map each element at 0-based index Y
      `Ex­lÐâ`           :    Compressed string "Excelsior"
             ú'!        :    Right pad with exclamation marks
                Y+A     :     To length Y+10
c                       :Flatten
                        :Implicitly join with newlines & output


-Rธงไม่จริงจำเป็นท้าทายว่าคุณสามารถส่งออกอาร์เรย์ของสตริง
Kamil Drakari

ขอขอบคุณ @KamilDrakari ฉันลองวิธีแก้ปัญหาโดยใช้การsliceผ่านครั้งแรกของฉัน แต่ไม่สนใจเมื่อมันใช้งานได้นานเกินไป กลับมาทันทีด้วยการกระตุ้นเตือนของคุณฉันคิดว่าฉันน่าจะติดอยู่กับมันเพราะฉันได้ถึง 22 ด้วย
Shaggy


3

Java 8, 106 ไบต์

n->{String s="",z=s;for(int i=0;i<n.length-1;)z+=n[i++]<n[i]?"Excelsior"+(s+="!")+"\n":(s="")+s;return z;}

ลองออนไลน์!

(การมอบหมายใหม่ของs... yikes)


คุณสามารถเล่นกอล์ฟอีกสองไบต์โดยแทนที่(s="")+s=>(s="")
OOBalance

1
n->{String s="",z=s;for(int i=0;i<n.length-1;)z+=n[i++]>=n[i]?s="":"Excelsior"+(s+="!")+"\n";return z;}( 103 ไบต์ ) ย้ายs=""ไปยังไบต์สำรอง
Olivier Grégoire


3

R , 111 ไบต์

function(a,r=rle(sign(diff(a))),v=r$l[r$v>0])write(paste0(rep("Excelsior",sum(v)),strrep("!",sequence(v))),1,1)

ลองออนไลน์!

R ส่วยไกลดีกว่าที่สามารถพบได้ที่นี่ - ฉันถูกจับจ้องเกินไปและsequencerle


นี่ไม่ได้ให้บรรทัดว่างเปล่า แต่มี86 bytes?
J.Doe

2
@ J.Doe แดงนั่นเป็นวิธีที่ดีกว่า ฉันจะโพสต์ตัวเองว่าถ้าฉันเป็นคุณ
Giuseppe

3

เยลลี่ขนาด 16 ไบต์

<Ɲṣ0ÄẎ”!ẋ“Ø6ḥ»;Ɱ

ลิงก์ monadic ที่ให้รายการของอักขระ

ลองออนไลน์! (ส่วนท้ายรวมกับบรรทัดใหม่)

อย่างไร?

<Ɲṣ0ÄẎ”!ẋ“Ø6ḥ»;Ɱ - Link: list of integers     e.g. [1,1,4,2,1,1,3,4]
 Ɲ               - for each pair of integers:      [1,1] [1,4] [4,2] [2,1] [1,1] [1,3] [3,4]
<                -   less than?                    [  0,    1,    0,    0,    0,    1,    1]
  ṣ0             - split at zeros                  [[],    [1],     [],   [],      [1,    1]]
    Ä            - cumulative sums                 [[],    [1],     [],   [],      [1,    2]]
     Ẏ           - tighten                         [1,1,2]
      ”!         - literal '!' character           '!'
        ẋ        - repeat (vectorises)             [['!'],['!'],['!','!']]
         “Ø6ḥ»   - dictionary lookup               ['E','x','c','e','l','s','i','o','r']
               Ɱ - map with:
              ;  -   concatenate                   [['E','x','c','e','l','s','i','o','r','!'],['E','x','c','e','l','s','i','o','r','!'],['E','x','c','e','l','s','i','o','r','!','!']]


3

Japt , 22 ไบต์

ò¨ ®£`Ex­lÐâ`+'!pYÃÅÃc

ลองออนไลน์!

คำอธิบายพร้อมตัวอย่างง่าย ๆ :

ò¨                       :Split whenever the sequence does not increase
                           e.g. [2,1,1,3] -> [[2],[1],[1,3]]
   ®               Ã     :For each sub-array:
    £            Ã       :  For each item in that sub-array:
     `Ex­lÐâ`             :    Compressed "Excelsior"
            +            :    Concat with
             '!pY        :    a number of "!" equal to the index
                               e.g. [1,3] -> ["Excelsior","Excelsior!"]
                  Å      :  Remove the first item of each sub-array
                            e.g. [[Excelsior],[Excelsior],[Excelsior,Excelsior!]]->[[],[],[Excelsior!]]
                    c    :Flatten
                           e.g. [[],[],[Excelsior!]] -> [Excelsior!]

3

Powershell, 69 ไบต์

$args|%{if($o-ne$e-and$_-gt$o){'Excelsior'+'!'*++$c}else{$c=0}$o=$_}

สคริปต์ทดสอบที่ตีกอล์ฟน้อยกว่า:

$f = {

$args|%{
    if($old-ne$empty-and$_-gt$old){
        'Excelsior'+'!'*++$c
    }else{
        $c=0
    }
    $old=$_
}

}

@(
    ,( (3,2,1,0,5),  'Excelsior!')      # Excelsior because 5 > 0

    ,( (1,2,3,4,5),  'Excelsior!',      # Excelsior because 2 > 1
                    'Excelsior!!',     # Excelsior because 3 > 2 (run length: 2)
                    'Excelsior!!!',    # Excelsior because 4 > 3 (run length: 3)
                    'Excelsior!!!!')   # Excelsior because 5 > 4 (run length: 4)

    ,( $null,         '')                # <Nothing>

    ,( (42),          '')                # <Nothing>

    ,( (1,2,1,3,4,1,5), 'Excelsior!',      # Excelsior because 2 > 1
                        'Excelsior!',      # Excelsior because 3 > 1
                        'Excelsior!!',     # Excelsior because 4 > 3 (run length: 2)
                        'Excelsior!')      # Excelsior because 5 > 1

    ,( (3,3,3,3,4,3),   'Excelsior!')      # Excelsior because 4 > 3
) | % {
    $a,$expected = $_
    $result = &$f @a
    "$result"-eq"$expected"
    $result
}

เอาท์พุท:

True
Excelsior!
True
Excelsior!
Excelsior!!
Excelsior!!!
Excelsior!!!!
True
True
True
Excelsior!
Excelsior!
Excelsior!!
Excelsior!
True
Excelsior!

1
ที่นั่นฉันพยายามจะให้ตัวชี้ความล่าช้าทำงาน แต่ไม่สามารถคิดได้ว่าจะทำอย่างไร
Veskah

3

PowerShell , 87 85 ไบต์

param($n)for(;++$i-lt$n.count){if($n[$i]-gt$n[$i-1]){"Excelsior"+"!"*++$c}else{$c=0}}

ลองออนไลน์!

อาจมีการปรับโครงสร้างซ่อนตัวอยู่ในนั้นส่วนใหญ่เป็นถ้าอื่น แต่โดยรวมค่อนข้างดี ใช้ 'ol 'Un-instantiated ค่าเริ่มต้นของตัวแปร 0' !เคล็ดลับสำหรับทั้งการทำดัชนีและ


2

เรติน่า , 55 ไบต์

\d+
*
L$rv`(_*,(?<!(?(1)\1|\2,)))+(_+)\b
Excelsior$#1*!

ลองออนไลน์! ลิงก์มีกรณีทดสอบ คำอธิบาย:

\d+
*

แปลงเป็นเอก

rv`(_*,(?<!(?(1)\1|\2,)))+(_+)\b

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

L$...
Excelsior$#1*!

สำหรับการแข่งขันแต่ละครั้งเอาท์พุทExcelsiorด้วยจำนวนตัวเลขเพิ่มเติมในการทำงานตามที่ต้องการ


2

Pyth, 32 ไบต์

j+L"Excelsior"*L\!fT.u*hN<0Y.+Q0

ลองออนไลน์ได้ที่นี่หรือตรวจสอบทุกกรณีการทดสอบในครั้งเดียวที่นี่

j+L"Excelsior"*L\!fT.u*hN<0Y.+Q0   Implicit: Q=eval(input())
                            .+Q    Get forward difference between consecutive elements of Q
                    .u         0   Reduce the above, returning all steps, with current value N starting at 0, next element as Y, using:
                       hN            N+1
                      *              Multiplied by
                         <0Y         1 if 0<Y, 0 otherwise
                  fT               Filter to remove 0s
              *L\!                 Repeat "!" each element number of times
 +L"Excelsior"                     Prepend "Excelsior" to each
j                                  Join on newlines, implicit print


2

Lua , 88 87 83 82 96 95 113 ไบต์

ขอบคุณ @Kevin Cruijssen สำหรับการอัปเดตที่ยึดมั่นในจิตวิญญาณของคำถามเดิม

s=io.read()n=9 e="Excelsior!"f=e
for c in s.gmatch(s,"%S+")do if n<c+0then print(e)e=e..'!'else e=f end n=c+0 end

ลองออนไลน์!


1
ขออภัยคุณต้องพิมพ์เครื่องหมายอัศเจรีย์ตามกฎ (เครื่องหมายอัศเจรีย์หนึ่งอันต่อความยาวของการเรียกใช้ปัจจุบันของจำนวนที่มากขึ้นเรื่อย ๆ )
Charlie

ไม่มีปัญหา. คิดว่าฉันได้ทำเท่าที่ฉันสามารถทำที่นี่เว้นแต่คนอื่นเห็นอะไรบางอย่าง ...
ouflak

1
ฉันไม่รู้ว่า Lua ดีเกินไป แต่นี่คือการแก้ไขสำหรับรหัสของคุณดังนั้นมันจึงเรียกใช้กรณีทดสอบทั้งหมดได้อย่างถูกต้องขณะนี้คุณเพิ่งพิมพ์ "!" มากขึ้นทุกครั้งที่ตัวเลขสูงกว่าครั้งก่อน แต่คุณจะไม่รีเซ็ตเป็น 1 เมื่อไม่เป็นเช่นนั้น อาจจะสามารถเล่นกอล์ฟได้มากกว่า แต่เนื่องจากฉันไม่เคยเล่นกอล์ฟที่ Lua ฉันจึงมุ่งเน้นที่การแก้ไขด้วยสนามกอล์ฟเล็ก ๆ เท่านั้น PS: ไม่แน่ใจว่าถ้าสมมติว่าการป้อนข้อมูลอยู่เสมอหลักเดียวที่ถูกต้อง ..
เควิน Cruijssen

2
ตั้งแต่ @Charlie กล่าวถึงในความคิดเห็นด้านล่างคำอธิบายความท้าทายที่มันควรจะเป็นไปได้ที่จะใช้ตัวเลขหลายหลักเป็น input ที่นี่การแก้ไขที่เป็นไปได้โดยการป้อนข้อมูลคั่นด้วยช่องว่างและแยกกับมัน
Kevin Cruijssen

ฉันตัดสินใจว่าการปรับเปลี่ยน Kevin Cruijssen มีความสอดคล้องกับความคาดหวังของ OP มากขึ้น ขอบคุณ!
ouflak

2

C ++ 14 (g ++), 123 118 ไบต์

[](auto a){for(int n=0,i=0;++i<a.size();)a[i]>a[i-1]?puts(&("Excelsior"+std::string(++n,33))[0]):n=0;}

โชคดีที่มีคอนสตรัคที่ซ้ำได้std::string charลองออนไลน์ได้ที่นี่

ขอบคุณGastropnerสำหรับการบันทึก 5 ไบต์

Ungolfed:

[] (auto a) { // void lambda taking a std::array of integer

    for(int n = 0, // length of the current run
        i = 0; // loop variable
        ++ i < a.size(); ) // start with the second element and loop to the last
        a[i] > a[i - 1] // if the current element is greater than the previous ...
        ? puts( // ... print a new line:
               &("Excelsior" + // "Excelsior, followed by ...
                std::string(++ n, 33)) // ... the appropriate number of exclamation marks (33 is ASCII code for '!'); increment the run length
               [0]) // puts() takes a C string
        : n = 0; // else reset run length

}

คุณสามารถโกนทิ้งได้อีก 5 ไบต์
Gastropner

2

C # (.NET Core) , 115 107 105 ไบต์

a=>{var b="";for(int i=0;++i<a.Length;)if(a[i]>a[i-1])Console.WriteLine("Excelsior"+(b+="!"));else b="";}

ลองออนไลน์!

-8 ไบต์: เปลี่ยน b เป็นการถือสตริง "!" s จากตัวนับ int
-2 ไบต์: ตั้ง b+="!" เป็นฟังก์ชันอินไลน์ (ขอบคุณZac Faragher )

ใช้ตัวแทนการดำเนินการเพื่อดึงข้อมูลเข้าและไม่ต้องการผลตอบแทน

Ungolfed:

a => {
    var b = "";                         // initialize the '!' string (b)
    for(int i = 0; ++i < a.Length;)     // from index 1 until the end of a
        if(a[i] > a[i - 1])                 // if the current index is greater than the previous index
            Console.WriteLine("Excelsior" +     // on a new line, print "Excelsior"
                                    (b += "!"));    // add a "!" to b, and print the string
        else                                // if the current index is not greater than the previous index
            b = "";                             // reset b
}

1
คุณสามารถบันทึก 2 ไบต์โดยทำb+="!"แบบอินไลน์ด้วย Excelsior if(a[i]>a[i-1])Console.WriteLine("Excelsior"+(b+="!")); ลองใช้ออนไลน์!
Zac Faragher




1

VBA, 114 ไบต์

For i=0 To UBound(a)-LBound(a)-1 If a(i+1)>a(i)Then s=s&"!" Debug.Print("Excelsior"&s&"") Else s="" End If Next i

aแต่น่าเสียดายที่นี้ไม่ได้เป็นวิธีการแก้ปัญหาที่ถูกต้องในขณะที่มันต้องอาศัยการมีตัวแปรที่กำหนดไว้อย่างชัดเจน ที่กล่าวว่าหากคุณกำหนดฟังก์ชั่นเป็น a subroutineที่รับอินพุตเป็นตัวแปรของอาเรย์ประเภทที่คาดหวังจากนั้นคุณสามารถเปลี่ยนวิธีการของคุณเป็นโซลูชั่นที่ถูกต้อง เวอร์ชัน Golfed ของวิธีการนั้นจะมีลักษณะ sub f(x) For i=0To UBound(x)-1 If x(i+1)>x(i)Then s=s+"!":Debug.?"Excelsior"s:Else s="" Next End Subที่ตัวแบ่งระหว่างบล็อกรหัสเป็นตัวแทนของบรรทัดใหม่
Taylor Scott

1

Python 3, 87 ไบต์

c='!'
for i in range(1,len(n)):
    if n[i]>n[i-1]:print('Excelsior'+c);c+='!'
    else:c='!'

หรือ 97 มีดังต่อไปนี้:

c='!';n=input()
for i in range(1,len(n)):
    if n[i]>n[i-1]:print('Excelsior'+c);c+='!'
    else:c='!'

สมมติว่าอินพุตนี้อยู่ในรูปแบบ:

32105
12345
<null input>
1
1213415
333343

1
โปรแกรมแรกของคุณไม่ถูกต้องเนื่องจากรับอินพุตผ่านตัวแปรที่กำหนดไว้ล่วงหน้า อย่างที่สองคือค่าคงที่เนื่องจากไม่สามารถแยกความแตกต่างระหว่างตัวเลขที่มีหลายหลัก ทำไมไม่ใช้Python 2หรือเปลี่ยนเป็นฟังก์ชั่นแทนล่ะ?
Jo King

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