Hatalı görünen ancak aslında doğru olan bir sıralama programı yazın [kapalı]


12

Bir veya daha fazla hataya sahip gibi görünen bir sayı vektörünü (veya herhangi bir öğe türünü) sıralayan bir program yazın, ancak aslında tamam.

  • Kod açık olmalıdır. Kodu inceleyen biri, bir sıralama algoritması olduğunu kolayca tanımlamalı ve doğru bir kod parçasını bir hata ile kolayca karıştırmalıdır.
  • (Görünen) hata, kodu sözdizimsel veya anlamsal olarak kötü biçimlendiren (ör. Programı derlemez / çalıştırmaz, çalıştırıldığında UB gösterir), programın yanlış sonuçlar üretmesini, sonlandırmamasını veya belirsiz olmamasını sağlar.
  • Kod aslında iyi biçimlendirilmiş olmalı ve program belirli bir zamanda doğru çıktıyı belirleyici bir şekilde üretmelidir.
  • Giriş programda sabit olarak kodlanabilir veya okunabilir (kullanıcıdan, dosyadan vb.).
  • Girişin geçerli olduğu kabul edilir ve giriş doğruluğunu doğrulamak için programa gerek yoktur.
  • Herhangi bir sıralama algoritması kabul edilir. Sayıları tutan veri yapısının gerçek bir vektör olması gerekmez. Program, değişken sayıları veya sabit sayıları sıralamak için tasarlanabilir (örneğin 3 sayıyı sıralayan bir program uygundur ). Sıralama kararlı olabilir veya olmayabilir (not: sıralamanın kararsız görünmesini sağlayan görünür bir hataya sahip kararlı bir sıralama yapmak için tasarlanmış bir programdır, ancak gerçekte bir hata değildir: program aslında kararlı bir sıralama yapar - geçerli bir cevaptır ).
  • (bunlar geniş alanlara yayılmış ve kullanılan örneğin olmadıkça 3. parti araçlar hariç (bir çeşit fonksiyonları dahil) herhangi bir işlev çağırabilir boosiçin C++, JQueryiçin Javascript- bu kullanımı Tamam)
  • dili belirt
  • hata gibi görünen kısmı kodda yorumlayın.
  • hatanın neyi yanlış yaptığını açıklayın.
  • (bir spoiler kutusunda) neden bir hata olmadığını açıklayın.

Bu bir popülerlik yarışması. En çok oy alan cevap kazanır.


Bu meydan okuma artık bitti. Kazanan @Clueless /codegolf//a/30190/11400 8 oyla. Tüm gönderenler sayesinde!

Kazanan ödüllendirildikten sonra gelmek istiyorsanız, lütfen yeni bir cevap eklemek için çekinmeyin. Yarış dışındasınız ama hepimiz ilginç cevaplar görmek istiyoruz.


Sayılar yerine kıvrımlı boolean kullanabilir miyim?
14'te

evet, soruyu da düzenledi: her türlü öğe
bolov

1
Bu soruyu konu dışı olarak kapatmak için oy kullanıyorum çünkü el altında kalan zorluklar artık bu sitede konuyla ilgili değil. meta.codegolf.stackexchange.com/a/8326/20469
kedi

Yanıtlar:


11

C ++

Apple'dangoto fail esinlenerek ; böcek .

#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;
}

Sayfanın yarısında bir hata var: çekimizden sonra yinelenen bir satır var if! Maksimum değeri her zaman son değer ne olursa olsun güncelleyeceğiz bucket_count. Neyse ki biz iyiyiz. C ++ ' std::mapda anahtarlara göre sıralanır. Yani biz sadece kovaları tersine çeviriyoruz, istediğimiz bu.


Kullanmadınız goto, bu yüzden hata yok. (Apple kullanmadıysa hatanın asla gerçekleşmeyeceğini söyleyen tüm insanlara atıfta bulunarak goto)
user253751

