Seltsam: Briefe

11

Zielsetzung

Schreiben Sie ein Programm oder eine Funktion (oder eine gleichwertige Funktion), die den ungeraden Buchstaben in der Matrix zufälliger Größe aussortiert und zurückgibt.

Einzelheiten

Sie erhalten eine Matrix (als Zeichenfolge) als Eingabe für zufällige Dimensionen wie diese.

bbbbbbbbbb
bbbbbdbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb

Ihre Aufgabe ist es, den Buchstaben zu finden, der nicht mit dem Rest übereinstimmt (in diesem Fall din Zeile 2, Spalte 6), und diesen Buchstaben als Ausgabe zurückzugeben. Die Matrix besteht aus Buchstaben A-Z, a-zZeilenumbrüchen ( \nnur an Zeilenenden ) und hat Abmessungen von 5 x 5 bis 10 x 10 (25 bis 100 Buchstaben).

Es gelten Standardlücken. Dies ist eine Code-Golf-Herausforderung. Eintrag mit Code der kleinsten Bytes gewinnt.

Eingang

Die Eingabe wird über die Standardeingabe als Zeichenfolge übergeben, wenn es sich um ein Programm handelt, oder als Argument, wenn es sich um eine Funktion (oder eine ähnliche Funktion) handelt.

Ausgabe

Ein einzelne Zeichen, das die „odd“ in der Matrix ist , oder None , nil, NUL, oder die Zeichenfolge , "None"wenn es kein „odd“ Charakter.

Mehr Beispiele

AAAAAAA
AAAAAAA
AAAAAAA
AAAIAAA
AAAAAAA

Antworten: I

vvqvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv

Antworten: q

puuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu

Antworten: p

Generator

Hier ist ein in Python geschriebener Zufallsmatrixgenerator, mit dem Sie Ihr Programm testen können. Hinweis: Es besteht eine geringe Wahrscheinlichkeit, dass ein Fehler gemacht und kein ungerader Buchstabe eingegeben wird.

juniorRubyist
quelle
1
Hier ist eine wörtliche Übersetzung Ihres Python-Codes in JS.
Arnauld
1
@juniorRubyist "Entfernen des Bonus" ist nicht dasselbe wie "den Bonus obligatorisch machen". Indem Sie das bisher optionale Teil in die Anforderungen der Herausforderung verschoben haben, haben Sie einen großen Teil der vorhandenen Antworten ungültig gemacht.
Martin Ender

Antworten:

6

J , 12 10 7 Bytes

-.}./.~

Probieren Sie es online aus!

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

10-Byte-Version

