Основной вид, с надоедливой ошибкой


28

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

Цель состоит в том, чтобы вывести тот же список в том же (или эквивалентном) формате, но отсортированный в порядке возрастания (неубывания). Обычное раннее упражнение в изучении языка. Представления должны включать:

  1. Ответ, который работает правильно и достигает цели; а также

  2. Второй ответ, который содержит досадную ошибку. Между 1% и 10% времени выходные данные должны быть списком в правильном формате и содержать правильные элементы, но в неправильном порядке (любой порядок, кроме правильно отсортированных). В остальное время программа должна работать правильно и достигать цели.

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

Подсчет очков, как обычно, в Code-Golf (на основе более короткого из двух ваших ответов), с обычными лазейками, запрещенными.

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


9
Добро пожаловать в PPCG! Я предлагаю снять бонус, это не очень хорошая практика.
г-н Xcoder

2
Неясно, какова вероятность каждой возможной длины ввода.
user202729

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

Попробуйте онлайн!

объяснение

То же, что и рабочее решение, за исключением того, что он переворачивает список, если выбранное число истинно.


Серьезно, эй. Выход даже не правильной мощности.
Иисус Навин

@ Джошуа Что ты имеешь в виду?
Эрик Outgolfer

Попробуйте онлайн показывает вывод списка списков.
Иисус Навин

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 уверен
Эрик Outgolfer

Ṣ⁵X’¤¡и Ṣ⁵X¤¡должно работать тоже: глючная версия возвращает список несортированным <10% времени, и, учитывая, что входные данные выбраны равномерно случайным образом, они должны работать, экономя 2 байта.
user202729

Если вам не нравится это решение, вы, очевидно, можете просто удалить, ¹чтобы сохранить 1 байт (число правил число байтов = более короткий); также есть посторонний комбинирующий оверлей после второго 6в 6.6̅%.
user202729

@ user202729 К сожалению, тогда он больше не будет зависеть от ввода, и нет, я не могу «просто удалить ¹», потому что тогда он не будет сортироваться вообще 10% времени.
Эрик 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метод) возвращает ноль для списков, если индекс больше размера. Поэтому, если есть девятый элемент, он останется таким же, как и отсортированный список, но если нет (вероятность 1.99203187%), он будет перевернут. Однако всегда будет первый элемент, потому что размер списка всегда больше или равен 5. Таким образом, 0 в a[0]можно поменять местами с 1, 2, 3 или 4.


1
Добро пожаловать на сайт и приятного первого поста!
Caird Coneheringaahing

3

Wolfram Language (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. Не 9содержащая ошибок версия заменяет символ a 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

Попробуйте онлайн!

объяснение

Эти программы полностью детерминированы. Фактически, Husk в настоящее время вообще не поддерживает случайные числа.

?  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

Исправленная версия заменяет +собой %. Попробуйте онлайн или попробуйте .


сбор пенни: у %10него больше шансов вернуться 0к 7чем 8или 9, так что вероятность неудачи выше 10%;)
Тит

@ 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

Pushy , 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,255], около 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);}

LD 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.