Insérer semi-trié dans un tableau non trié

14

Bienvenue à votre premier jour chez PPCG Inc. En tant que nouveau trieur de documents adjoint junior, vous êtes responsable de vous assurer que tous les documents que nous vous avons envoyés sont archivés par ordre alphabétique. C'est si simple qu'un singe peut le faire. Eh bien, métaphoriquement parlant, car nous avons embauché un singe pour le faire. Devine quoi? Il s'avère que les singes manquent de compréhension de notre alphabet. Quoi qu'il en soit, nous n'avons pas le temps de réparer le gâchis actuel, alors essayez simplement de ne pas aggraver la situation, d'accord? Alors allez-y! Si vous avez faim, il y a des bananes près du refroidisseur d'eau. Bonne chance!

Description de l'emploi

Contribution

  • Vous recevrez une liste de chaînes (l'archive) et une chaîne qui doit être ajoutée à cette liste (le document)
  • Toutes les chaînes ne contiendront que des lettres majuscules, des lettres minuscules et des espaces
  • Les chaînes commenceront et se termineront toujours par une lettre

Tâche

Déterminez la position cible du document: la position qu'il doit recevoir dans l'archive. La position cible peut être déterminée comme suit:

  • Pour chaque poste:
    • Comptez le nombre de chaînes dans l'archive avant cette position qui sont alphabétiquement avant le document
    • Comptez le nombre de chaînes dans l'archive après cette position qui sont alphabétiquement après le document
    • Définissez le score de la position comme la somme des deux chefs d'accusation ci-dessus
  • La position cible du document est la position avec le score le plus élevé
  • En cas d'égalité, toutes les positions avec le score le plus élevé sont également valables comme position cible. Un seul doit être sélectionné.

Lors du tri:

  • Les majuscules et les minuscules sont équivalentes
  • Les espaces passent avant les lettres

Production

  • L'archive avec le document ajouté sous n'importe quelle forme

OU

  • La position cible du document, dans un index basé sur 0 ou basé sur 1

Évaluation des emplois

Le moins d'octets gagne!

Exemple d'E / S

Archive:
    Applebuck Season
    Friendship is Magic
    The Ticket Master
    Griffon the BrushOff
    Boast Busters
    Bridle Gossip

Document: Dragonshy

Position scores (0-based index):
0: 0 + 3 = 3
1: 1 + 3 = 4
2: 1 + 2 = 3
3: 1 + 1 = 2
4: 1 + 0 = 1
5: 2 + 0 = 2
6: 3 + 0 = 3

Target position: 1
Lex
la source
5
Bienvenue sur PPCG, cela semble être un bon premier post! :) Vos instructions dans la section "Tâche" sont cependant assez difficiles à lire. Le défilement horizontal est ennuyeux: j'envisagerais plutôt d'utiliser une liste à puces. Nous avons un bac à sable pratique où vous pouvez publier des défis pour que la communauté les examine, si vous le souhaitez.
FryAmTheEggman
Dragonshy Je viens de l'avoir! Très sympa :-D
Luis Mendo
@Lex Ce serait bien d'avoir un ou deux cas de test supplémentaires
Luis Mendo

Réponses:

4

JavaScript (ES6), 81 octets

(a,d)=>a.map((e,i)=>d[l="toLowerCase"]()<e[l]()?s--:++s>m&&(++m,p=++i),m=s=p=0)|p

Non golfé:

function position(archive, document) {
    var score = 0;
    var max = 0;
    var pos = 0;
    var i = 0;
    while (i < archive.length) {
        if (archive[i++].toLowerCase() > document.toLowerCase()) {
            score--;
        } else {
            score++;
            if (score > max) {
                max++;
                pos = i;
            }
        }
    }
    return pos;
}

Edit: sauvé beaucoup d'octets grâce à @ user81655.

Neil
la source
Le remplacement de la indexOfpar une variable de résultat définie pendant la carte serait également plus court.
user81655
D'accord, mais ça ne ressemble plus à ma solution ...
Neil
3

