Знайдіть мінімальні та максимальні цілі числа в масиві, не використовуючи вбудовані


15

Виклик

Дано масив цілих чисел, отриманий від stdin, аргументів функції, аргументів програми або якогось іншого методу:

Виведіть у масиві лише мінімальні та максимальні числа за допомогою зворотного значення, stdout чи інших методів підгонки.

Приклад сеансу

> minmax( {0, 15, 2, 3, 7, 18, -2, 9, 6, -5, 3, 8, 9, -14} )
-14 18

Довідкова реалізація

// C++14

void minmax(std::vector<int> v) {
    int min = v[0]; int max = v[0];
    for(auto it : v) {
        if (*it < min)
            min = *it;
        if (*it > max)
            max = *it;
    }
    std::cout << min << ' ' << max << std::endl;
}

Правила

  • Ви не можете використовувати вбудовану функцію для обчислення значень.
  • Стандартні лазівки заборонені.
  • Заохочуються творчі реалізації.
  • Це , виграє найкоротший відповідь, але він не буде обраний.

Роз'яснення

  • Якщо масив містить 1 елемент, вам потрібно вивести його двічі.
  • Якщо мінімальне та максимальне значення однакові, потрібно вивести їх обидва.

12
Це зробити X без виклику Y , які не особливо цікаві.
Мего

5
@DmitryKudriavtsev Спробуйте пісочницю наступного разу.
Мего

5
Серйозно, використовуйте пісочницю . Ваші зміни у виклику визнали недійсною кожну відповідь.
Мего

1
Я заохочував творчі методи Ні, ви заохочували короткі рішення, позначивши цеcode golf
Луїс Мендо

1
Як сказав Луїс Мендо. Так, всі просто публікують "Я сортую свій масив за допомогою вбудованого та приймати перший і останній", різними мовами, не дуже креативними: x
Walfrat

Відповіді:


29

Желе , 3 байти

Ṣ.ị

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

Сортуйте масив, а потім бере 0,5-й елемент.

Jelly використовує 1-індексацію, а засоби індексації з плаваючими точками беруть підлогу та свою стелю.

Отже 0,5-й елемент дасть вам 0-й елемент і 1-й елемент.

0-й елемент - останній елемент.


2
Досить розумний Я чекаю цього .... Желе!
Rohan Jhunjhunwala

О, так що це дозволило б знайти медіану дрібниці.
Адам

1
@KonradRudolph Це .
Leaky Nun

1
Чи не хочете ви першого та останнього елементів, а не перших двох елементів? Або я неправильно зрозумів ваше пояснення?
Toby Speight

1
@TobySpeight В 1-й індексації 0-й елемент є останнім елементом.
Leaky Nun

12

Пітон, 61 49 37 36 34 31 байт

lambda s:s.sort()or[s[0],s[-1]]

-12 байт завдяки RootTwo

Ще -12 байт завдяки чепнеру

-2 байти завдяки johnLate

-3 байти завдяки johnLate


1
Я змінив заголовок на Python, оскільки він працює і в Python 3.
Leaky Nun

1
Ви можете покататись на десятку байт: використовуйте [::(len(s)-1)or 1]для першого підписки. І другий термін можна скоротити до s[:len(s)<2].
RootTwo

Ціна сортування списку двічі, ви можете збрити ще 12 байт: lambda s:sorted(s)[:1]+sorted(s)[-1:].
чепнер

зберегти 6 байт заlambda s:sorted(s)[::len(s)-1]
Аарон

Поточна версія ( lambda s:sorted(s)[::len(s)-1]) не працює для масивів з одним елементом ( ValueError: slice step cannot be zero). Можливим виправленням буде lambda s:sorted(s*2)[::len(s*2)-1](34 байти).
johnLate

8

Brain-Flak 220 218 байт

