성가신 버그가있는 기본 정렬


28

입력 값은 반드시 고유하지는 않지만 5-255 양의 정수로 구성된 목록 / 시퀀스 / 벡터 / 배열입니다. 어떤 입력 형식이 가장 적합한 지, 각 정수 (정수 수량)는 5-255 범위에서 무작위로 균일하게 선택된다고 가정 할 수 있습니다.

목표는 동일한 (또는 동등한) 형식으로 동일한 목록을 출력하지만 증가하는 (감소하지 않는) 순서로 정렬하는 것입니다. 언어를 배우는 일반적인 초기 운동. 다음을 포함한 제출물 :

  1. 올바르게 작동하고 목표를 달성하는 답변. 과

  2. 성가신 버그가 포함 된 두 번째 답변입니다. 시간의 1 %와 10 % 사이에서 출력은 올바른 형식의 목록이어야하고 올바른 요소를 포함하지만 순서가 잘못되었습니다 (올바르게 정렬되지 않은 순서). 나머지 시간에는 프로그램이 올바르게 작동하고 목표를 달성해야합니다.

두 답변은 레 벤슈 테인 거리가 1 이어야합니다 . 즉, 한 바이트를 삭제하거나 한 바이트를 추가하거나 한 바이트를 변경하여 다른 바이트를 가져올 수 있습니다.

코드 루프에서 평소와 같이 점수를 매기면 (두 대답 중 짧은 쪽을 기준으로) 일반적인 허점은 금지됩니다.

성가신 버그가 입력과 무관 한 경우 10 % 보너스 (점수 감소), 즉 동일한 입력을 다시 사용하면 버그가 재생산되지 않습니다 (시간의 1 %-10 % 제외).


9
PPCG에 오신 것을 환영합니다! 보너스를 제거하는 것이 좋습니다. 실제로는 좋은 습관이 아닙니다.
Mr. Xcoder

2
가능한 각 입력 길이의 가능성은 확실하지 않습니다.
user202729

12
입력 에 대해 시간의 1 %에서 10 % 사이 의 사양 충족 해야합니까 아니면 가능한 입력 세트에 대해 전체적으로 만족 해야합니까? 일부 입력의 경우처럼 그것은 잘못된 순서로 생산하는 것은 불가능[5,5,5]
루이스 Mendo

4
기본 IO 형식 과 관련하여 미묘한 점이 있습니다 . 코드에서 함수를 정의하면 버그가 발생할 가능성이있는 함수를 정의하는 대신 함수를 일관되게 버그로 정의 할 가능성이 있다면 괜찮습니까?
xnor

1
@VadimPonomarenko이 사이트에서 사람들은 기능과 전체 프로그램을 제공 할 수 있습니다. xnor 는 생성시 시간의 1 ~ 10 % 인 함수가 항상 버그가있는 버그가있는 함수인지를 묻습니다. 질문의 문자에 유지 대답은 아마하지 아니 하지만 있다면 그것은 더 재미있을 것 .
wizzwizz4

답변:


9

파이썬 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

공백 or1이 없는 @ wizzwizz4 는 변수 이름으로 해석되어 구문 오류가 발생합니다.
ovs

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

온라인으로 사용해보십시오!

설명

선택한 숫자가 true 인 경우 목록을 반대로한다는 점을 제외하면 작업 솔루션과 동일


진심으로 뭐야. 출력도 올바른 카디널리티가 아닙니다.
Joshua

@Joshua 무슨 뜻인가요?
Outgolfer Erik

온라인으로 시도하면 목록 목록이 출력됩니다.
Joshua

4
@Joshua TiO 링크에는 입력에서 호출 된 함수의 결과를 여러 번 시각화하는 데 도움이 되는 머리글 100F과 바닥 글 },이 포함되어 있습니다. 이것은 작동중인 솔루션이 항상 올바른 결과를 반환하는 반면, 버그가있는 솔루션은 출력에 결함이 있음을 보여줍니다.
Mr. Xcoder

