Podstawowe sortowanie, z irytującym błędem

28

Twoje dane wejściowe to lista / sekwencja / wektor / tablica 5-255 dodatnich liczb całkowitych, niekoniecznie unikatowych. Możesz założyć, który format wejściowy jest najbardziej odpowiedni i że każda liczba całkowita (jak również liczba liczb całkowitych) jest wybierana losowo równomiernie z zakresu 5-255.

Celem jest wyprowadzenie tej samej listy, w tym samym (lub równoważnym) formacie, ale posortowanym według rosnącej (nie malejącej) kolejności. Wspólne wczesne ćwiczenie w nauce języka. Zgłoszenia obejmują:

  1. Odpowiedź, która działa poprawnie i osiąga cel; i

  2. Druga odpowiedź, która zawiera irytujący błąd. Pomiędzy 1% a 10% czasu dane wyjściowe muszą być listą w poprawnym formacie i zawierającą poprawne elementy, ale w niewłaściwej kolejności (dowolna kolejność oprócz poprawnie posortowanej). Przez resztę czasu program musi działać poprawnie i osiągnąć cel.

Dwie odpowiedzi muszą mieć jedną odległość Levenshteina ; to znaczy, możemy uzyskać jeden od drugiego, usuwając jeden bajt, dodając jeden bajt lub zmieniając jeden bajt.

Punktacja jak zwykle w golfie kodowym (na podstawie krótszej z dwóch odpowiedzi), przy zwykłych lukach zabronione.

10% bonusu (spadek do wyniku), jeśli irytujący błąd jest niezależny od danych wejściowych, tj. Ponowne użycie tego samego wejścia nie odtwarza błędu (z wyjątkiem 1% do 10% czasu).

Vadim Ponomarenko
źródło
9
Witamy w PPCG! Sugeruję usunięcie bonusu, to nie jest naprawdę dobra praktyka.
Pan Xcoder,
2
Nie jest jasne, jakie jest prawdopodobieństwo każdej możliwej długości wejściowej.
user202729,
12
Czy specyfikacja między 1% a 10% czasu powinna być spełniona dla każdego wkładu, czy tylko ogólnie dla zestawu możliwych wkładów? W przypadku niektórych danych wejściowych, takich jak [5,5,5]niemożliwe jest uzyskanie niewłaściwej kolejności
Luis Mendo
4
Subtelność dotyczy naszych domyślnych formatów We / Wy . Jeśli nasz kod definiuje funkcję, to czy jest w porządku, jeśli ma szansę na zdefiniowanie funkcji konsekwentnie buggy, w przeciwieństwie do definiowania funkcji, która ma szansę na buggy?
xnor
1
@VadimPonomarenko Na tej stronie ludzie mogą udostępniać funkcje oraz pełne programy. xnor pyta, czy wolno mieć funkcję, która, od 1% do 10% czasu po utworzeniu, jest błędną funkcją, która zawsze będzie zawierać błąd. Trzymając się litery twojego pytania, odpowiedź brzmi prawdopodobnie nie , ale byłoby fajniej, gdyby tak było .
wizzwizz4,

Odpowiedzi:

9

Python 3 , 36 bajtów

Wersja wolna od błędów, 37 bajtów

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

Wypróbuj online!

Irytująca wersja, 36 bajtów

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

Wypróbuj online!

Zależy to od wkładu i dlatego nie kwalifikuje się do premii.
Prawdopodobieństwo niepowodzenia wynosi około 2%. Nie działa, gdy długość wejściowa jest mniejsza niż 10.

W połączeniu z odpowiedzią LyricLy otrzymuje 34 bajty:

lambda l:sorted(l)[::l[9:]>[]or 1]
lambda l:sorted(l)[::l[9:]>[]or-1]
ovs
źródło
Nie sądzę, że potrzebujesz miejsca w wersji wolnej od błędów.
wizzwizz4,
@ wizzwizz4 bez spacji or1zostanie zinterpretowany jako nazwa zmiennej i spowoduje błąd składniowy.
ovs
9

