Базовий сорт, з дратівливою помилкою


28

Ваш вхід - це список / послідовність / вектор / масив з 5-255 натуральних чисел, не обов'язково унікальний. Ви можете припустити, який формат введення є найбільш підходящим, і що кожне ціле число (як і кількість цілих чисел) вибирається рівномірно однаково з діапазону 5-255.

Мета - вивести той самий список у тому самому (або еквівалентному) форматі, але відсортований у порядку збільшення (не зменшується). Поширена рання вправа в вивченні мови. До матеріалів, що включають:

  1. Відповідь, яка працює правильно і досягає мети; і

  2. Друга відповідь, яка містить дратівливу помилку. Від 1% до 10% часу, вихід повинен бути списком у правильному форматі та містить правильні елементи, але в неправильному порядку (будь-який порядок, крім правильно відсортованого). Решту часу програма повинна правильно працювати і досягати мети.

Дві відповіді повинні мати відстань Левенштейна одна; тобто ми можемо отримати один від іншого, видаливши один байт, або додавши один байт, або змінивши один байт.

Забивання, як зазвичай, у коді-гольф (на основі коротшої з ваших двох відповідей), із звичайними лазівками заборонені.

10% бонус (зменшення балу), якщо дратівлива помилка не залежить від входу, тобто використання того ж вводу знову не відтворює помилку (за винятком між 1% та 10% часу).


9
Ласкаво просимо до PPCG! Я пропоную зняти бонус, це не дуже хороша практика.
Містер Xcoder

2
Незрозуміло, яка ймовірність кожної можливої ​​довжини вводу.
користувач202729

12
Чи повинен бути виконаний показник між 1% і 10% часу для кожного вводу або просто загальний для набору можливих входів? Для деяких входів, таких як [5,5,5]неможливо зробити неправильне замовлення
Луїс Мендо

4
Існує тонкощі щодо наших форматів вводу-виводу за замовчуванням . Якщо наш код визначає функцію, чи добре, якщо він має певний шанс визначити функцію послідовно баггі, на відміну від визначення функції, яка має певний шанс бути помилкою?
xnor

1
@VadimPonomarenko На цьому сайті люди можуть надавати функції, а також повноцінні програми. xnor запитує, чи дозволено мати функцію, яка в 1% до 10% часу, коли створюється, є помилковою функцією, яка завжди матиме помилку. Тримаючись до листа вашого запитання, відповідь, ймовірно, ні , але було б веселіше, якби так .
wizzwizz4

Відповіді:


9

Python 3 , 36 байт

Безкоштовна версія, 37 байт

lambda l:sorted(l,reverse=l[-9:]==[])

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

Дратівлива версія, 36 байт

lambda l:sorted(l,reverse=l[9:]==[])

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

Це залежить від вкладених даних і тому не може претендувати на бонус.
Ймовірність виходу з ладу становить близько 2%. Виходить з ладу, коли довжина вводу менша за 10.

У поєднанні з відповіддю LyricLy це отримує 34 байти:

lambda l:sorted(l)[::l[9:]>[]or 1]
lambda l:sorted(l)[::l[9:]>[]or-1]

Я не думаю, що вам потрібен простір у версії без помилок.
wizzwizz4

@ wizzwizz4 без пробілу or1буде інтерпретовано як ім'я змінної та викликає синтаксичну помилку.
ов

9

05AB1E , 5 * 0,9 = 4,5 байт

Робоче рішення