누군가 알고리즘을 설명하십시오. 곧 최고 순위 제출 (또는 최고 순위 제출 중 하나)을 수락합니다. 이해할 수없는 해결책을 받아 들일 수 없습니다.
Vadim Ponomarenko

7

젤리 , 7 * (100 %-10 %) = 6.3 바이트

Ṣ¹⁵X:¤¡

온라인으로 사용해보십시오!

버기 버전 ​​:

ṢẊ⁵X:¤¡

온라인으로 사용해보십시오!

두 링크에는 인수로 제공 한 목록으로 매번 코드를 100 회 실행 한 다음 결과를 반환하는 테스트 하네스가 있습니다.

각 입력 길이의 확률은 다음과 같습니다.

0.1 - 0.1/(length!)

따라서 길이 1의 경우 길이 ∞가 10 %의 확률을 가질 때까지 길이 1의 경우 0 % 확률, 길이 2 5 %, 길이 3 8.83̅ %, 길이 4 9.583̅ % 등이 있습니다.


이어야 0.1 - 0.1/(length!)합니다.
user202729

@ user202729 sure
Erik

Ṣ⁵X’¤¡그리고 Ṣ⁵X¤¡해야도 작동합니다 버그 버전은 2 바이트 저장, 작업을해야 정렬되지 않은 목록 <시간의 10 %를 반환하고 입력이 균일하게 무작위로 선택 주어진.
user202729

해당 솔루션이 마음에 들지 않으면 ¹1 바이트를 저장하기 위해 분명히 바이트를 삭제할 수 있습니다 (바이트 수 규칙 = 짧은 것). 또한의 두 번째 이후에 불필요한 결합 오버 라인 66.6̅%있습니다.
user202729

@ user202729 불행히도 이제는 더 이상 입력 독립적이지 않으며 "10"만 ¹정렬 할 수 없기 때문에 " 제거 할 수 없습니다" .
Outgolfer Erik

6

파이썬 3, 58 57 점 -10 % = 51.3

ovs 덕분에 바이트를 절약했습니다.

버그가없는 버전, 57 바이트

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

온라인으로 사용해보십시오!

버그가있는 버전, 57 바이트

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

온라인으로 사용해보십시오!

보너스를 사용하는 솔루션을 사용하기로 결정했습니다. 다른 Python 답변을이기는 것은 아니지만 재미있게 생각했습니다.



4

그루비 , 31 바이트

버그가있는 솔루션 :

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

작업 솔루션 :

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

getAt색인이 크기보다 큰 경우 Groovy 첨자 연산자 ( 메소드)는 목록에 대해 null을 반환합니다. 따라서 아홉 번째 요소가 있으면 정렬 된 목록과 동일하게 유지되지만 (1.99203187 % 확률) 그렇지 않으면 반대가됩니다. 그러나 목록의 크기가 항상 5보다 크거나 같기 때문에 항상 첫 번째 요소가 있습니다. 따라서 0 a[0]을 1, 2, 3 또는 4로 바꿀 수 있습니다.


1
사이트와 멋진 첫 게시물에 오신 것을 환영합니다!
caird 공동


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 바이트). (-1 바이트) asort대신 사용하십시오 sort.
Titus

... 또는 접두사 대신에 전체 단어를 사용하십시오 (또는 unset($argv[0]);(rand(1,9)?sort:rsort)($argv);echo join(_,$argv);65 바이트)
Titus

3

파이썬 2 , 26 바이트

버기 :

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

온라인으로 사용해보십시오!

입력 목록수정하여 출력합니다 . 길이가 적어도 10 비 버그 버전은 대체 경우에만 목록 정렬 9A를을 0항상 일종의을.

일:

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

온라인으로 사용해보십시오!

총 30 바이트 인 4 바이트의 비용으로 목록을 반환하도록 함수를 수정할 수 있습니다.

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