05AB1E , 5 * 0,9 = 4,5 bajtów

Rozwiązanie robocze

{TLΩi

Wypróbuj online!

Wyjaśnienie

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

Rozwiązanie zawierające błąd

Daje złe rozwiązanie w 10% przypadków (niezależnie od danych wejściowych).

{TLΩiR

Wypróbuj online!

Wyjaśnienie

To samo co działające rozwiązanie, z tym wyjątkiem, że odwraca listę, jeśli wybrana liczba jest prawdziwa.

Emigna
źródło
Poważnie co hej. Wyjście nie ma nawet odpowiedniej liczności.
Joshua
@Joshua Co masz na myśli?
Erik the Outgolfer,
Wypróbuj online pokazuje, jak wypisuje listę list.
Joshua
4
@Joshua Link TiO zawiera nagłówek 100Fi stopkę, },które pomagają nam wizualizować wynik funkcji wywoływanej na wejściu wiele razy. To pokazuje nam, że działające rozwiązanie zawsze zwraca poprawne wyniki, podczas gdy błędne ma wadliwe wyjście.
Pan Xcoder,
Proszę, wyjaśnij algorytm. Wkrótce zaakceptuję zgłoszenie o najwyższym rankingu (lub jedno z zgłoszeń o najwyższym rankingu). Nie mogę zaakceptować żadnego rozwiązania, którego nie rozumiem.
Vadim Ponomarenko
7

Galaretka , 7 * (100% - 10%) = 6,3 bajtów

Ṣ¹⁵X:¤¡

Wypróbuj online!

Wersja buggy:

ṢẊ⁵X:¤¡

Wypróbuj online!

W obu linkach znajduje się wiązka testowa, która uruchomi kod 100 razy, za każdym razem z listą podaną jako argument, a następnie zwróci wyniki.

Prawdopodobieństwo każdej długości wejściowej wynosi:

0.1 - 0.1/(length!)

Zatem dla długości 1 istnieje prawdopodobieństwo 0%, dla długości 2 5%, dla długości 3 8,83̅%, dla długości 4 9,583̅% itd. Aż do długości ∞, która ma 10% prawdopodobieństwa.

Erik the Outgolfer
źródło
Powinno być 0.1 - 0.1/(length!).
user202729,
@ user202729 pewnie
Erik the Outgolfer
Ṣ⁵X’¤¡i Ṣ⁵X¤¡powinien też działać: błędna wersja zwraca listę nieposortowaną <10% czasu, a biorąc pod uwagę, że dane wejściowe są wybierane jednorodnie losowo, powinno działać, oszczędzając 2 bajty.
user202729,
Jeśli nie podoba ci się to rozwiązanie, możesz oczywiście po prostu usunąć ¹bajt, aby zapisać 1 bajt (licznik reguł liczba bajtów = krótszy); istnieje również obcy łączenie overline po drugim 6w 6.6̅%.
user202729,
@ user202729 Niestety to nie będzie już niezależne od danych wejściowych i nie, nie mogę „po prostu usunąć ¹”, ponieważ wtedy nie sortuje się przez 10% czasu.
Erik the Outgolfer,
6

Python 3, wynik 58 57–10% = 51,3

Oszczędność bajtu dzięki ovs.

Wersja bez błędów, 57 bajtów

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

Wypróbuj online!

Wersja z błędami, 57 bajtów

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

Wypróbuj online!

Postanowiłem wypróbować rozwiązanie wykorzystujące bonus. Nie wyprzedza drugiej odpowiedzi w Pythonie, ale dobrze się wymyśliłem.

LyricLy
źródło
5

C, 71 * 0,9 = 63,9 bajtów

Bez błędów:

c(int*a,int*b){return*a-*b;}f(a,n)int*a;{if(rand()%1<9)qsort(a,n,4,c);}

Wypróbuj online!

Powozik:

c(int*a,int*b){return*a-*b;}f(a,n)int*a;{if(rand()%10<9)qsort(a,n,4,c);}

Wypróbuj online!

Steadybox
źródło
+1 za% 1 (och, chodź jeszcze 6, musisz żartować)
Joshua
4

Groovy , 31 bajtów

Błędne rozwiązanie:

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

Rozwiązanie robocze:

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

Operator indeksu dolnego Groovy ( getAtmetoda) zwraca wartość null dla list, jeśli indeks jest większy niż rozmiar. Więc jeśli jest dziewiąty element, pozostanie taki sam jak posortowana lista, ale jeśli nie (szansa 1,99203187%) zostanie odwrócony. Jednak zawsze będzie pierwszy element, ponieważ rozmiar listy jest zawsze większy lub równy 5. Zatem 0 w a[0]można zamienić na 1, 2, 3 lub 4.

Hlaaftana
źródło
1
Witamy na stronie i fajny pierwszy post!
caird coinheringaahing
3

Wolfram Language (Mathematica) , 29 bajtów

Bonus ma 26,1 bajta, ale nie jestem do końca pewien, czy go zdobędę; na już posortowanym wejściu obie wersje zawsze dają posortowane wyjście.

Wersja wolna od błędów (29 bajtów)

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

Wypróbuj online!

Irytująca wersja (30 bajtów)

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

Wypróbuj online!

Misza Ławrow
źródło
3

PHP, 70 bajtów

Wersja bez błędów, 70 bajtów

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

Wypróbuj online!

Wersja z błędami, 70 bajtów

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

Wypróbuj online!

Błędna wersja sortuje w odwrotnej kolejności przez 10% czasu (na podstawie generatora liczb losowych).

Jo.
źródło
nie potrzeba znacznika z -r(-2 bajty). dołącz podkreślnikiem; powinno to być równoważne (-2 bajty). użyj asortzamiast sort(-1 bajt).
Tytus
... lub użyj całego słowa zamiast prefiksu (lub nie): unset($argv[0]);(rand(1,9)?sort:rsort)($argv);echo join(_,$argv);(także 65 bajtów)
Titus
3

Python 2 , 26 bajtów

Powozik:

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

Wypróbuj online!

Wyjście poprzez modyfikację listy wejść . Sortuje listę tylko jeśli jego długość wynosi co najmniej 10. wersja non-buggy zastępuje 9z 0zawsze porządek.

Pracujący:

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

Wypróbuj online!

Możemy zmodyfikować funkcję, aby zwracała listę kosztem 4 bajtów, łącznie 30 bajtów:

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

Wypróbuj online!


25 bajtów z niektórymi fragmentami zasad:

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

Wypróbuj online!

Wysyła literał funkcji, który sortuje lub jest tożsamością, wykorzystując id(0)jako źródło losowe. Zmiana >do >=naprawienia, lub 0do ~0.

xnor
źródło
3

Łuska , 6 bajtów

Wersja buggy:

?OIV¦9

Wypróbuj online!

Prawidłowa wersja:

?OIVK9

Wypróbuj online!

Wyjaśnienie

Programy te są całkowicie deterministyczne. W rzeczywistości Husk nie ma obecnie żadnego wsparcia dla liczb losowych.

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

Twierdzę, że dane wyjściowe programu buggy nie są sortowane z prawdopodobieństwem między 1% a 2%. Oznacz przez N = 251 liczbę możliwych wartości elementów. Prawdopodobieństwo, że losowa lista długości L nie zawiera wielokrotności 9 wynosi ((NK) / N) ^ L , gdzie K jest liczbą wartości podzielnych przez 9 (w naszym przypadku K = 28 ). Całkowite prawdopodobieństwo jest średnią tego dla 5 ≤ L ≤ 255 , co stanowi około 1,98%. Niektóre z tych list są fałszywie pozytywne, ponieważ są już posortowane. Prawdopodobieństwo sortowania losowej listy długości L wynosi ((N + N * (N-1) / 2) / N ^ 2) ^ ⌊L / 2⌋ : jeśli podzielimy listę na kawałki długości 2, każdy zKawałki ⌊L / 2⌋ należy posortować. Całkowite prawdopodobieństwo sortowania listy jest ograniczone średnią z powyższych dla 5 ≤ L ≤ 255 , co stanowi około 0,30%. Zatem prawdopodobieństwo, że funkcja zwróci listę nieposortowaną, wynosi od 1,67% do 1,98%.

Zgarb
źródło
podzielny przez 9 daje około 11% szansy na niepowodzenie. a brak sortowania nie gwarantuje, że lista nie jest posortowana.
Tytus
1
@Titus Zajmuję się tym w analizie. Brak sortowania występuje tylko wtedy, gdy lista nie zawiera elementów, które można podzielić przez 9. Prawdopodobieństwo tego wynosi około 1,98%. I prawdą jest, że jeśli lista jest już posortowana, nic nie robienie da również posortowaną listę. Jednak prawdopodobieństwo, że lista jest już posortowana, wynosi co najwyżej 0,30%, co jest na tyle niskie, że całkowite prawdopodobieństwo wygenerowania nieposortowanej listy wynosi powyżej 1%.
Zgarb
prawda ... a sortowane dane wejściowe nie zmieniają błędu.
Tytus
Czy możesz użyć ↓9zamiast tego V¦9i skrócić go tylko 9do właściwej wersji? To spowodowałoby, że zawsze zawodzi przy krótkich wejściach i zawsze działa poprawnie na dłuższych, ale ponieważ długość wejściowa przebiega losowo, nadal powinna być poprawną odpowiedzią
Leo
3

Bash , 26 bajtów

Prawidłowa wersja

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

Wypróbuj online! lub sprawdź prawdopodobieństwa .

Wersja z błędami

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

Wypróbuj online! lub sprawdź prawdopodobieństwa .

Pobiera dane wejściowe jako liczby oddzielone znakiem nowej linii. Używa wbudowanej zmiennej RANDOM, która zawsze zwraca (pseudo) liczbę losową z zakresu 0 - 32767 . Korzystanie z %20wyników w około 5% awaryjności (dzięki @Titus za wyjaśnienie problemów z %10).

Ta losowość oznacza, że ​​wskaźnik awaryjności jest niezależny od danych wejściowych, ale wymaga to, aby tablica wejściowa zawierała co najmniej jedną liczbę z więcej niż jedną cyfrą, ponieważ dane wyjściowe awarii są sortowane leksykograficznie.

Alternatywna wersja, 27 bajtów

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

Wersja podsłuchu zastępuje +z %. Wypróbuj online lub wypróbuj .

Justin Mariner
źródło
Zbieranie penny: %10ma większą szansę powrotu 0do 7ponad 8lub 9, więc szansa na niepowodzenie jest powyżej 10%;)
Titus
@Titus Dzięki, zapomniałem o tym fakcie. Zaktualizowano, aby używać %20tak jak twoja odpowiedź.
Justin Mariner,
3