(({}))([]){({}[()]<(([])<{({}[()]<([([({}<(({})<>)<>>)<><({}<>)>]{}<(())>)](<>)){({}())<>}{}({}<><{}{}>){{}<>(<({}<({}<>)<>>)<>({}<>)>)}{}({}<>)<>>)}{}<>{}>[()]){({}[()]<({}<>)<>>)}{}<>>)}{}({}<((())){{}{}([][()])}{}>)

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

Пояснення

Спочатку вона подвоює найвищу величину (у списку перелічено лише один довгий)

(({}))

Потім використовується мій алгоритм сортування міхура:

([]){({}[()]<(([])<{({}[()]<([([({}<(({})<>)<>>)<><({}<>)>]{}<(())>)](<>)){({}())<>}{}({}<><{}{}>){{}<>(<({}<({}<>)<>>)<>({}<>)>)}{}({}<>)<>>)}{}<>{}>[()]){({}[()]<({}<>)<>>)}{}<>>)}{}

Потім він набирає верхнє значення стека (тобто хв)

({}<...>)

Потім вона спливає, поки висота стека не дорівнює одному:

((())){{}{}([][()])}{}

8

JavaScript (ES6), 34 байти

a=>[a.sort((x,y)=>x-y)[0],a.pop()]

sortсортує на місці, тому я можу просто звернутися до індексу [0] за найнижчим значенням і popнайвищим значенням масиву, однак він робить сортування рядків за замовчуванням, тому мені доведеться пройти компаратор.


Я не думаю, що вам потрібна (x,y)=>x-yчастина, якщо тільки використання sort()алгоритму за замовчуванням не вважається вбудованим.
Скотт

1
@Scott Але я не хочу лексичного роду ...
Ніл

Правильно ... Я не перевіряв це цифрами> 10 або <0. Я не знав, що sort()все трактує все як рядки - вибачте!
Скотт



5

Код машини ARM, 26 байт

Шестнадцятковий дамп (маленький ендіан):

6810 4601 f852 cb04 4560 bfc8 4660 4561 bfb8 4661 3b01 d8f5 4770

Це функція, що не має системного виклику чи бібліотеки. Кодування - Thumb-2, змінна (2 або 4 байти) кодування для 32-бітової ARM. Як можна уявити, тут немає простого способу просто сортувати та вибрати перший та останній елементи. Загалом, тут насправді нічого фантазійного не відбувається, це майже так само, як і референтна реалізація.

Невикольована збірка (синтаксис GNU):