Pyth, 40 38 octets

Crédits à @Katenkyo pour m'avoir enseigné que A xnor Bc'est fondamentalement A==B. ( A xor Bc'est aussi A!=B)

AQJ+],k0.e,rb0hkGteh.Msmq<hdrH0<edeZJJ

Essayez-le en ligne!

Comment ça fonctionne:

Il additionne le XNOR si l'entrée est plus petite que le document et si l'index de l'entrée est plus petit que l'index du document.

Il trouve la position dans laquelle cette somme est maximale, puis la sort.

Leaky Nun
la source
2

Python 3, 135 167 octets

def a(b,c):a=[sum(map(lambda x:x.lower()>c.lower(),b[i:]))+sum(map(lambda x:x.lower()<c.lower(),b[:i]))for i in range(0,len(b)+1)];b.insert(a.index(max(a)),c);print(b)
haydenridd
la source
1

Rubis, 97 octets

Fonction anonyme, retourne la position cible.

->a,d{d.upcase!;(0...a.size).max_by{|i|a[0,i].count{|s|s.upcase<d}+a[i..-1].count{|s|s.upcase>d}}}

Lors de l'insertion effective dans l'archive, 110 octets :

->a,d{t=d.upcase;a.insert (0...a.size).max_by{|i|a[0,i].count{|s|s.upcase<d}+a[i..-1].count{|s|s.upcase>d}},d}
Encre de valeur
la source
1

Pyth, 54 52 47 45 octets

AQVhlG=Ys+m>rH0rd0:G0Nm<rH0rd0gGNI>YZ=ZY=kN;k

Attendez-vous à ce que l'entrée soit une liste, le premier élément est une liste de chaînes (archive), le deuxième élément est une chaîne (document)

AQ                                            # initialize G and H with the archive and the document
  VhlG                                        # iterate over the indexes on archive
      =Ys+                                    # concatenate and sum the following scores
          m>rH0rd0:G0N                        # map a string comparison between the document and the archives up to the index, returning true(1) for lower, and false(0) for higher
                      m<rH0rd0gGN             # same as above, but starts at the index and goes up to the end of the archive, returning false(0) for lower, and true(1) for higher
                                 I>YZ         # Check if score is higher than highest
                                     =ZY      # update highest score
                                        =kN;  # update index
                                            k # print index

Testez ici

  • 5 octets enregistrés lors de l'initialisation de l'entrée (merci @Kenny Lau)
Barre
la source
Z est auto-connecté 0auquel, si je lis correctement votre code, vous pouvez économiser de l'espace
Maltysen
Utiliser ["Applebuck Season","Friendship is Magic","The Ticket Master","Griffon the BrushOff","Boast Busters","Bridle Gossip"]\n "Dragonshy"comme entrée et utiliser à la Eplace de @Q0et @Q1peut vous faire économiser quatre octets.
Leaky Nun
Vous pouvez utiliser à la AQplace de J@Q0K@Q1.
Leaky Nun
1

MATL , 32 octets

hk4#S4#S%2#0)>t0whYsw~0hPYsP+K#X>

L'entrée est un tableau de cellules de chaînes (plusieurs chaînes séparées par des espaces et entourées d'accolades) pour l'archive, et une chaîne pour le document. La sortie est basée sur 1. En cas d'égalité, la première position est retournée.

Essayez-le en ligne!

Explication

h      % Concatenate archive and document as a cell array of strings
k      % Convert all strings to lowercase
4#S    % Sort and output the indices of the sorting
4#S    % Again. This gives the indices that applied to the concatenated
       % array would make it sorted
2#0)   % Separate last index (document) from the others (archive)
>      % Is it greater? Gives zero/one array the size of the archive
t      % Duplicate that array
0wh    % Prepend a 0
Ys     % Cumulative sum. This is first part of the score
w~     % Swap. Negate zero/one array
0h     % Postpend a 0
PYsP   % Reverse, cumulative sum, reverse. Second part of the score
+      % Add. This is the score of each position
K#X>   % Arg max
Luis Mendo
la source