온라인으로 사용해보십시오!


규칙을 약간 확장 한 25 바이트 :

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

온라인으로 사용해보십시오!

id(0)임의의 소스로 사용하여 정렬하거나 ID 인 함수 리터럴을 출력합니다 . 변경 >에 대한 >=수정, 또는 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 %의 실패 확률이 있습니다. 정렬하지 않아도 목록이 정렬되지 않을 수 있습니다.
Titus

1
@Titus 분석에서이 문제를 해결했습니다. 정렬에 실패하면 9로 나눌 수있는 요소가 목록에 없는 경우에만 발생합니다. 이 확률은 약 1.98 %입니다. 그리고 목록이 이미 정렬되어 있으면 아무것도하지 않으면 정렬 된 목록도 제공됩니다. 그러나 목록이 이미 정렬 될 확률은 최대 0.30 %이며, 정렬되지 않은 목록을 출력 할 총 확률이 1 %를 초과 할 정도로 낮습니다.
Zgarb

true ... 정렬 된 입력은 버그를 변경하지 않습니다.
Titus

↓9대신 대신 사용할 수 있고 올바른 버전으로 V¦9단축 할 수 9있습니까? 이것은 짧은 입력에서 항상 실패하고 더 긴 입력에서 항상 올바르게 작동하지만, 입력 길이가 임의의 분포를 따르기 때문에 여전히 유효한 답이어야합니다
Leo

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반환의 더 높은 기회가 07비해 8또는 9실패의 확률이 10 % 이상 정도,)
디도

@Titus 감사합니다. 그 사실을 잊었습니다. %20답변처럼 사용하도록 업데이트되었습니다 .
저스틴 마리너

3

Pyth , 점수 8 * 0.9 = 7.2

첫 번째 스 니펫 (올바른 코드) :

h.uSNT.S

여기 사용해보십시오!

두 번째 스 니펫 (버그 된 것) :

O.uSNT.S

여기 사용해보십시오!

isaacg 덕분에 2 바이트 (1.8 점)를 절약했습니다 !


새 사본이 10 개가 아닌 9 개면 괜찮을 것 같습니다. .S입력을 변경하지 않고 반환 할 수 있다는 것은 (드문) 드문 경우에, 잘못된 답변을 얻을 가능성이 10 %에서 0 %로 떨어질 가능성을 의미하므로 평균적으로 여전히 올바른 범위에 있습니다. 물론 10 부도 괜찮습니다.
Misha Lavrov

@MishaLavrov 나는 설명에서 실수를했다. 나는 .S또한 입력 자체를 반환 할 수 있다고 말 했지만 (문제는 아니지만) .S정렬 된 목록을 반환 할 수도 있음을 의미했습니다 .
Mr. Xcoder

맞아, 나도 그런 뜻이야
Misha Lavrov

: 같은 생각,, 짧은O.uSNT.S
isaacg

2

자바 스크립트 (ES6), 24 바이트

버그가없는 버전 (적어도 0-2147483647 범위의 정수, 따라서 지정된 범위의 모든 항목) :

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

버기 버전 ​​:

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

)가에 따라 다름 엔진의 알고리즘 및 b) (1) 차이가 잘못된 순서로 두 개의 값을 포함하는 입력 목록 (밖으로 그 턴의 확률은 다음 너무 낮은 될 경우, 정렬 1증가하지만, 당신이 얻을 때까지는 할 수 있습니다 에 8그것은 단순히 범위에서 아무것도를 정렬하지 않습니다 5-255.)


2

PHP, 62 바이트

Jo의 솔루션에서 영감을 얻었습니다 (그리고 방금 주목했습니다 : Justin Mariner의 포트 ).

작동 (오름차순 정렬) :

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문이 실행되지 않을 것입니다 경우.


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

자바 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의 LD가 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

0

자바 스크립트, 25 * 0.9 = 22.5

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

입력 x

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.