Odd'em out: lettres

11

Objectif

Écrivez un programme ou une fonction (ou équivalent) qui trie et renvoie la lettre impaire dans la matrice de taille aléatoire.

Détails

Vous recevrez une matrice (sous forme de chaîne) en entrée de dimensions aléatoires comme celle-ci.

bbbbbbbbbb
bbbbbdbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb

Votre travail consiste à trouver la lettre qui ne correspond pas au reste (dans ce cas, elle se dtrouve à la ligne 2, col 6) et à renvoyer cette lettre en sortie. La matrice sera composée de lettres A-Z, de a-znouvelles lignes ( \n, uniquement aux extrémités des lignes) et aura des dimensions allant de 5x5 à 10x10 (25-100 lettres).

Des échappatoires standard s'appliquent. Il s'agit d'un défi de golf de code; entrée avec le code du moins d'octets gagne.

Contribution

L'entrée sera transmise via l'entrée standard sous forme de chaîne s'il s'agit d'un programme ou d'argument s'il s'agit d'une fonction (ou similaire).

Production

Un seul caractère qui est le « bizarre » dans la matrice ou None , nil, NULou la chaîne "None"s'il n'y a pas de caractère « étrange ».

Plus d'exemples

AAAAAAA
AAAAAAA
AAAAAAA
AAAIAAA
AAAAAAA

Réponse: I

vvqvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv

Réponse: q

puuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu

Réponse: p

Générateur

Voici un générateur de matrice aléatoire écrit en Python que vous pouvez utiliser pour tester votre programme. Remarque: Il y a une légère chance qu'il puisse faire une erreur et ne pas mettre une lettre bizarre.

juniorRubyist
la source
1
Voici une traduction littérale de votre code Python en JS.
Arnauld
1
@juniorRubyist "supprimer le bonus" n'est pas la même chose que "rendre le bonus obligatoire". En déplaçant la partie qui était facultative jusqu'à présent dans les exigences du défi, vous avez invalidé une grande partie des réponses existantes.
Martin Ender

Réponses:

6

J , 12 10 7 octets

-.}./.~

Essayez-le en ligne!

    /.~        Group identical items together
  }.           Remove one item from each group
-.             Remove the rest from the input

Version 10 octets