.syntax unified
.text
.global minmax
.thumb_func
minmax:
    @Input: @r0 and r1 are dummy parameters (they don't do anything)
    @r2 - Pointer to list of integers (int*)
    @r3 - Number of integers to sort (size_t)
    @Output:
    @Minimum of the list in r0 (int)
    @Maximum in r1 (int)
    ldr r0,[r2] @min=r2[0]
    mov r1,r0 @max=min
    loop:
        @ip is intra-procedure call register, a.k.a. r12
        ldr ip,[r2],#4 @ip=*r2++
        cmp r0,ip
        it gt @if (r0>ip)
        movgt r0,ip @r0=ip
        cmp r1,ip
        it lt @if (r1<ip)
        movlt r1,ip @r1=ip
        subs r3,r3,#1
        bhi loop @while (--r3>0)
    bx lr @Return

Випробувано на Raspberry Pi 3; ось сценарій тестування (C99, введення через argv):

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
//First 2 arguments are dummies.
uint64_t minmax(int,int,int* array,size_t size);

int main(int argc,char** argv) {
    int i;
    int array[argc-1];
    for (i=1;i<argc;i++) {
        array[i-1]=atoi(argv[i]);
    }
    uint64_t result = minmax(0,0,array,argc-1);
    printf("Minimum is %d, maximum is %d.\n",(unsigned)result,(unsigned)(result>>32));
}

4

Haskell, 27 байт

f x=(`foldl1`x)<$>[min,max]

В Haskell minі maxнаведіть мінімум і максимум два аргументи, а не список. Я не міг сказати, чи заборонено це (здається, що замість цього тільки minimumі maximumбуло б заборонено), тому, будь ласка, повідомте мене, якщо вони є, і я негайно видалю цю відповідь.


@nimi FGITW ефект, на жаль ...
ThreeFx

3

Октава, 20 байт

@(n)sort(n)([1,end])

Це сортує вхідний вектор і виводить перше і останнє значення.






3

C, 83 81 79 байт

m,M;f(a,s)int*a;{for(m=M=*a;s--;++a)*a<m?m=*a:*a>M?M=*a:0;pr‌​intf("%i %i",m,M);}

1
декларація може перетворитись ...f(a,s)int*a{...на це
кішка

1
Ви можете поєднати потрійні вирази, щоб отримати ще 2 байти:m,M;f(a,s)int*a;{for(m=M=*a;s--;++a)*a<m?m=*a:*a>M?M=*a:0;printf("%i %i",m,M);}
gastropner

У gccвас можна замінити *a>M?M=*a:0на*a<M?:M=*a
roofcat


2

V , 12 байт

:sor
ò2Gjkd

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

Подяка DJMcMayhem за це.


1
\o/Так, я вже не єдина людина, яка коли-небудь використовувала цю мову!
Джеймс

1
Якщо вхід є одним числом, це число все одно має бути виведено двічі
Луїс Мендо

@LuisMendo hm, буде працювати над цим.
Rɪᴋᴇʀ

2

CJam, 10 9 байт

q~$_(p;W>

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

Мені не дуже добре в CJam.

q~          e# eval input
  $         e# sort
   _        e# duplicate
    (       e# pop first
     p      e# print
      ;     e# remove array
       W>   e# get last element

Звичайний спосіб отримати перший елемент списку 0=(але, на жаль, це не економить жодних байтів). Два інших 9-байтних рішення: 0W]q~$f=pабо безіменний блок {$2*_,(%}.
Мартін Ендер

8 байт: q~$(p)p;. Ви можете використовувати )для отримання останнього елемента, як ви використовуєте, (щоб отримати перший.
Ділова кішка

@BusinessCat Це те, що я спочатку мав, але не вдається для одноелементного введення.
PurkkaKoodari

@ Pietu1998: О, ти маєш рацію. Я цього не помічав.
Ділова кішка



2

Обробка, 59 52 байти

void m(int[]x){x=sort(x);print(x[0],x[x.length-1]);}

Обробка насправді не дозволяє мені читати зі stdin, який я зміг знайти, і я не знаю, чи підтримує її внутрішній компілятор Java лямбди (і це було так давно, як мені довелося писати серйозну Java, яку я не не пам'ятаю, як).


Ви можете зберегти байти, видаливши пробіли післяint[]
Kritixi Lithos


1

C #, 60 байт

n=>{System.Array.Sort(n);return new[]{n[0],n[n.Length-1]};};

Наївний метод у 93 байти:

n=>{var r=new[]{n[0],n[0]};foreach(int i in n){if(i<r[0])r[0]=i;if(i>r[1])r[1]=i;}return r;};


1

Октава , 35 байт

@(x)[x(all(t=x<=x')) x(sum(t)==1)]

Це анонімна функція. Спробуйте це у ideone .

Код уникає використання сортування. А саме, він робить все попарно "менше або рівне" порівняння між елементами введення. Мінімум - це елемент, для якого всі порівняння вірні. Максимум - це те, для чого справедливо лише одне порівняння.


1

Пітон, 35 34 байти

lambda s:sorted(s+s[:1])[::len(s)]

Альтернативна версія:

lambda s:sorted(s+s)[::len(s)*2-1]

Стара версія, 35 байт.

lambda s:sorted(s+[s[0]])[::len(s)]

Досить просто: візьміть вхідний список, додайте перший елемент, відсортуйте його, потім візьміть перший та (довжину) елемент отриманого списку. Оскільки довжина вводу після додавання елемента дорівнює + 1, це закінчується прийняттям першого та останнього елемента зазначеного списку, які є мінімальними та максимальними елементами.


1
Хоча це не найкоротша відповідь у Python, це дуже креативно! +1
mbomb007

34-байтовий не працює в Python 3; це працює як у 2, так і в 3. Також він був розміщений після цього.
TLW

@ mbomb007 - чудово, гольф. Тепер це пов'язано з найкоротшим впровадженням Python, і як бонус він працює як у 2, так і в 3.
TLW

1

zsh, 22 байт

(){echo $1 $_} ${(n)@}

визначає функцію лямбда, яка друкує свій перший arg ( $1) та останній аргумент до попередньої команди ($_ ), і передає його $@після сортування, щоб попередня команда стала викликанням цієї лямбда


zsh, 21 байт

це добре працює лише в тому випадку, якщо є більше одного аргументу :(

<<<"${${(n)@}/ * / }"

сортує $@, робить його рядком і замінює все, від першого простору до останнього, одним пробілом, а потім передає його як вхід кішці з<<<


використання:

$ ./minmax 23 342 21 10
10 342

1

Скала, 55 байт

val s=args.map(_.toInt).sorted
print(s.head+" "+s.last)

Для виконання:

$ scala minmax.scala 1 2 3 4 5 6 7 8 9


1

Bash + coreutils, 30 байт

tr \  \\n|sort -n|sed '$p;1!d'

Сценарій sed друкує, після впорядкування введення, перше і останнє цілі числа.


1

постійного струму, 110 байт

?ddsMsmzdsAsa[z1-:az0<S]dsSx[>R]s?[la;asM]sR[lM]sQ[lQxla1-dsa;al?xla0<N]dsNxlAsa[<R]s?[la;asm]sR[lm]sQlNxlmlMf

Допоможіть мені dc! Ти моя єдина надія!

Дякуємо @seshoumara за те, що знайшов цю помилку!

Я поясню пояснення пізніше. Ось це трохи розбито:

?dd sM sm
zd sA sa
[z 1- :a z0<S]dsSx
 [>R]s?
 [la;asM]sR
 [lM]sQ
[lQx la 1- dsa ;a l?x la0<N]dsNx
lA sa
 [<R]s?
 [la;a sm]sR
 [lm]sQ
lNx
lm lM f

Я не записував, як викликати це, і тепер не можу згадати. Що б я не робив зараз, я роблю це неправильно, бо це завжди повернення 0 як найменший елемент.
Джо

1
Pfew! Це знадобилося, але не знайшло помилки у вашому коді. Це перший символ (0), який ви дублюєте та ініціалізуєте регістри Mта m. Але якщо у вхідному списку жодне число не менше m=0або жодне число не перевищує M=0, то ви отримуєте неправильний результат, оскільки ви штучно додали 0 до вибіркових чисел. Рішення полягає в заміні цього першого 0 на ?d, яке зчитує числа, ініціалізує Mі mостаннє число, таким чином, перетворюючи його на частину вибірки. Потім запустіть код так: echo "8 _2 5" | dc -e "? DdsMsm ....".
seshoumara

Нічого, дякую, @seshoumara! Я ніколи цього не помітив би! (Я також забув про це питання теж: P)
Джо,

1

Java, 115 байт

String f(int[]i){int t=i[0],a=t,b=t;for(int c=0;c<i.length;c++){a=i[c]<a?i[c]:a;b=i[c]>b?i[c]:b;}return""+a+" "+b;}

Безголівки:

String f(int[] i) {
    int t=i[0], a=t, b=t; // assigns a and b to i[0]
    for (int c=0; c < i.length; c++) { // loop through the array
        a=(i[c]<a) ? i[c] : a;
        b=(i[c]>b) ? i[c] : b; // assignment with ternary operator
    }
    return ""+a+" "+b; // returns a string
}

Моє перше коли-небудь рішення «гольф».

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