Pyth , wynik 8 * 0,9 = 7,2

Pierwszy fragment (poprawny):

h.uSNT.S

Wypróbuj tutaj!

Drugi fragment (poprawiony):

O.uSNT.S

Wypróbuj tutaj!

Zaoszczędzono dwa bajty (i wynik 1,8) dzięki isaacg !

Pan Xcoder
źródło
Myślę, że 9, a nie 10 nowych kopii byłoby w porządku. Możliwość .Szwrócenia danych wejściowych w niezmienionej postaci oznacza, że ​​w tych (rzadkich) przypadkach nasze szanse na uzyskanie błędnej odpowiedzi spadają z 10% do 0% - czyli średnio nadal jest w odpowiednim zakresie. Oczywiście 10 kopii też jest w porządku.
Misza Ławrow
@MishaLavrov Popełniłem błąd w moim wyjaśnieniu, teraz adresowanym. Powiedziałem, że .Smoże również zwrócić dane wejściowe (co nie byłoby problemem), ale miałem na myśli, .Sże może również zwrócić posortowaną listę .
Pan Xcoder,
Racja, to też miałem na myśli.
Misza Ławrow
Ten sam pomysł, ale krótszy:O.uSNT.S
Isaacg
2

JavaScript (ES6), 24 bajty

