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


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]

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.


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.


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.


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!


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


1
Witamy na stronie i fajny pierwszy post!
— caird coinheringaahing


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


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.


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


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 .


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 !


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


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


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.


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     

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!



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


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



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

0

JavaScript, 25 * 0,9 = 22,5

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

wprowadź x

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.