{TLΩi

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

Пояснення

{      # sort input
 TL    # push the range [1 ... 10]
   Ω   # pick a random number in the range
    i  # if true (equal to 1), do nothing

Розчин, що містить помилку

Дає неправильне рішення 10% часу (незалежно від введення).

{TLΩiR

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

Пояснення

Те саме, що і робоче рішення, за винятком того, що перетворює список, якщо вибране число є істинним.


Серйозно, що ей. Вихід навіть не є правильним.
Джошуа

@ Джошуа Що ти маєш на увазі?
Ерік Аутгольфер

Спробуйте в Інтернеті, він показує, що виводить список списків.
Джошуа

4
@Joshua Посилання TiO включає заголовок 100Fі колонтитул, },які допомагають нам візуалізувати результат функції, викликаної на вході кілька разів. Це показує нам, що робоче рішення завжди повертає правильні результати, тоді як помилка має недолік.
Містер Xcoder

Будь ласка, хтось, поясніть алгоритм. Незабаром я прийму подання з найвищим рейтингом (або одне з найвищих рейтингів). Я не можу прийняти рішення, яке я не можу зрозуміти.
Вадим Пономаренко

7

Желе , 7 * (100% - 10%) = 6,3 байт

Ṣ¹⁵X:¤¡

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

Версія баггі:

ṢẊ⁵X:¤¡

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

В обох посиланнях є тестовий джгут, який запустить код 100 разів, кожен раз зі списком, який ви подаєте як аргумент, а потім поверне результати.

Імовірність кожної вхідної довжини:

0.1 - 0.1/(length!)

Так, для довжини 1 існує ймовірність 0%, для довжини 2 5%, для довжини 3 8,83̅%, для довжини 4 9,583̅% тощо до довжини ∞, яка має 10% ймовірності.


Повинно бути 0.1 - 0.1/(length!).
user202729

@ user202729 впевнений
Erik the Outgolfer

Ṣ⁵X’¤¡і Ṣ⁵X¤¡має працювати також: баггі-версія повертає список несортованим <10% часу, і, враховуючи, що введення вибрано рівномірно випадковим чином, він повинен працювати, зберігаючи 2 байти.
користувач202729

Якщо це рішення вам не подобається, ви, очевидно, можете просто видалити ¹збереження 1 байта (кількість підрахунків правил байт = коротший); також спостерігається стороннє поєднання накладок після другого 6в 6.6̅%.
користувач202729

@ user202729 На жаль, тоді він більше не буде незалежним від введення даних, і ні, я не можу "просто видалити ¹", тому що тоді він би не сортував взагалі 10% часу.
Erik the Outgolfer

6

Python 3, оцінка 58 57 - 10% = 51,3

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

Безкоштовна версія, 57 байт

lambda m:sorted(m)[::random()>.1or 1]
from random import*

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

Виправлена ​​версія, 57 байт

lambda m:sorted(m)[::random()>.1or-1]
from random import*

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

Я вирішив спробувати рішення, яке використовує бонус. Це не перемагає іншу відповідь Python, але мені було весело, придумуючи це.



4

Groovy , 31 байт

Виправлене рішення:

{a->a.sort()[a[9]?0..-1:-1..0]}

Робоче рішення:

{a->a.sort()[a[0]?0..-1:-1..0]}

Оператор підрозділу Groovy ( getAtметод) повертає null для списків, якщо індекс більший за розмір. Отже, якщо є дев'ятий елемент, він залишатиметься таким же, як і відсортований список, але якщо ні (1.99203187% шансів), він буде перетворений. Однак завжди знайдеться перший елемент, оскільки розмір списку завжди більший або дорівнює 5. Тож 0 у a[0]може бути замінений на 1, 2, 3 або 4.


1
Ласкаво просимо на сайт і приємне перше повідомлення!
caird coinheringaahing

3

Мова Вольфрама (Mathematica) , 29 байт

Це 26,1 байт з бонусом, але я не зовсім впевнений, що я заробляю бонус; на вже відсортованому вході обидві версії завжди дають відсортований вихід.

Безкоштовна версія (29 байт)

If[RandomReal[]<0.,#,Sort@#]&

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

Дратівлива версія (30 байт)

If[RandomReal[]<0.1,#,Sort@#]&

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


3

PHP, 70 байт

Безкоштовна версія, 70 байт

<?unset($argv[0]);((rand(1,9)?"":r).sort)($argv);echo join(" ",$argv);

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

Виправлена ​​версія, 70 байт

<?unset($argv[0]);((rand(0,9)?"":r).sort)($argv);echo join(" ",$argv);

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

Помилкова версія сортує у зворотному порядку 10% часу (на основі генератора випадкових чисел).


немає необхідності в тезі з -r(-2 байти). приєднатись підкресленням; що має бути еквівалентним (-2 байти). використовувати asortзамість sort(-1 байт).
Тит

... або використовувати ціле слово замість префікса (чи ні): unset($argv[0]);(rand(1,9)?sort:rsort)($argv);echo join(_,$argv);(також 65 байт)
Тит

3

Python 2 , 26 байт

Баггі:

lambda l:l[9:]and l.sort()

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

Виводи, змінюючи список вводу . Сортируйте список лише у тому випадку, якщо його довжина становить не менше 10. Версія, яка не багує, замінює сортування 9a 0на завжди.

Робота:

lambda l:l[0:]and l.sort()

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

Ми можемо змінити функцію повернення списку вартістю 4 байти, що становить 30 байт:

lambda l:l[9:]and l.sort()or l

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


25 байт з деякими відрізками правил:

[list,sorted][id(0)%17>0]

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

Виводить функцію буквально, яка або сортує, або ідентичність, використовуючи id(0)як випадкове джерело. Змініть >на >=виправлення або 0на ~0.


3

Лушпиння , 6 байт

Версія баггі:

?OIV¦9

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

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

?OIVK9

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

Пояснення

Ці програми є повністю детермінованими. Насправді у Хуска наразі взагалі немає підтримки для випадкових чисел.

?  V    If any element
    ¦9  is divisible by 9 (in buggy version),
    K9  is truthy when replaced by 9 (in correct version),
 O      sort the list,
  I     otherwise return it unchanged.

Я стверджую, що вихід програми-баггі не сортується з вірогідністю від 1% до 2%. Позначимо через N = 251 кількість можливих значень елементів. Ймовірність того, що випадковий список довжини L не містить кратних 9, є ((NK) / N) ^ L , де K - число значень, що ділиться на 9 (у нашому випадку K = 28 ). Загальна ймовірність - це середнє значення для 5 ≤ L ≤ 255 , що становить приблизно 1,98%. Деякі з цих списків є помилковими, оскільки вони вже відсортовані. Імовірність випадкового списку довжини L для сортування становить максимум ((N + N * (N-1) / 2) / N ^ 2) ^ ⌊L / 2⌋ : якщо розбити список на шматки довжини 2, кожен із⌋L / 2⌋ шматки повинні бути відсортовані. Загальна ймовірність сортування списку обмежена середнім значенням вище 5 для ≤ L ≤ 255 , що становить приблизно 0,30%. Таким чином, ймовірність того, що функція поверне несортований список, становить від 1,67% до 1,98%.


ділення на 9 дає приблизно 11% шансу виходу з ладу. і не сортування не гарантує, що список буде несортованим.
Тит

1
@Titus Я звертаюся до цього в аналізі. Невиконання сортування відбувається лише в тому випадку, якщо в списку відсутні елементи, які поділяються на 9. Ймовірність цього становить приблизно 1,98%. І це правда, що якщо список вже відсортований, нічого не зробиш, також буде відсортований список. Однак ймовірність того, що список вже відсортований, становить щонайбільше 0,30%, що є достатньо низьким, що загальна ймовірність виведення несортівного списку вище 1%.
Згарб

true ... і впорядкований вхід не змінює помилку.
Тит

Чи можете ви використати ↓9замість цього V¦9і скоротити його до 9правильної версії? Це призведе до того, що він завжди не працює на коротких входах і завжди працює належним чином на більш довгих, але оскільки довжина вводу слідує за випадковим розподілом, це все одно має бути вірною відповіддю
Лев

3

Баш , 26 байт

Правильна версія

s=n
sort -${s:RANDOM%20<0}

Спробуйте в Інтернеті! або перевірити ймовірності .

Помилка версії

s=n
sort -${s:RANDOM%20<1}

Спробуйте в Інтернеті! або перевірити ймовірності .

Вводить дані як номери, розділені рядками. Використовується вбудована змінна RANDOM, яка завжди повертає (псевдо) випадкове число в діапазоні 0 - 32767 . Використання %20результатів становить приблизно 5% відмови (дякуємо @Titus за роз'яснення проблем %10).

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

Альтернативна версія, 27 байт

((RANDOM+20))||cat&&sort -n

Bugged версія замінює +з %. Спробуйте в Інтернеті або спробуйте помилку .


пенні збір: %10має більш високий шанс на повернення 0в 7чому 8або 9, так що ймовірність невдачі вище 10%;)
Titus

@Titus Спасибі, я забув про цей факт. Оновлено для використання, %20як і ваша відповідь.
Джастін Марінер

3

Pyth , оцінка 8 * 0,9 = 7,2

Перший фрагмент (правильний):

h.uSNT.S

Спробуйте тут!

Другий фрагмент (помилка):

O.uSNT.S

Спробуйте тут!

Збережено два байти (і 1,8 бала) завдяки isaacg !


Я думаю, що 9, а не 10 нових примірників було б добре. Можливість .Sповернення введення незмінною означає, що в тих (рідкісних) випадках наші шанси отримати неправильну відповідь знижуються з 10% до 0% - так що в середньому це все ще в правильному діапазоні. Звичайно, 10 копій теж штрафують.
Міша Лавров

@MishaLavrov Я помилився у своєму поясненні, зараз звернувся. Я сказав, що .Sможе також повернути сам вхід (що не буде проблемою), але я мав на увазі, що .Sтакож може повернути відсортований список .
Містер Xcoder

Правильно, це я і мав на увазі.
Міша Лавров

O.uSNT.S
Ця

2

JavaScript (ES6), 24 байти

Безкоштовна версія (принаймні для цілих чисел у діапазоні 0-2147483647, так що нічого в заданому діапазоні):

a=>a.sort((a,b)=>a-b>>0)

Версія баггі:

a=>a.sort((a,b)=>a-b>>1)

Залежить від а) алгоритму сортування двигуна та б) списку входів, що містить два значення в неправильному порядку, які відрізняються на 1. (Якщо ймовірність цього виявиться занизькою, то 1можна збільшити, але до моменту отримання для 8нього просто не буде нічого в діапазоні сортування 5-255.)


2

PHP, 62 байти

натхненний рішенням Джо (і я щойно помітив: це порт Джастіна Марінера ):

працює (сортує за зростанням):

unset($argv[0]);(r[rand()+20].sort)($argv);echo join(_,$argv);

баггі (приблизно 5% шанс спадання сорту):

unset($argv[0]);(r[rand()%20].sort)($argv);echo join(_,$argv);

Бігайте з -nr


2

Пушистий , 9 байт - 10% = 8,1

Виправлене рішення:

g0TUn?};_

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

Робоче рішення:

g1TUn?};_

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