Wersja bezbłędna (przynajmniej dla liczb całkowitych z zakresu 0-2147483647, więc wszystko z podanego zakresu):

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

Wersja buggy:

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

Zależy od a) algorytmu sortowania silnika ib) listy danych wejściowych zawierającej dwie wartości w niewłaściwej kolejności, które różnią się o 1. (Jeśli prawdopodobieństwo tego okaże się zbyt niskie, wówczas 1można je zwiększyć, ale do czasu otrzymania do 8niego po prostu nie będzie niczego w zakresie sortowania 5-255).

Neil
źródło
2

PHP, 62 bajty

zainspirowany rozwiązaniem Jo (i właśnie zauważyłem: to port Justina Marinera ):

działa (sortuje rosnąco):

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

buggy (ok. 5% szans na sortowanie malejące):

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

Biegnij z -nr

Tytus
źródło
2

Natarczywy , 9 bajtów - 10% = 8,1

Błędne rozwiązanie:

g0TUn?};_

Wypróbuj online!

Rozwiązanie robocze:

g1TUn?};_

Wypróbuj online!

Błędny kod wykonuje następujące czynności:

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

Naprawiony kod po prostu zmienia się 0na 1. Jak random(1, 10)nigdy nie będzie 0, instrukcja if nigdy nie zostanie wykonana.

