間違っているように見えるが実際は正しいソートプログラムを作成する[終了]


12

1つ以上のバグがあるように見える数字のベクトル(または任意のタイプの要素)をソートするプログラムを作成しますが、実際には問題ありません。

  • コードは明確でなければなりません。コードを見ている人は、それがソートアルゴリズムであることを簡単に識別し、正しいコードとバグを簡単に混同しなければなりません。
  • (明らかな)バグは、コードを構文的または意味的に不正な形式にする(たとえば、プログラムをコンパイル/実行しない、実行時にUBを表示する)、プログラムが不正な結果を生成する、終了しない、または非決定的とすることができます。
  • コードは実際に整形式である必要があり、プログラムは有限時間で決定論的に正しい出力を生成する必要があります。
  • 入力は、プログラムにハードコーディングするか、(ユーザー、ファイルなどから)読み取ることができます。
  • 入力は有効と見なされ、プログラムは入力の正確性を検証する必要はありません。
  • ソートアルゴリズムはすべて受け入れられます。数値を保持するデータ構造は、実際のベクトルである必要はありません。プログラムは、可変数の数字または固定数の数字をソートするように設計できます(たとえば、3つの数字をソートするプログラムは大丈夫です)。ソートは安定している場合とそうでない場合があります(注:ソートが不安定に見える明らかなバグがある安定したソートを行うように設計されたプログラムですが、実際にはバグではありません:プログラムは実際に安定したソートを行います—有効な答えです)。
  • サードパーティのツールを除くすべての関数(並べ替え関数を含む)を呼び出すことができます(広く普及して使用されている場合を除き、たとえばboos、for C++JQueryfor 、Javascriptそれらは使用可能です)。
  • 言語を指定する
  • バグのように見える部分をコードでコメントします。
  • バグが間違っているように見えるものを説明します。
  • なぜそれが実際にバグではないのかを(ネタバレボックスに)説明してください。

これは人気コンテストです。投票数が最も多い答えが勝ちです。


この挑戦は終わりました。勝者は8票の@Clueless /codegolf//a/30190/11400です。すべての提出者に感謝します!

受賞者の受賞後に参加したい場合は、お気軽に新しい回答を追加してください。あなたはレースに参加していませんが、興味深い答えを見ることに興味があります。


数字の代わりにnilableブール値を使用できますか?
Οurous

要素のいずれかの種類:はい、あまりにも質問に編集
bolov

1
このサイトでは、人手不足の課題がトピックではなくなったため、この質問をトピック外として終了することに投票しています。meta.codegolf.stackexchange.com/a/8326/20469
cat

回答:


11

C ++

Appleにgoto fail触発された; バグ

#include <vector>
#include <map>
#include <iostream>

/**
 * Sorts a vector of doubles in reverse order using the bucket sort algorithm.
 */
std::vector<double> reverse_bucket_sort(const std::vector<double>& input) {
    // put each element into a bucket as many times as it appears
    std::map<double, int> bucket_counts;
    for (auto it : input)
        ++bucket_counts[it];

    std::vector<double> sorted_elements; // the return value

    // loop until we are done
    while (bucket_counts.size() > 0) {
        // find the largest element
        double maximum = std::numeric_limits<double>::lowest();
        for (auto it : bucket_counts) {
            if (it.first > maximum)
                maximum = it.first;
                maximum = it.first;
        }

        // add the largest element N times to our sorted vector
        for (int i = 0; i < bucket_counts[maximum]; ++i)
            sorted_elements.push_back(maximum);

        // and now erase the bucket
        bucket_counts.erase(maximum);
    }

    return sorted_elements;
}

int main(int argc, const char * argv[]) {
    std::vector<double> test_case = { 0, 1, 2.5, 10, 2.5, 2 };

    std::cout << "unsorted:";
    for (auto it : test_case) std::cout << " " << it;
    std::cout << std::endl;

    std::cout << "sorted:";
    for (auto it : reverse_bucket_sort(test_case)) std::cout << " " << it;
    std::cout << std::endl;

    return 0;
}

ページの半分ほど下にバグがあります。ifチェック後に行が重複しています!の最後の値が何であれ、常に最大値を更新しbucket_countます。ありがたいことに大丈夫です。C ++ではstd::map、キーでソートされます。ですから、私たちは単にバケットを反転させているだけです。


