Вгору і далі до більшої слави!


15

Нехай цей виклик послужить ( черговою ) даниною Стану Лі, який помер у віці 95 років.

Стен Лі залишив нам неоціненну спадщину та своєрідне словесне слово: 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 припускає, що цілі числа є одноцифровою, це нормально
лише ASCII

1
@ ASCII-тільки не дуже. Я не знаю, чи має LUA обмеження з цим, але якщо це не так, ouflak повинен розбирати цілі числа будь-якої довжини.
Чарлі

@Charlie Я не знаю Луа, але, хоча це багатослівний, можна взяти, наприклад, введення з обмеженим пробілом і розділити так .
Кевін Кройсейсен

Я дивлюся на це. Трюк - вміти обробляти обидва сценарії.
ouflak

Мови FWIW, такі як C або Javascript, в будь-якому разі будуть обробляти лише цілі числа в межах своєї точності (9/16 цифр).
користувач202729

Відповіді:


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()
  • Якщо [ ] містить рівно один елемент х , він примушується до цього елементу в протягом першого (і єдиного) тесту . Отже, ми тестуємо x < x , що є помилковим. Ми отримуємо масив, що містить порожній рядок, отримуючи знову порожній рядок.a[ ]xa < (a = c)x<x
  • Якщо [ ] містить кілька елементів, воно примушує під час першого випробування . Тому результат є хибним, і те, що виконується, - ініціалізація s в порожній рядок - чого ми хочемо. Перше змістовне порівняння відбувається на 2-й ітерації.a[ ]NaNa < (a = c)s


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 Ах, це зовсім пропустив, але так, я справді можу. Спасибі! :)
Кевін Кройсейсен


4

Java-8 118 113 байт

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+)
Кевін Кройсейсен

@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 байт )
Олів'є Грегоар

Виправлення моєї проблеми: ++eзамість e++того, !щоб було надруковано хоча б одне .
Олів’є Грегоар

1
@KevinCruijssen Невеликий друк у вашому гольфі, щоб ви набрали один байт: e=...?e+"!":замість e=...?e+="!":.
Олів'є Грегоар


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

Завдяки гастропнеру за те, що гольфу в 2 байти.

Спробуйте його онлайн тут .

Безголівки:

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 Дякуємо, що поділилися вашою версією. Я включив ваші вдосконалення та доповнив його додатково 99 байтами. Якби нам не потрібно було обробляти порожній масив - інакше це буде 97 байт , використовуючи ваш стиль циклу.
OOBalance

4

Japt -R, 25 22 байт

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

Спробуй це

3 байти збережено завдяки Камілю

ò¨                      :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Прапор насправді не потрібен. Проблема говорить, що ви можете вивести масив рядків.
Каміль Дракарі

Гарний, спасибі, @KamilDrakari. Я спробував рішення, використовуючи sliceна своєму першому пропуску, але відхилив його, коли воно вийшло занадто довго. Повертаючись до цього зараз, з вашим спонуканням, я гадаю, я мав би застрягти з ним, тому що я його також знизив до 22.
Кудлатий


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... врожаїв)


Ви можете (s="")+s(s="")
пограти

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=""до запасних байтів.
Олів'є Грегоар


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 данину можна знайти тут - я був надто зациклена на sequenceі rle.


Це не дає порожніх рядків, але 86 байт?
J.Doe

2
@ J.Doe бовтався, так краще. Я б написав це сам, якби ти був.
Джузеппе

3

Желе , 16 байт

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

Монадічна Посилання, що дає список списків символів.

Спробуйте в Інтернеті!(Футер поєднується з новими рядками)

Як?

<Ɲṣ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
Ось так, я намагався завести покажчик відставання на роботу, але не міг придумати, як це зробити.
Веська

3

PowerShell , 87 85 байт

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

Спробуйте в Інтернеті!

Там, мабуть, ховається реструктуризація, швидше за все, якщо ні, але загалом досить добре. Використовує трюк ol "Неінстанційована змінна за замовчуванням 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

Луа , 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
Вибачте, але вам потрібно надрукувати знак оклику відповідно до правил (один знак оклику на довжину поточного пробігу дедалі більших чисел).
Чарлі

Без проблем. Подумайте, я зробив стільки, скільки можу зробити тут, якщо хтось ще щось не побачить ...
ouflak

1
Я не знаю Луа занадто добре, але ось виправлення вашого коду, тому він правильно виконує всі тестові випадки. На даний момент ви просто надрукуєте "!" більше кожного разу, коли число вище попереднього, але ви не скидаєте його до рівня 1, коли це не так. Можливо, більше можна пограти в гольф, але оскільки я ніколи не займався гольфом у Луа, я зосередився на тому, щоб виправити це лише незначними гольфами. PS: Не впевнений, якщо припускати, що введення завжди однозначні, це правильно ..
Kevin Cruijssen

2
Оскільки @Charlie в коментарі нижче опису виклику згадував, що слід вводити багатоцифрові числа як вхідні дані, тут можливе виправлення, взявши введений розділом пробіл і розділивши його .
Кевін Кройсейсен

Я вирішив, що модифікації Кевіна Круїссена більше відповідають очікуванню ОП. Спасибі!
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, є конструктор, який повторює a char. Спробуйте його онлайн тут .

Завдяки gastropner за збереження 5 байт.

Безголівки:

[] (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 на рядок, що містить "!" З лічильника int
-2 байти: встановити b+="!" як вбудовану функцію (завдяки Заку Фарагеру )

Використовує делегата Action щоб вивести вхід і не вимагати повернення.

Безголівки:

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+="!")); Спробуйте в Інтернеті!
Зак Фарагер



1

Java, 113 байт

String i="";for(int a=0;a<s.length-1;a++){if(s[a+1]>s[a]){i+="!";System.out.println("Excelsior"+i);}else{i="";}}

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. Це означає, subroutineщо якщо ви визначите функцію як a, яка приймає вхід як варіант масиву очікуваного типу, ви можете перетворити свій підхід у дійсне рішення. Виглядала б така версія підходу 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, де перерви між блоком коду представляють нові рядки
Тейлор Скотт

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 або не перетворити його на функцію ?
Джо Кінг

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.