Помилковий код виконує такі дії:

g0TUn?};_

g          \ Sort the stack correctly
 0TU       \ Generate random(0, 10)
    n? ;   \ If this is zero:
      }    \    Cyclically shift the stack right once
        _  \ Print the result

Фіксований код просто змінюється 0на 1. Як random(1, 10)ніколи не буде 0, оператор if ніколи не буде виконаний.


2

MATL , 7 * 0,9 = 6,3 6 * 0,9 = 5,4 байт

Версія баггі:

Gr.9<?S

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

Пояснення:

G        % Grab input
 r       % Push a random number between 0 and 1
  .9     % Push 0.9
    <    % Check if the random number is smaller than 0.9
     ?   % If true
      S  % Sort input
         % Implicit output

Версія для помилок:

Gr9<?S

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

Пояснення:

G       % Grab input
 r      % Push a random number between 0 and 1
  9     % Push 9
   <    % Check if the random number is smaller than 9 (always true)
    ?   % If true
     S  % Sort the input
        % Implicit output     

1

Jq 1,5 , 42 байти

Баггі

sort|if length%13<=0then reverse else. end

Працює (видаліть =)

sort|if length%13<0then reverse else. end

Якщо припустити, що довжина лінії однакова за діапазоном [5 555], приблизно 7% спровокує помилку

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