-._1 1{\:~

Zischen ...

       \:~        Sort down
  _1 1{           Take the last character (which is a newline) and the second one.
-.                Remove those from the input
FrownyFrog
quelle
2
@ FrownyFrog Dies ist ein kluger Weg, um den seltsamen Charakter zu finden
Galen Ivanov
Ich kann mich nicht entscheiden, was mir besser gefällt: dieser schöne Haken oder dein Drachenwitz ...
Jonah
4

Brachylog , 8 4 Bytes

oḅ∋≠

Probieren Sie es online aus!

Erläuterung

Ich habe Brachylog noch nicht verwendet, daher ist dies möglicherweise nicht 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
quelle
Diese Verwendung von ∋≠after , um die Ergebnisse von Länge 1 zu erhalten, ist sehr klug. Sie sollten es auf jeden Fall in der Frage mit den Brachylog-Tipps veröffentlichen .
Fatalize
@Fatalize Danke, ich habe den Tipp hinzugefügt.
Zgarb
3

K (oK) , 7 6 Bytes

Lösung

*<#:'=

Probieren Sie es online aus!

Beispiel:

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

Erläuterung:

Es wurde ein etwas kürzerer Ansatz gefunden: Von rechts nach links bewertet:

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

Anmerkungen:

Obwohl ich erwarte, dass der Bonusaspekt dieser Herausforderung fallen gelassen wird, gibt diese Lösung das Zeilenumbruchzeichen zurück, \nwenn es kein ungerades Zeichen gibt:

*<#:'="vvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"\n"
Streetster
quelle
3

Prolog (SWI) , 46 Bytes

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

Probieren Sie es online aus!

Oder wenn die standardmäßige True- Ausgabe von Prolog-Abfragen nicht in Ordnung ist:

Prolog (SWI) , 48 Bytes

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

Probieren Sie es online aus!

Erläuterung

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
quelle
3

C (gcc) , 93 92 90 66 62 Bytes

Viel kürzer als eine Funktion

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

Probieren Sie es online aus!

Testcode

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

alte Version ist ein Programm

C 86 Bytes

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

Gibt das ungerade Zeichen oder nichts aus. lauf so;

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
quelle
Ich weiß nicht, dass es ziemlich fair ist, das gets()in den Testtreiber zu setzen , da es die Eingabe bereinigt, indem die \ n Zeichen für Sie entfernt werden. Das macht einige Arbeit, damit Ihre Funktion nicht an der ursprünglichen Eingabe arbeitet.
Michael Dorgan
@MichaelDorgan Es funktioniert sowohl mit der Pipeline-Eingabe aus dem Python-Skript als auch mit der Eingabe in TIO. Andere haben den Input einfach hart codiert, was nicht dem Geist der Herausforderung entsprach.
Cleblanc
3

05AB1E ,  4  2 Bytes

2 Bytes dank Adnan gespeichert

.m

Probieren Sie es online aus!

Erläuterung

.m   # push a list of the least frequent character(s) in input
Emigna
quelle
Müssen Sie die Zeilenumbrüche entfernen, da die Eingabe garantiert mindestens 5 Zeilen lang ist?
Shaggy
@ Shaggy: Nein, ich nicht. Das war mit 2x2Matrizen umzugehen. Ich habe den Teil verpasst 5x5. Vielen Dank!
Emigna
Es muss zurückkehren, nilwenn es kein "ungerades" hat, nicht wahr?
Magic Octopus Urn
@MagicOctopusUrn Dieser Teil war optional, als diese Antwort veröffentlicht wurde. Ich denke, diese Änderung macht die meisten Antworten jetzt ungültig ...
Martin Ender
2

Netzhaut , 13 Bytes

s(O`.
(.)\1+

Probieren Sie es online aus!

Erläuterung

s(O`.

Sortieren Sie alle Zeichen.

(.)\1+

Entfernen Sie alle Zeichen, die mindestens zweimal vorkommen.

Martin Ender
quelle
2

Schale , 2 Bytes

◄=

Probieren Sie es online aus!

Dies ist eine Funktion, die eine Zeichenfolge als Eingabe verwendet und ein Zeichen zurückgibt. Beim Vergleichen von Zeichen auf Gleichheit wird das Minimum der Eingabezeichenfolge verwendet (dh es wird das Zeichen zurückgegeben, das der geringsten Anzahl anderer Zeichen entspricht).

Löwe
quelle
2

C 94 Bytes

Rückkehr mit dem Zeiger. Wenn keine, kehren Sie zurück \0.

Dies führt zu Speicherlecks. Angenommen, intes sind 4 Bytes.

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

Probieren Sie es online aus!

Colera Su
quelle
@Shaggy Eigentlich weiß ich nicht, wie ich diese Regel interpretieren soll, da ich sehe, dass einige (andere) Benutzer diese Regel explizit kennen, aber dennoch solche Antworten wie diese posten.
user202729
2
@ user202729, nur weil andere es tun, heißt das nicht, dass es richtig ist;) Wenn Sie solche Lösungen entdecken, weisen Sie sie am besten darauf hin.
Shaggy
@Shaggy Nun, ich habe ausdrücklich auf die Regel hingewiesen, aber dieser Benutzer sagte "die Regel sagt ausdrücklich, dass diese gültig ist". Ich weiß nicht was ich sagen soll. | In diesem Fall erfordert die Funktion, dass das Array tauf Null gesetzt wird, bevor jedes Mal nicht das erste Mal aufgerufen wird.
user202729
@ Shaggy Danke, behoben.
Colera Su
2

Bash , 15 bis 20 Bytes

fold -1|sort|uniq -u

Probieren Sie es online aus!

Erläuterung: fold s Die Eingabe des 1Zeichens pro Zeile, sorts die Gruppierung in übereinstimmende Buchstaben und das Drucken nur der Zeilen, die unique sind.

Vielen Dank an @Nahuel Fouilleul , dass er ein Problem mit diesem Ansatz erkannt und behoben hat .

Justin Mariner
quelle
funktioniert nicht, wenn der ungerade Charakter der zweite oder der Penuitlimate ist
Nahuel Fouilleul
@NahuelFouilleul Guter Fang ... Ich bin mir nicht sicher, wie ich das im Moment beheben soll, aber ich werde es später beheben oder löschen, es sei denn, Sie hatten eine vorgeschlagene Lösung.
Justin Mariner
es kann einfach behoben werden, |sort|aber es kann eine bessere Lösung geben
Nahuel Fouilleul
fand auch eine Lösung mit grep, aber es ist längergrep -oP '^(.)((?=(?!\1).){2}|.*\K(?!\1).)'
Nahuel Fouilleul
@NahuelFouilleul Ich gehe mit dem sortFix, danke. Sie können diese grep-Antwort jedoch jederzeit als Ihre eigene Antwort veröffentlichen, wenn Sie möchten.
Justin Mariner
1

Pyth , 4 Bytes

ho/Q

Probieren Sie es hier aus!

Mr. Xcoder
quelle
.m/Qist auch 4 Bytes
Dave
@ Dave Das gibt als Liste aus, ich habe dies gewählt, weil es eleganter war ;-)
Mr. Xcoder
1

Matlab, 25 Bytes

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

Die Eingabe "a", wobei "a" nicht der Modus von "a" ist. Gibt ein leeres Array ohne Oddball aus.

Jeremiah Peek
quelle
1

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

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

Gibt eine leere Liste zurück, wenn kein ungerades Zeichen vorhanden ist.

Probieren Sie es online aus!

Erstellen Sie für jedes Zeichen cin der Matrix (als Zeichenfolge angegeben s) eine Zeichenfolge aller Zeichen s, die gleich sind, cund behalten Sie die Zeichen der Länge 1 bei.

Nimi
quelle
1

JavaScript (ES6), 37 Byte

Gibt zurück, nullwenn kein ungerader Buchstabe vorhanden ist.

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

Testfälle

Arnauld
quelle
1

Japt , 6 Bytes

Nimmt die Eingabe als mehrzeilige Zeichenfolge und gibt eine einzelne Zeichenfolge oder eine leere Zeichenfolge aus, wenn es keine Lösung gibt.

k@èX É

Versuch es


Erläuterung

Entfernen Sie die Zeichen, die truey ( k) zurückgeben, wenn sie eine Funktion ( @) durchlaufen , die èdie Vorkommen des aktuellen Elements ( X) in der Eingabe zählt ( ) und 1 ( É) subtrahiert .

Zottelig
quelle
1

Common Lisp, 47 Bytes

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

Probieren Sie es online aus!

Gibt den ungeraden Buchstaben oder NIL zurück, wenn er nicht vorhanden ist.

Renzo
quelle
1

Gelee , 4 Bytes

ċ@ÐṂ

Probieren Sie es online aus!

Rückgabe \n(ein einzelner Zeilenumbruch), falls kein ungerades Zeichen vorhanden ist. Offensichtlich \nist kein druckbares Zeichen.

Zufälligerweise ist dies genau der gleiche Algorithmus wie die Antwort von Mr.Xcoder Python. (Ich habe es mir unabhängig ausgedacht)

Erläuterung:

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

Das funktioniert, weil in einer m×nMatrix:

  • Wenn es ein ungerades Zeichen gibt: Es gibt m-1Zeilenumbrüche, 1 ungerades Zeichen und ein m×n-1normales Zeichen und 1 < m-1 < m×n-1weil 5 ≤ m, n ≤ 10.
  • Wenn es kein ungerades Zeichen gibt: Es gibt m-1Zeilenumbrüche und m×nnormale Zeichen und m-1 < m×n.
user202729
quelle
1

C # (.NET Core) , 54 Byte

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

Probieren Sie es online aus!

Wakawakamush
quelle
Du hast recht, meine Antwort war falsch. Ich habe es gelöscht. Sie vermissen jedoch die 18 Bytes in der usingAnweisung in der Byteanzahl.
Raznagul
1

C (gcc) , 91 86 82 79 71 Bytes

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

Probieren Sie es online aus!

  • Danke an Gastropner für das xor und? Tricks (-3 Bytes)
  • Die Vergleichsversion wurde überarbeitet, um Fehler zu beheben, und Gastropner- Magie aus Kommentaren verwendet.

Erläuterung:

Vergleichen Sie das aktuelle und das vorherige Zeichen, während Sie Zeilenumbrüche überspringen. Wenn anders, vergleiche mit dem nächsten Zeichen. Dies sagt uns, ob wir aktuelles oder vorheriges Zeichen zurückgeben. Die Funktion gibt den "ungeraden" Zeichenwert zurück, falls vorhanden, oder 0, wenn das Array nicht ungerade ist. Wir kommen mit dem "nächsten" Char-Check davon, weil vor dem \0Char immer eine neue Zeile steht . Wenn es kein ungerades Zeichen gibt, geben wir die \ 0 von der for-Schleife zurück.


Älterer, sexier xor Code Erläuterung:

Erstellen Sie eine laufende xor-Maske aus den nächsten 3 Zeichenfolgenwerten. Wenn sie alle gleich sind, ist der Wert gleich einem der drei. Wenn sie unterschiedlich sind, heben sich die beiden identischen auf und lassen das Einzigartige zurück.

Muss / n vor dem xor faktorisieren oder es wird chaotisch. Außerdem müssen 2 Zeichen auf Ungleichung überprüft werden, falls s [0] der ungerade Wert ist. Dies kostet das extra || prüfen.

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
quelle
79 mit ein paar Änderungen. Die Fall-Through-Rendite stimmt nicht mit meinem Compiler überein, daher nur auf TIO getestet: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
Für den Mist, den ich schreibe, bleibe ich bei TIO. Vielen Dank!
Michael Dorgan
Das Neuanordnen einiger Ausdrücke ermöglicht eine weitere -2 für 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;} Ihr Siegerpferd ist jedoch das andere, wenn Sie ein wenig damit v;f(char*s){for(v=-1;*++s==10?s+=2,v--:0,*s;v=0)if(*s^s[-1])return s[v];}
herumspielen
Ja, aber der XOR scheint so sexy zu sein. :)
Michael Dorgan
Schlagen Sie s+=*++s-10?0:2statt*++s==10?s+=2:0
Deckenkatze
0