-._1 1{\:~

siffle ...

       \:~        Sort down
  _1 1{           Take the last character (which is a newline) and the second one.
-.                Remove those from the input
FrownyFrog
la source
2
@ FrownyFrog C'est une façon intelligente de trouver le personnage étrange
Galen Ivanov
ne peut pas décider ce que j'aime mieux: ce joli crochet ou votre blague de dragon ...
Jonah
4

Brachylog , 8 4 octets

oḅ∋≠

Essayez-le en ligne!

Explication

Je n'ai jamais utilisé Brachylog auparavant, donc ce n'est peut-être pas optimal.

oḅ∋≠  Input is a string.
o     Sort the input.
 ḅ    Split it into blocks of equal elements.
  ∋   There is a block
   ≠  whose elements are all different.
      That block is the output.
Zgarb
la source
Cette utilisation de ∋≠after pour obtenir les résultats de la longueur 1 est très intelligente. Vous devriez certainement le poster dans la question des conseils Brachylog .
Fatalize
@Fatalize Merci, j'ai ajouté le conseil.
Zgarb
3

K (oK) , 7 6 octets

Solution

*<#:'=

Essayez-le en ligne!

Exemple:

*<#:'="vvqvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"q"

Explication:

Trouvé une approche légèrement plus courte: Évalué de droite à gauche:

*<#:'= / the solution
     = / group matching items together
  #:'  / count (#:) each (')
 <     / sort ascending
*      / take the first one

Remarques:

Alors que je m'attends à ce que l'aspect bonus de ce défi soit abandonné, cette solution retournera le caractère de nouvelle ligne \ns'il n'y a pas de caractère impair:

*<#:'="vvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"\n"
streetster
la source
3

Prolog (SWI) , 46 octets

p(L):-select(X,L,Y),\+member(X,Y),writef([X]).

Essayez-le en ligne!

Ou si la sortie vraie standard des requêtes prolog n'est pas correcte:

Prolog (SWI) , 48 octets

Z*L:-select(X,L,Y),\+member(X,Y),char_code(Z,X).

Essayez-le en ligne!

Explication

Find the first element X in the input  
that when removed, results in output  
that does not contain X

then depending on the version above either:  
print X as a character  
or  
return X as an atom
Emigna
la source
3

C (gcc) , 93 92 90 66 62 octets

Beaucoup plus court en fonction

t;f(char*p){for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

Essayez-le en ligne!

code de test

main()
{
    char s[99];
    for(;gets(s);)f(s);
}

l'ancienne version est un programme

C 86 octets

char*p;s[9];main(t){for(;p=gets(s);)for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

Sort le caractère impair, ou rien. courir comme ça;

C:\eng\golf>python matrix_gen.py | a.exe
X
C:\eng\golf>python matrix_gen.py | a.exe
G
C:\eng\golf>python matrix_gen.py | a.exe
x
C:\eng\golf>python matrix_gen.py | a.exe

C:\eng\golf>python matrix_gen.py | a.exe
J
cleblanc
la source
Je ne sais pas s'il est assez juste de mettre le gets()dans le pilote de test car il nettoie l'entrée en supprimant les caractères \ n pour vous. Cela fait un certain travail pour que votre fonction ne fonctionne pas sur l'entrée d'origine.
Michael Dorgan
@MichaelDorgan Il fonctionne avec l'entrée canalisée du script python ainsi qu'avec l'entrée sur TIO. D'autres ont simplement codé en dur l'entrée qui ne semblait pas conforme à l'esprit du défi.
cleblanc
3

05AB1E ,  4  2 octets

Enregistré 2 octets grâce à Adnan

.m

Essayez-le en ligne!

Explication

.m   # push a list of the least frequent character(s) in input
Emigna
la source
Avez-vous besoin de supprimer les sauts de ligne, étant donné que nous sommes garantis que l'entrée sera d'au moins 5 lignes?
Shaggy
@Shaggy: Non, je ne le sais pas. C'était pour gérer les 2x2matrices. J'ai raté la partie sur 5x5et en haut. Merci!
Emigna
Il doit revenir nils'il n'y en a pas de "bizarre", n'est-ce pas?
Magic Octopus Urn
@MagicOctopusUrn Cette partie était facultative lorsque cette réponse a été publiée. Je suppose que ce changement invalide la plupart des réponses maintenant ...
Martin Ender
2

Rétine , 13 octets

s(O`.
(.)\1+

Essayez-le en ligne!

Explication

s(O`.

Triez tous les caractères.

(.)\1+

Supprimez tous les caractères qui apparaissent au moins deux fois.

Martin Ender
la source
2

Husk , 2 octets

◄=

Essayez-le en ligne!

Il s'agit d'une fonction prenant une chaîne en entrée et renvoyant un caractère. Il prend le minimum de la chaîne d'entrée lors de la comparaison des caractères pour l'égalité (c'est-à-dire qu'il renvoie le caractère qui est égal au moins grand nombre d'autres caractères).

Leo
la source
2

C, 94 octets

Retour par pointeur. Si aucun, revenez \0.

Cela entraînera des fuites de mémoire. En supposant que intc'est 4 octets.

*t;f(c,p,i)char*c,*p;{t=calloc(64,8);for(*p=-1;*c;c++)t[*c]--;for(i=0;++i<128;)!~t[i]?*p=i:0;}

Essayez-le en ligne!

Colera Su
la source
@Shaggy En fait, je ne sais pas comment interpréter cette règle, car je vois que certains (autres) utilisateurs connaissent explicitement cette règle mais affichent toujours de telles réponses comme celle-ci.
user202729
2
@ user202729, ce n'est pas parce que d'autres le font que c'est juste;) Si vous repérez de telles solutions, il vaut mieux les leur signaler.
Shaggy
@Shaggy Eh bien, j'ai explicitement pointé la règle mais cet utilisateur a dit "la règle dit explicitement que celle-ci est valide". Je ne sais pas quoi dire. | Dans ce cas, la fonction nécessite que le tableau tsoit mis à zéro avant d'appeler à chaque fois, pas la première fois.
user202729
@Shaggy Merci, corrigé.
Colera Su
2

Bash , 15 20 octets

fold -1|sort|uniq -u

Essayez-le en ligne!

Explication: fold s l'entrée du 1caractère par ligne, sorts en groupes de lettres correspondantes, puis imprime uniquement les lignes qui sont unique.

Merci à @Nahuel Fouilleul d' avoir attrapé et aidé à résoudre un problème avec cette approche.

Justin Mariner
la source
ne fonctionne pas si le caractère impair est le deuxième ou le pénuitlimate
Nahuel Fouilleul
@NahuelFouilleul Bonne capture ... Je ne sais pas comment résoudre ce problème pour le moment, mais je corrigerai ou supprimerai plus tard à moins que vous n'ayez suggéré une correction.
Justin Mariner
il peut être simplement résolu avec |sort|mais il peut y avoir une meilleure solution
Nahuel Fouilleul
a également trouvé une solution avec grep mais c'est plus longgrep -oP '^(.)((?=(?!\1).){2}|.*\K(?!\1).)'
Nahuel Fouilleul
@NahuelFouilleul Je vais avec le sortcorrectif, merci. Vous pouvez toujours publier cette réponse grep comme la vôtre si vous le souhaitez.
Justin Mariner
1

Pyth , 4 octets

ho/Q

Essayez-le ici!

M. Xcoder
la source
.m/Qest également de 4 octets
Dave
@Dave Cela sort cependant comme une liste, j'ai choisi cela parce que c'était plus élégant ;-)
M. Xcoder
1

Perl 5, 17 + 3 (-00p) -25% = 15 octets

/(.)\1/;s/
|$1//g

essayez-le en ligne

Nahuel Fouilleul
la source
1

Matlab, 25 octets

a=input('');a(a~=mode(a))

L'entrée "a" où "a" n'est pas le mode de "a". Produit un tableau vide pour aucune excuse.

Jeremiah Peek
la source
1

Haskell, 33 * 0,75 = 24,75 octets

f s=[c|[c]<-(`filter`s).(==)<$>s]

Renvoie une liste vide s'il n'y a pas de caractère impair.

Essayez-le en ligne!

Pour chaque caractère cde la matrice (donné sous forme de chaîne s), créez une chaîne de tous les caractères ségaux à cet conservez ceux de longueur 1.

nimi
la source
1

JavaScript (ES6), 37 octets

Renvoie nulls'il n'y a pas de lettre impaire.

s=>s.match(`[^
${s.match(/(.)\1/)}]`)

Cas de test

Arnauld
la source
1

Japt , 6 octets

Prend l'entrée sous la forme d'une chaîne multi-lignes et génère une chaîne de caractères unique ou une chaîne vide s'il n'y a pas de solution.

k@èX É

Essayez-le


Explication

Supprimez les caractères qui retournent truey ( k) lorsqu'ils sont passés par une fonction ( @) qui compte ( è) les occurrences de l'élément courant ( X) dans l'entrée et soustrait 1 ( É).

Hirsute
la source
1

Lisp commun, 47 octets

(lambda(s)(find-if(lambda(x)(=(count x s)1))s))

Essayez-le en ligne!

Renvoie la lettre impaire ou NIL si elle n'existe pas.

Renzo
la source
1

Gelée , 4 octets

ċ@ÐṂ

Essayez-le en ligne!

Retour \n(une seule nouvelle ligne) au cas où il n'y aurait pas de caractère impair. Ce \nn'est évidemment pas un caractère imprimable.

Par coïncidence, c'est exactement le même algorithme que la réponse Mr.Xcoder Python. (Je l'ai trouvé indépendamment)

Explication:

  ÐṂ    Ṃinimum value by...
ċ@      ċount. (the `@` switch the left and right arguments of `ċ`)

Cela fonctionne parce que dans une m×nmatrice:

  • S'il existe un caractère impair: Il y a des m-1sauts de ligne, 1 caractère impair et m×n-1un caractère normal, et 1 < m-1 < m×n-1parce que 5 ≤ m, n ≤ 10.
  • S'il n'y a pas de caractère impair: il y a des m-1sauts de ligne et m×nun caractère normal, et m-1 < m×n.
user202729
la source
1

C # (.NET Core) , 54 octets

i=>i.GroupBy(x=>x).FirstOrDefault(g=>g.Count()<2)?.Key

Essayez-le en ligne!

Wakawakamush
la source
Vous avez raison, ma réponse était fausse. Je l'ai supprimé. Mais il vous manque les 18 octets de l' usinginstruction dans le nombre d'octets.
raznagul
1

C (gcc) , 91 86 82 79 71 octets

f(char*s){for(;*++s==10?s+=2:0,*s;)if(*s^s[-1])return*s^s[1]?*s:s[-1];}

Essayez-le en ligne!

  • Merci à Gastropner pour le xor et? astuces (-3 octets)
  • Retravaillé la version de comparaison pour corriger les bugs et utilisé la magie Gastropner à partir des commentaires.

Explication:

Comparez les caractères actuels et précédents tout en sautant les nouvelles lignes. Si différent, comparez au caractère suivant. Cela nous indique si nous renvoyons le caractère actuel ou précédent. La fonction renvoie la valeur de caractère "impair" si elle existe ou 0 si le tableau n'est pas impair. Nous nous en sortons avec le "prochain" chèque car il y a toujours une nouvelle ligne avant le caractère \0. S'il n'y a pas de caractère impair, nous renvoyons intrinsèquement le \ 0 de la boucle for.


Code xor plus ancien et plus sexy Explication:

Créez un masque xor en cours d'exécution des 3 valeurs de chaîne suivantes. S'ils sont tous identiques, la valeur sera égale à l'un des trois. S'ils sont différents, alors les 2 identiques s'annuleront en laissant l'unique.

Doit factoriser / n avant le xor ou il devient désordonné. Vous devez également vérifier l'inégalité de 2 caractères dans le cas où s [0] est la valeur impaire. Cela coûte plus cher || vérifier.

v;f(char*s){while(s[3]){s[2]==10?s+=3:0;v=*s^s[1]^s[2];if(v^‌​*s++||v^*s)break;}}
Michael Dorgan
la source
79 avec quelques ajustements. Le retour de chute n'est pas d'accord avec mon compilateur, donc uniquement testé sur TIO:v;f(char*s){while(s[3]){s[2]==10?s+=3:0;v=*s^s[1]^s[2];if(v^*s++||v^*s)break;}}
gastropner
Pour la merde que j'écris, TIO est ce avec quoi je reste. Merci!
Michael Dorgan
Réorganiser certaines expressions permet un autre -2 pour 77: v;f(char*s){while(s[2]==10?s+=3:0,v=*s^s[1]^s[2],s[3])if(v^*s++||v^*s)break;} Cependant, votre cheval gagnant est l'autre, si vous en v;f(char*s){for(v=-1;*++s==10?s+=2,v--:0,*s;v=0)if(*s^s[-1])return s[v];}
jouez
Oui, mais le xor semble si sexy. :)
Michael Dorgan
Suggérer à la s+=*++s-10?0:2place de*++s==10?s+=2:0
plafondcat
1

Octave , 26 25 octets

1 octet enregistré grâce à @Giuseppe

@(x)x(sum(x(:)==x(:)')<2)

Fonction anonyme qui prend un tableau de caractères 2D en entrée et génère la lettre impaire ou une chaîne vide si elle n'existe pas.

Essayez-le en ligne!

Luis Mendo
la source
0

Alice , 16 * 75% = 12 octets

/-.nDo&
\i..*N@/

Essayez-le en ligne!

Sort Jabberwockys'il n'y a pas de caractère en double.

Explication

/...@
\.../

Il s'agit d'un cadre pour les programmes linéaires qui fonctionnent entièrement en ordinal (mode de traitement de chaîne). Le code réel est exécuté en zigzag et se déroule pour:

i..DN&-o

i   Read all input.
..  Make two copies.
D   Deduplicate one copy, giving only the two letters and a linefeed.
N   Multiset difference. Removes one copy of each letter and one linefeed.
    Therefore it drops the unique letter.
&-  Fold substring removal over this new string. This essentially removes
    all copies of the repeated letter and all linefeeds from the input,
    leaving only the unique letter.
.   Duplicate.
n   Logical NOT. Turns empty strings into "Jabberwocky" and everything else
    into an empty string.
*   Concatenate to the previous result.
o   Print the unique letter or "Jabberwocky".

Au lieu de &-, nous pourrions également utiliser ey(translittération dans une chaîne vide). Alternativement, en dépensant un caractère de plus pour la manipulation de la pile, nous pourrions également dédupliquer l'entrée qui nous permet de supprimer les caractères indésirables avec N, mais c'est toujours le même nombre d'octets:

i.D.QXN.n*o@

Alice , 13 octets

/N.-D@
\i&.o/

Essayez-le en ligne!

Ceci est la solution sans bonus, il manque simplement le .n*.

Martin Ender
la source
0

APL + WIN, 16 octets

(1=+/a∘.=a)/a←,⎕

Invite à saisir l'écran et génère une lettre impaire ou rien s'il n'y a pas de lettre impaire

Graham
la source
a/⍨1=+/a∘.=a←,⎕pour un octet
Uriel
@Uriel Merci mais je crains que l'opérateur ⍨ ne soit pas disponible dans mon ancienne version APL + WIN 5 :(
Graham
0

PowerShell , 39 octets

([char[]]"$args"|group|sort c*)[0].Name

Essayez-le en ligne!

Prend l'entrée sous forme de chaîne avec des retours à la ligne (comme spécifié dans le défi), la convertit en un chartableau. Nous avons ensuite Group-Objectles personnages, afin que les personnages soient regroupés par leurs noms, puis en sortfonction du cnombre. Cela garantit que le caractère solitaire est le premier, nous prenons donc l' [0]index et le sortons .Name.

Si la nouvelle ligne est acceptable pour «rien», cela donne droit au bonus.

AdmBorkBork
la source
J'espérais sort c*)[0]pourrait être raccourci, mais ce que je suis venu avec était le même nombre d'octets, ? c* -eq 1).
root
peut être raccourci en supprimant les guillemets autour $args. Il est également plus précis à faire ([char[]]$args|group|? c* -eq 1).Namecar il retournera avec précision nulllorsqu'il n'y a pas de caractère impair (au lieu d'une nouvelle ligne). Cependant, en termes d'octets, cela ne vous ramènera toujours pas en dessous de 37.
cogumel0
@ cogumel0 Ne fonctionne pas sans guillemets doubles.
root
@root vous avez raison. Cependant , pour passer l' une des exigences (un seul caractère qui est le « bizarre » dans la matrice ou None, nil, NULou la chaîne de "None"caractère s'il n'y a pas de « bizarre ».) , Il devrait encore être modifié. Newline ne fait pas partie des réponses acceptables.
cogumel0
@ cogumel0 Ah, le défi a changé depuis que j'ai posté ma réponse. Le "Aucun / néant / peu importe" était autrefois un bonus plutôt qu'obligatoire. Je vais garder ma réponse telle quelle.
AdmBorkBork
0

Perl 6 ,  27  24-25% = 18 octets

*.comb.Bag.min(*.value).key

Essaye-le

{%(.comb.Bag.invert){1}}

Essaye-le

Cela renverra une valeur indéfinie quand une entrée ne contient pas de caractère impair.

Étendu:

{  # bare block lambda with implicit parameter 「$_」

  %(        # coerce into a Hash

    .comb   # split the input into graphemes (implicit method call on 「$_」)
    .Bag    # turn into a weighted Set
    .invert # invert that (swap keys for values) returns a sequence

  ){ 1 }    # get the character that only occurs once
}
Brad Gilbert b2gills
la source
0

Brainfuck, 125 octets

,[----------[>],]<[->+<]<<[[->->+<<]>[>[->-<<<+>>]>[,<<,>>]<<<[->+<]>[->+<]<]>[-<<+>>]>[-<+>]<<<<]>>>>[<]<++++++++++.

Essayez-le en ligne

Imprime la lettre de la matrice s'il n'y en a pas de bizarre

Jo King
la source
0

Java 8, 85 octets

Il s'agit d'un lambda de Stringà String(par exemple Function<String, String>). C'est essentiellement une copie de la solution de Luca , mais j'ai un peu réduit le tri des chaînes.

s->new String(s.chars().sorted().toArray(),0,s.length()).replaceAll("(.)\\1+|\\n","")

Essayez-le en ligne

Jakob
la source