1

R , 30 * .9 = 27 байт

(баггі)

function(l)sort(l,runif(1)<.1)

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

(не баггі)

function(l)sort(l,runif(1)<.0)

Версія баггі сортується за decreasing=T10% часу, відбираючи вибірку з рівномірного (0,1) розподілу. Версія без баггі є завждиdecreasing=F


1

Рода , 42 байти - 10% = 37,8

Без помилок:

{sort key={|i|currentTime|[_%20//19*0+i]}}

Баггі:

{sort key={|i|currentTime|[_%20//19*i+i]}}

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

Це використовує currentTimeфункцію для створення випадкових чисел. Складається враження, що їх розподіл мало змінюється між машинами. Коефіцієнт 20//19можна регулювати, щоб отримати різні результати без байтового штрафу (якщо він не менший за 99//98).


1

Октава , 36 * 0,9 = 32,4 байт

Версія баггі:

@(x)sort(x)(shift(1:end,+(rand<.1)))

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

Версія для помилок:

@(x)sort(x)(shift(1:end,+(rand<.0)))

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

Це сортує вектор, а потім зміщує всі числа на одне праворуч, якщо випадкове число менше 0,1.


Так, ви, звичайно, праві :) Дякую :)
Стюі Гріффін

1

Java 8, 45 34,2 ( 50 38 - 10%) байт

Звичайна версія:

a->{if(Math.random()>0.)a.sort(null);}

Пояснення:

Спробуйте тут.

a->{                    // Method with ArrayList<Integer> parameter and no return-type
  if(Math.random()>0.)  //  If the random 0-1 double is larger than 0:
    a.sort(null);       //   Sort the input-List
}                       // End of method

Виправлена ​​версія ( 51 39 байт):

a->{if(Math.random()>0.1)a.sort(null);}

ЛД 1: 1додано.

Пояснення:

Спробуйте тут.

a->{                     // Method with ArrayList<Integer> parameter and no return-type
  if(Math.random()>0.1)  //  If the random 0-1 double is larger than 0.1:
    a.sort(null);        //   Sort the input-List
}                        // End of method

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