FlipTack
źródło
2

MATL , 7 * 0,9 = 6,3 6 * 0,9 = 5,4 bajtów

Wersja buggy:

Gr.9<?S

Wypróbuj online!

Wyjaśnienie:

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

Wersja wolna od błędów:

Gr9<?S

Wypróbuj online!

Wyjaśnienie:

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     
Stewie Griffin
źródło
1

Jq 1,5 , 42 bajty

Powozik

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

Działa (usuń =)

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

Zakładając, że długości linii są jednolite w zakresie [5,255] około 7% spowoduje błąd

Wypróbuj online!

jq170727
źródło
1

J, 22,5 bajtów (25 bajtów - 10%)

z błędem:

[:]`(1&A.)@.(0.1>?@0:)/:~

bez błędów:

[:]`(0&A.)@.(0.1>?@0:)/:~

Wypróbuj online!

Jonasz
źródło
1

R , 30 * .9 = 27 bajtów

(powozik)

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

Wypróbuj online!

(nie ma błędów)

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

Wersja buggy sortuje się w decreasing=T10% przypadków, próbkując z równomiernego rozkładu (0,1). Wersja niezabudowana jest zawszedecreasing=F

Giuseppe
źródło
1

Röda , 42 bajty - 10% = 37,8

Bez błędów:

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

Powozik:

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

Wypróbuj online!

Ta currentTimefunkcja służy do tworzenia liczb losowych. Wygląda na to, że ich dystrybucja różni się nieco między komputerami. Współczynnik 20//19można dostosować, aby uzyskać różne wyniki bez kary bajtowej (chyba że jest mniejszy niż 99//98).

fergusq
źródło
1

Oktawa , 36 * 0,9 = 32,4 bajtów

Wersja buggy:

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

Wypróbuj online!

Wersja wolna od błędów:

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

Wypróbuj online!

To sortuje wektor, a następnie przesuwa wszystkie liczby o jeden w prawo, jeśli liczba losowa jest mniejsza niż 0,1.

Stewie Griffin
źródło
Tak, oczywiście masz rację :) Dzięki :)
Stewie Griffin
1

Java 8, 45 34,2 ( 50 38–10%) bajtów

Wersja normalna:

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

Wyjaśnienie:

Wypróbuj tutaj.

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

Wersja z błędami ( 51 39 bajtów):

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

LD z 1: 1dodano.

Wyjaśnienie:

Wypróbuj tutaj.

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
Kevin Cruijssen
źródło
0

JavaScript, 25 * 0,9 = 22,5

new Date%25?x:x.sort()

wprowadź x

l4m2
źródło