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.


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

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.

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"

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

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

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

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

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


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!



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


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

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.


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.


1

JavaScript (ES6), 37 Byte

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

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

Testfälle


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 .



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.


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

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



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


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.


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
}

0

Brainfuck, 125 Bytes

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

Probieren Sie es online aus

Druckt den Buchstaben der Matrix, wenn es keinen ungeraden gibt


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.