を使用しなかったためgoto、バグはありません。(Appleが使用しなければバグは発生しなかったと言ったすべての人々を参照goto
user253751 14

おめでとうございます、あなたは最も多くの票を得てこの挑戦に勝ちました(7日後に8票)。また、実際のバグを使用したため、私はあなたの答えが本当に好きです。
bolov 14年

8

Python2.x

import random
L = [random.randrange(20) for x in range(20)]
print "Unsorted:", L

def sort(L):
    # terminal case first. Otherwise sort each half recursively and combine
    return L.sort() if L > 1 else sort(L[:len(L)//2]) + sort(L[len(L)//2:])

sort(L)
print "Sorted:", L

テスト走行

list.sortが返されるNoneので、の後の部分はelseですNone + None。幸いなことに、これは問題を引き起こしません。リストとintの比較(L > 1)は常にTrue。関数は常に戻るNoneため、戻り値を無視し、所定のL位置にソートされたJust print をソートして、ソートによってソートされた半分をマージしても、実行されたとしても機能しませんでした。


おめでとうございます。7日後に6票で2位になりました。ご提出いただきありがとうございます。
bolov

5

C

誤ったソートの使用-64ビットシステムでintは4バイトでchar *8バイトなので、動作しないはずです。

コード:

#include <stdlib.h>
#include <stdio.h>

/* Compare integers to sort in reverse order */
int compare(const void *p, const void *q)
{
    const int *a = p;
    const int *b = q;

    return *b - *a;
}

int main()
{
    char *strings[] = {"B", "Que", "Ro", "Sum", "T"};
    int i;

    /* Let's use the integer compare to sort strings */
    qsort(&strings, sizeof(strings) / sizeof(char *), sizeof(char *), compare);

    /* Output the sorted results */
    for (i = 0; i < sizeof(strings) / sizeof(char *); i++)
        printf("%s\n", strings[i]);

    return 0;
}

ビルド:

$ gcc -o sort-no-sort sort-no-sort.c 

実行:

$ ./sort-no-sort 
T
Sum
Ro
Que
B

ええ、大丈夫です!

5つのこと:1)qsort整数へのポインターを渡します。整数へのポインターは、文字へのポインターと同じサイズです。2)文字列の長さは4バイト以下(3 + 1ターミネータ)=整数のサイズで、ソートルーチンは整数として喜んで処理します。3)ほとんどのコンパイラはデータ構造のアライメントを強制するため、短い文字列は同じスペースを占有します。しかし、それよりも大きく、障害に備えてください。4)エンディアンネス。5)内部バイトのゼロ初期化。


ご提出いただきありがとうございます。3位になりました。おめでとうございます!
bolov

2

コブラ

class Program
    var _target as List<of bool?> = [true, true, false, true, true, nil, nil, false, true, nil, true]
    def main
        .sort(_target)
        print _target
    def sort(target as List<of bool?>)
        for i in target.count, for n, in target.count -1, if target[n] <> target[n + 1] and (target[n] or target[n + 1] == nil), target[n], target[n + 1] = target[n + 1], target[n]
            #should return sorted as [nil][false][true]

ああ、私は間違って割り当てられているように見えnます...そしてそれらのコンマはどうやってそこに行きましたか?

nが割り当てられた場合、コンパイラは、キーと値のペアの前半(カンマのため)が与えられていると想定しますが、キーと値のペアがないため、コンパイラは後半を割り当てることができないときに文句を言いません存在しない変数への。これにより、n単にキー値が与えられます。この場合、これはインデックス番号です。最終行にある他のアウトオブプレースのコンマは、実際には標準のCobra構文の一部です。


ご提出いただきありがとうございます。3位になりました。おめでとうございます!
bolov

2

Java

public final class WeirdSort {
    public static void main(final String[] args) {

        //Random
        final Random random = new Random(441287210);

        //Some numbers:
        final List<Integer> list = new ArrayList<Integer>();
        list.add(9);
        list.add(11);
        list.add(3);
        list.add(5);
        list.add(7);

        //Sort randomly:
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(final Integer o1, final Integer o2) {
                return (o1 - o2) + random.nextInt(10);
            }
        });

        //Print
        for(final Integer i:list) {
            System.out.print(i + " ");
        }
    }
}

Prints: 3 5 7 9 11 

この特定のランダム値が最初の10個の結果に対して「1」を返すため、動作します


1
どの言語を使用していますか?
ケナード14年

Java、それについて言及するのを忘れてしまった(編集済み)。
ロイヴァンレイン14年

2

Perl

最近の請負業者!彼らは<=>(別名「宇宙船」)演算子が数値のソートにのみ使用されることを知らないのですか?

そして、なぜ彼らは演算子を比較していますか?

このコードはどのようにして厳しいテストに合格しましたか?? !! strictand も使用しwarningsます!

use strict;
use warnings;

sub asciibetically { 0-($a lt $b) || 0+($a gt $b) || <=><=><=> }
                                                   #  ^  ^  ^
                                                   # What?? How did Perl even compile??!!

my @sorted = sort asciibetically qw( bravo charlie alpha );

print "@sorted";   # "alpha bravo charlie"
                   # And how come it works??!!

Perlがコンパイルされる理由

唯一の実際の<=>演算子は中央の演算子です。他の2つは単なる書き方glob("=")です。これは、<=><=><=>(「宇宙艦隊」と呼ばれる)がに評価されることを意味し0ます。


なぜ機能するのか

asciibeticallyサブルーチンは、文字列比較の実装でcmpバイナリ「オペレータcmp」を返し-10または1左引数が文字列的以下に等しく、以下であるかどうかに応じて、または右引数よりも大きいです。


3
まあPerlは...私にとってはとにかくバグのように見える
chill0r
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.