Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Rang (Ranking) nach Punktezahl (Score) (Felder)

Gegeben ist eine Liste von Scores (= Punktezahlen in einem Wettbewerb). Die größte Zahl in der Liste erhält nun Rang 1, die zweitgrößte Rang 2 u.s.w.

Zum Beispiel: 

Scores-Liste1 = [9,3,6,19] → Ranking = [2,4,3,1] 

Scores-Liste2 = [3,3,3,3,3,5,1] → Ranking = [2,2,2,2,2,1,3]

Achtung: In Scores-Liste2 gibt es fünf mal den zweiten Platz. Man könnte sich hier also auch auf den Stand stellen, dass der Score "1" in Scores-Liste2 sogar nur das Ranking 7 erhält, denn es liegen ja sechs (6) Plätze vor ihm. Folgendes wäre also ebenfalls korrekt:

 

Scores-Liste2 = [3,3,3,3,3,5,1] → Ranking = [2,2,2,2,2,1,7]

2 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

Kommentare (2)

gressly 11. Juni 2015 14:50   reply report
virgil
Sollte das zweite Ranking in der Verifikation nicht gleich der in der Aufgabenbeschreibung sein?
Ich meine …3,1] statt …1,3]

Klar, ...3,1] ist korrekt. Habe das in der Verifikation korrigiert. Besten Dank virgil.
virgil 3. Juni 2015 21:23   reply report
Sollte das zweite Ranking in der Verifikation nicht gleich der in der Aufgabenbeschreibung sein?
Ich meine …3,1] statt …1,3]

8 Lösung(en)

package scores;

import java.util.Arrays;

public class Scores {
	
	public static void main( String[] args ){
		
		int[] scores1 = { 3, 3, 3, 3, 3, 5, 1 };
		int[] scores2 = { 9, 3, 6, 19 };
		
		int[] ranks1 = get_ranks(scores1);
		int[] ranks2 = get_ranks(scores2);
		
		String s1 = Arrays.toString(scores1);
		String s2 = Arrays.toString(scores2);
		
		String r1 = Arrays.toString(ranks1);
		String r2 = Arrays.toString(ranks2);
		
		System.out.println( s1 + " ---> " + r1 );
		System.out.println( s2 + " ---> " + r2 );
		
	}
	
	private static int[] get_ranks( int[] scores ){
		
		final class ScoreAndIndex implements Comparable<ScoreAndIndex>{
			
			public int score;
			public int index;

			@Override
			public int compareTo(ScoreAndIndex s) {
				
				return s.score - this.score;
				
			}
		}
		
		ScoreAndIndex[] scores_and_indexes = new ScoreAndIndex[ scores.length ];
		int[] ranks = new int[ scores.length ];
		
		for( int i = 0; i <= scores.length - 1; ++i ){
			
			scores_and_indexes[i] = new ScoreAndIndex();
			scores_and_indexes[i].score = scores[i];
			scores_and_indexes[i].index = i;
		
		}
		
		Arrays.sort( scores_and_indexes );
		
		int prev_score = Integer.MIN_VALUE;
		int curr_score;
		int rank = 0;
		for( ScoreAndIndex s: scores_and_indexes ){
			
			curr_score = s.score;
			if( curr_score != prev_score ){
				++rank;
			}
			
			ranks[ s.index ] = rank;
			prev_score = curr_score; 
		}
		
		return ranks;
		
	}
	
}
                

Lösung von: reeman :3 (TU Ilmenau)