Tebrikler, en fazla oyu (7 gün sonra 8 oy) alarak bu mücadeleyi kazandınız. Ayrıca, cevabınızı gerçekten seviyorum çünkü gerçek bir böcek kullandınız.
bolov

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

Test sürüşü

list.sortdöner None, bu nedenle sonraki kısım elseise None + None. Neyse ki bu bir soruna neden olmaz çünkü bir listenin ve bir int'in karşılaştırılması (L > 1)her zamandır True. İşlev her zaman geri döner, Nonebu yüzden dönüş değerini yok Lsayarız ve yerine yerleştirilmiş olan Sadece yazdır Sıralanmış yarımları katenasyonla birleştirmek, yürütme oraya ulaşsa bile işe yaramaz.


Tebrikler, 7 gün sonra 6 oyla ikinci oldunuz. Gönderdiğiniz için teşekkür ederiz.
bolov

5

C

Sıralamayı yanlış kullanmak - 64 bit sistemde int4 bayt ve char *8 bayttır, bu nedenle çalışmamalıdır.

Kod:

#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;
}

İnşa etmek:

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

Çalıştırmak:

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

Evet, sıralar!

Beş şey oluyor: 1) qsortişaretçileri karakterlere işaretçilerle aynı boyutta olan tamsayılara geçirir. 2) Dizeler en fazla dört bayt uzunluğundadır (üç + bir sonlandırıcı) = sıralama yordamının mutlu bir şekilde bir tamsayı olarak ele aldığı bir tamsayı boyutu. 3) Çoğu derleyici veri yapılarının hizalanmasını zorlar, böylece daha kısa dizeler aynı alanı kaplar. Daha büyük olsa da ve arızalara hazırlıklı olun. 4) Endian-ness. 5) Dahili baytların sıfır başlatılması.


Gönderdiğiniz için teşekkür ederiz. 3. oldunuz. Tebrik!
bolov

2

kobra

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]

Ah canım, yanlış atamışım gibi görünüyor n... ve tüm bu virgüller oraya nasıl ulaştı !?

Ne zaman natanır derleyici 's varlık (nedeniyle virgül) bir anahtar-değer çiftinin ilk yarısını ver varsayar, ancak ikinci yarı atanamıyor zaman derleyici şikayet etmiyor hiçbir anahtar-değer çifti var var olmayan bir değişkene. Bu nbasitçe anahtar değerinin verilmesiyle sonuçlanır . Son satırdaki diğer yer dışı virgüllerin tümü aslında standart Cobra sözdiziminin bir parçasıdır.


Gönderdiğiniz için teşekkür ederiz. 3. oldunuz. Tebrik!
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 

Bu belirli rastgele değer ilk 10 sonuç için '1' döndürdüğü için çalışır


1
Hangi dili kullanıyorsunuz?
Knerd

Java, bundan bahsetmeyi unuttum (düzenlenmiş).
Roy van Rijn

2

Perl

Müteahhitler bu gün! <=>(Diğer adıyla "uzay gemisi") operatörünün yalnızca sayısal sıralama için kullanıldığını bilmiyorlar mı?

Ve neden operatörleri karşılaştırıyorlar?

Bu kod nasıl bizim sıkı testleri geçti ?? !! Hatta kullanır strictve 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??!!

Neden Perl derliyor

Tek gerçek <=>operatör, ortadaki operatördür. Diğer ikisi yazmanın başka bir yoludur glob("="). Bu, <=><=><=>(takma "uzay filosu") olarak değerlendirildiği anlamına gelir 0.


Neden çalışıyor?

asciibeticallyAltprogram dize karşılaştırarak bir uygulamasıdır cmpoperatörü: İkili " cmp" döner -1, 0ya 1bağlı olarak sol argüman stringwise daha az, ya da sağ argüman daha büyük eşit, daha olduğunu.


3
Peki Perl benim için yine de bir hata gibi görünüyor ...
chill0r
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.