Alice , 16 * 75% = 12 Bytes

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

Probieren Sie es online aus!

JabberwockyWird ausgegeben, wenn kein doppeltes Zeichen vorhanden ist.

Erläuterung

/...@
\.../

Dies ist ein Framework für lineare Programme, die vollständig im Ordinalmodus (String-Verarbeitungsmodus) arbeiten. Der eigentliche Code wird im Zickzack ausgeführt und entfaltet sich zu:

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".

Stattdessen &-könnten wir auch ey(Transliteration in eine leere Zeichenfolge) verwenden. Wenn Sie alternativ ein weiteres Zeichen für die Stapelmanipulation ausgeben, können Sie auch die Eingabe deduplizieren, mit der wir die unerwünschten Zeichen entfernen können N, aber es ist immer noch dieselbe Byteanzahl:

i.D.QXN.n*o@

Alice , 13 Bytes

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

Probieren Sie es online aus!

Dies ist die Lösung ohne den Bonus, es fehlt einfach die .n*.

Martin Ender
quelle
0

APL + WIN, 16 Bytes

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

Fordert zur Bildschirmeingabe auf und gibt entweder einen ungeraden Buchstaben oder nichts aus, wenn kein ungerader Buchstabe vorhanden ist

Graham
quelle
a/⍨1=+/a∘.=a←,⎕für ein Byte
Uriel
@ Uriel Danke, aber ich fürchte, der Operator ⍨ ist in meiner alten APL + WIN Version 5 nicht verfügbar :(
Graham
0

PowerShell , 39 Byte

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

Probieren Sie es online aus!

Nimmt die Eingabe als Zeichenfolge mit Zeilenumbrüchen (wie in der Herausforderung angegeben) und konvertiert sie in ein char-array. Wir dann Group-Objectdie Zeichen, so dass Zeichen nach ihren Namen gruppiert werden, dann sortbasierend auf der cAnzahl. Dies stellt sicher, dass der einsame Charakter an erster Stelle steht, also nehmen wir den [0]Index und geben ihn aus .Name.

Wenn Newline für "nichts" akzeptabel ist, qualifiziert sich dies für den Bonus.

AdmBorkBork
quelle
Ich hatte gehofft sort c*)[0], verkürzt werden zu können, aber ich hatte die gleiche Anzahl von Bytes ? c* -eq 1).
root
kann durch Entfernen der doppelten Anführungszeichen verkürzt werden $args. Dies ist auch genauer, ([char[]]$args|group|? c* -eq 1).Nameda es genau zurückkehrt, nullwenn kein ungerades Zeichen vorhanden ist (anstelle einer neuen Zeile). In Bezug auf Bytes bringt Sie dies jedoch immer noch nicht unter 37.
cogumel0
@ cogumel0 Läuft nicht ohne doppelte Anführungszeichen.
Wurzel
@root du bist richtig. Jedoch eine der Anforderungen passieren (ein einzelnes Zeichen, das die „odd“ in der Matrix ist , oder None, nil, NUL, oder die Zeichenfolge , "None"wenn es kein „odd“ Charakter ist.) Es ist noch geändert werden soll. Newline ist nicht Teil der akzeptablen Antworten.
Cogumel0
@ cogumel0 Ah, die Herausforderung wurde geändert, seit ich meine Antwort gepostet habe. Das "Keine / Null / Was auch immer" war früher nur ein Bonus und nicht obligatorisch. Ich werde meine Antwort so lassen, wie sie ist.
AdmBorkBork
0

Perl 6 ,  27  24 -25% = 18 Bytes

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

Probier es aus

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

Probier es aus

Dies gibt einen undefinierten Wert zurück, wenn eine Eingabe gegeben wird, die kein ungerades Zeichen enthält.

Erweitert:

{  # 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
quelle
0

Brainfuck, 125 Bytes

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

Probieren Sie es online aus

Druckt den Buchstaben der Matrix, wenn es keinen ungeraden gibt

Scherzen
quelle
0

Java 8, 85 Bytes

Dies ist ein Lambda von Stringbis String(zB Function<String, String>). Es ist im Wesentlichen eine Kopie von Lucas Lösung , aber ich habe die Sortierung der Zeichenfolgen etwas reduziert.

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

Probieren Sie es online aus

Jakob
quelle