print join($",makeRank(9,3,6,19)).$/;
#ergibt 2 4 3 1
print join($",makeRank(3,3,3,3,3,5,1)).$/;
#ergibt 2 2 2 2 2 1 3 

sub makeRank {
my %hash;
my @rank = sort {$a<=>$b} grep {!$hash{$_}++} @_;
my @result = @_;
for my $i (0..$#rank){
    for my $x (0..$#result)
    {$result[$x] = $#rank-$i if($rank[$i]==$result[$x]);}
}
return map{++$_} @result;
}
                

Lösung von: Paul Scheinast (http://scheinast.eu)

var anArray = [9, 3, 6, 19],
    anotherArray = [3, 3, 3, 3, 3, 5, 1];
    
function rank(arr) {
   var sortArr = [].concat(arr).sort(function(a, b) { return b - a }),
       rankArr = new Array(arr.length),
       rnk = 1,
       current, i;
   while (sortArr.length > 0) {
      current = sortArr.shift();
      for (i = 0; i < arr.length; i++)
         if (arr[i] == current) rankArr[i] = rnk;
      if (current != sortArr[0]) rnk++;      
   }   
   return rankArr;
}

console.log(rank(anArray).join(", "));
console.log(rank(anotherArray).join(", "));   

                

Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)

# coding: utf-8
def computeScores(scores):
    # Ranking feststellen & Dictionary aufbauen
    work = scores[:]            # Arbeitsbereich
    work.sort()
    work.reverse()              # absteigend
    scoredict = {}
    rank = 1
    last = ""
    for i in work:
        if i != last:           # Dubletten nicht hochzählen
            scoredict[i] = rank
            rank = rank + 1
        last = i

    # Ranking der orig. Reihenfolge erzeugen
    result = []
    posn = 0
    for i in scores:
        result.append(scoredict[i])
        posn = posn + 1
    print "\nRanking der Zahlen ", scores, " ist: ", result
    return()
    
computeScores([9,3,6,19])
computeScores([3,3,3,3,3,5,1])
                

Lösung von: J. Reppe ()


let scores = [3;3;3;3;3;5;1] //[9; 3; 6; 19]

let rank n =
    let rec rank' r s =
        match s with 
        | [] -> r
        | x::xs -> rank' (if n < x then r + 1 else r) xs
    rank' 1 scores

let ranking =
    scores
    |> List.rev
    |> List.fold (fun acc x -> (rank x)::acc) []
    |> printfn "%A"
                

Lösung von: Vural Acar ()

REPORT  zranking.

PARAMETERS: pa_1 TYPE string.

DATA: lt_score TYPE STANDARD TABLE OF string,
      ls_score LIKE LINE OF lt_score,
      lt_sortiert TYPE STANDARD TABLE OF i,
      ls_sortiert LIKE LINE OF lt_sortiert,
      lt_hilfsliste TYPE STANDARD TABLE OF i,
      ls_hilfsliste LIKE LINE OF lt_hilfsliste,
      lt_ranking TYPE STANDARD TABLE OF i,
      ls_ranking LIKE LINE OF lt_ranking,
      lv_index TYPE i,
      lv_index2 TYPE i,
      lv_ausgabe TYPE string,
      lv_string TYPE string,
      lv_sortiert_alt TYPE i.

SPLIT pa_1 AT ',' INTO TABLE lt_score. " Eingabe wird gesplittet

lt_sortiert[] = lt_score[].
lt_hilfsliste[] = lt_score[].
lt_ranking[] = lt_score[].

SORT lt_sortiert DESCENDING. " Score wird sortiert.

" Löschen von Doppelten Werten
LOOP AT lt_sortiert INTO ls_sortiert.
  IF ls_sortiert EQ lv_sortiert_alt.
    DELETE lt_sortiert INDEX sy-tabix.
  ENDIF.
  lv_sortiert_alt = ls_sortiert.
ENDLOOP.

" Ermittlung des Rankings
LOOP AT lt_sortiert INTO ls_sortiert.
  lv_index = sy-tabix.
  LOOP AT lt_ranking INTO ls_ranking.
    IF ls_ranking EQ ls_sortiert.
      lv_index2 = sy-tabix.
      ls_hilfsliste = lv_index.
      MODIFY lt_hilfsliste INDEX lv_index2 FROM ls_hilfsliste.
    ENDIF.
  ENDLOOP.
ENDLOOP.

" Für gewünschte Ausgabe wird die Tabelle in einen String umgewandelt.
LOOP AT lt_hilfsliste INTO ls_hilfsliste.
  lv_string = ls_hilfsliste.
  CONCATENATE lv_ausgabe lv_string INTO lv_ausgabe SEPARATED BY ','.
ENDLOOP.
SHIFT lv_ausgabe BY 1 PLACES LEFT. " Löschen des ersten Kommas.

WRITE: / 'Liste: ',
         pa_1.

WRITE: / 'Ranking: ' NO-GAP,
         lv_ausgabe.
                

Lösung von: Alexander S. (msg systems)

// NET Core 3.x

using System;
using System.Collections.Generic;
using System.Linq;

namespace CS_MDL_CORE_Ranking
{
    class Program
    {
        static void Main(string[] args)
        {
            var l = new List<int>() { 3, 3, 3, 3, 3, 5, 1 };
            PrintList(l);
            PrintRanking(l);
            Console.WriteLine();
            PrintRankingTuple(l);
            Console.WriteLine();
            PrintRankingList(l);
            Console.WriteLine();
            PrintRankingOrderedList(l);
        }
        static void PrintList(IEnumerable<int> l) => Console.Write($"[{ string.Join(", ", l) }] -> ");

        static void PrintRanking(IEnumerable<int> l) => Console.WriteLine($"[{ string.Join(", ", l.Select(x => new { r = l.OrderBy(x => -x).ToList().IndexOf(x) + 1 }).Select(x => x.r))}]");

        static void PrintRankingTuple(IEnumerable<int> l) => l.Select(x => new { n = x, r = l.OrderBy(x => -x).ToList().IndexOf(x) + 1 }).Select(x => (x.n, x.r)).ToList().ForEach(x => Console.WriteLine(x));

        static void PrintRankingList(IEnumerable<int> l) => l.Select(x => new { num = x, rank = l.OrderBy(x => -x).ToList().IndexOf(x) + 1 }).ToList().ForEach(x => Console.WriteLine(x));

        static void PrintRankingOrderedList(IEnumerable<int> l) => l.Select(x => new { num = x, rank = l.OrderBy(x => -x).ToList().IndexOf(x) + 1 }).ToList().OrderBy(x => x.rank).ToList().ForEach(x => Console.WriteLine(x));
    }
}
                

Lösung von: Jens Kelm (@JKooP)

// C++ 14 | VS-2022
#include <iostream>
#include <vector>
#include <algorithm>

std::vector<int> get_ranking(const std::vector<int>& in_) {
    std::vector<int> srt_{ in_ }, rnk_{}, out_{};
    std::sort(srt_.rbegin(), srt_.rend());
    srt_.push_back(INT_MIN);
    auto cnt{ 1 };

    for (size_t i{ 1 }; i < srt_.size(); i++)
        rnk_.push_back(srt_[i] < srt_[i - 1] ? cnt++ : cnt);

    for (const auto& i : in_) {
        const auto it{ std::find(srt_.begin(), srt_.end() - 1, i) };
        out_.push_back(rnk_[it - srt_.begin()]);
    }
    return out_;
}

void print(const std::vector<int>& v) {
    for (auto it{ v.begin() }; it != v.end() - 1; ++it)
        std::cout << *it << ", ";
    std::cout << v.back() << "\n";
}

int main() {
    print(get_ranking({ 9, 3, 6, 19 }));
    print(get_ranking({ 3, 3, 3, 3, 3, 5, 1 }));
}
                

Lösung von: Jens Kelm (@JKooP)

Verifikation/Checksumme:

liste1 = [9,3,6,19] → Ranking = [2,4,3,1] 

liste2 = [3,3,3,3,3,5,1] → Ranking = [2,2,2,2,2,1,3]

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 0.5
Schwierigkeit: Mittel
Webcode: qwjb-jg40
Autor: ()

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen