Finde den fehlenden Brief

27

Richtlinien

Aufgabe

Schreiben Sie eine Methode, die ein Array von aufeinanderfolgenden (aufsteigenden) Buchstaben als Eingabe verwendet und den fehlenden Buchstaben im Array zurückgibt (Listen in einigen Sprachen).


Regeln

  • Das ist Code Golf, also gewinnt die kürzeste Antwort in Bytes!
  • Sie erhalten immer ein gültiges Array
  • Es wird immer genau ein Buchstabe fehlen
  • Die Länge des Arrays beträgt immer mindestens 2.
  • Das Array enthält immer nur Buchstaben in Groß- oder Kleinbuchstaben.
  • Sie müssen in der gleichen Schreibweise (Groß- oder Kleinschreibung) ausgeben wie die Eingabe
  • Das Array wird immer nur einen Buchstaben auf einmal gehen (überspringen des fehlenden Buchstabens)
  • Die Array-Länge liegt zwischen 2 und 25
  • Das erste oder letzte Element des Arrays wird niemals fehlen

Beispiele

['a','b','c','d','f'] -> 'e'

['O','Q','R','S'] -> 'P'

['x','z'] -> 'y'

['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','w','x','y','z'] -> 'v'

Amorris
quelle
Kann ich stattdessen eine Schnur nehmen?
Undichte Nonne
@LeakyNun Strings sind Arrays von Zeichen, also ja.
Amorris
1
Kann die Ausgabe ein Array sein , die fehlenden Zeichen enthält (zB: für die Eingabe ['a','b','c','d','f','g'], Ausgabe ['e']?, Wenn das den Code kürzer macht
Herr Xcoder
1
@ Mr.Xcoder Eine Zeichenfolge ist nur eine Reihe von Zeichen, also ja
Amorris
2
Regel vier ist einfach eine Teilmenge von Regel acht und kann entfernt werden (zumindest, wenn Sie das Wort "inklusive" am Ende von Regel acht einfügen).
NH.

Antworten:

11

C # (.NET Core) , 48 47 46 Byte, Eingabe als Zeichenarray

s=>{for(int i=0;s[++i]==++s[0];);return s[0];}

Probieren Sie es online!

Erläuterung: Das erste Element im Array wird inkrementiert, und es wird ein Zeiger angezeigt, der die folgenden Elemente durchläuft. Wenn sowohl das erste als auch das aktuelle Element unterschiedlich sind, wird das erste Element zurückgegeben.

C # (.NET Core) , 58 56 50 Byte, Eingabe als Zeichenfolge

s=>{var c=s[0];while(s.IndexOf(++c)>=0);return c;}

Probieren Sie es online!

Vorherige 58-Byte-Lösung (im ersten Kommentar angegeben):

s=>{for(int i=1;;i++)if(s[i]-s[0]>i)return(char)(s[i]-1);}

Algorithmen mit System.Linq

Die folgenden Algorithmen müssen die Byteanzahl um using System.Linq;18 Byte erhöhen und sind daher länger.

Mir hat dieser gefallen (52 + 18 Bytes):

s=>{int i=0;return(char)(s.First(c=>c-s[0]>i++)-1);}

Und Sie haben auch eine einzeilige (45 + 18) Byte Lösung:

s=>(char)(s.Where((c,i)=>c-s[0]>i).First()-1)

Und eine sehr clevere (37 + 18) Byte Lösung mit freundlicher Genehmigung von Ed'ka:

s=>s.Select(e=>++e).Except(s).First()
Charlie
quelle
1
Wird dies nicht fehlschlagen, wenn nicht alle Codepfade einen Wert zurückgeben? Aber +1 für den Vergleich mit s[i]-s[0], ziemlich schlau!
TheLethalCoder
@TheLethalCoder Es wird kein Fehler auftreten, da die forSchleife keine Stoppbedingung hat. Sie wird also so lange iterieren, bis die ifBedingung den Wert "0" ergibt true.
Charlie
1
Sie können 8 Bytes wie folgt speichern: a=>{int i=0;for(;a[++i]-a[0]<=i;);return--a[i];}(wenn Sie die Eingabe als übernehmen char[]). Übrigens nicht danke an mich, danke an @Nevays Kommentar zu meiner Java 8 Antwort .
Kevin Cruijssen
1
@KevinCruijssen hat eine Möglichkeit gefunden, zwei weitere Bytes zu speichern, indem die Eingabe als Zeichenarray verwendet wird.
Charlie
1
Kürzere Linq-Version:s=>s.Select(e=>++e).Except(s).First()
Ed'ka
8

Alice , 10 Bytes

/X.
\ior@/

Probieren Sie es online!

Erläuterung

Dies ist nur ein Framework für lineare Programme, die vollständig im Ordinal-Modus (Zeichenfolgenverarbeitung) ausgeführt werden:

/...
\.../

Der tatsächliche lineare Code lautet dann:

i.rXo@

Welches tut:

i   Read all input.
.   Duplicate.
r   Range expansion. If adjacent letters don't have adjacent code points, the
    intermediate code points are filled in between them. E.g. "ae" would turn
    into "abcde". For the inputs in this challenge, this will simply insert
    the missing letter.
X   Symmetric set difference. Drops all the letters that appear in both strings,
    i.e. everything except the one that was inserted by the range expansion.
o   Output the result.
@   Terminate the program.
Martin Ender
quelle
7

Haskell , 33-30 Bytes

f a=until(`notElem`a)succ$a!!0

Probieren Sie es online!

Anders Kaseorg
quelle
untilspeichert ein Byte:f(a:b)=until(`notElem`a:b)succ a
xnor
@xnor 3 Bytes eigentlich. Vielen Dank!
Anders Kaseorg
7

Java 8, 70 57 56 48 46 Bytes

a->{for(int i=0;++a[0]==a[++i];);return a[0];}

-14 (70 → 56) und -2 (48 → 46) Bytes dank @CarlosAlejo .
-8 (56 → 48) Bytes dank @Nevay .

Erläuterung:

Probieren Sie es hier aus.

a->{            // Method with char-array parameter and char return-type
  for(int i=0;  //  Start index-integer at 0 and loop as long as
    ++a[0]      //   the previous character + 1 (by modifying the character at index 0)
    ==a[++i];   //   equals the next character (by raising the index by 1 before checking)
  );            //  End of loop
  return a[0];  //  Return the now modified character at index 0 in the array
}               // End of method
Kevin Cruijssen
quelle
1
Sie können eine implizite Umwandlung anstelle einer expliziten Umwandlung verwenden, um 8 Bytes zu sparen a->{int i=0;for(;a[++i]-a[0]<=i;);return--a[i];}.
Nevay
6

C (gcc) , 3335 36 48 60 Bytes

Alle Optimierungen sollten deaktiviert sein und nur auf 32-Bit-GCC.

f(char*v){v=*v+++1-*v?*v-1:f(v);}

Eingabe als String übernehmen.

Probieren Sie es online!

Keyu Gan
quelle
2
Msgstr "Alle Optimierungen sollten deaktiviert sein und nur auf 32 - Bit - GCC." Dies funktioniert nicht (scheint nur aufgrund von UB zu funktionieren)
siehe
Ich würde sagen, foo(char*a){return*a+1==a[1]?foo(a+1):++*a;}ist ziemlich gut; Nur 1 foo(char*a){while(*a+1==a[1])a++;return++*a;}
Zeichen
@sehe konstantes undefiniertes Verhalten wird für PPCG
Keyu Gan
5

Python 3 , 74 62 58 44 40 Bytes

-12 Bytes dank Erik dem Outgolfer. -18 Bytes dank Leaky Nun. -4 Bytes dank musicman523.

Nimmt die Eingabe als Bytestring.

lambda s:chr(*{*range(s[0],s[-1])}-{*s})

Probieren Sie es online!

Eine andere coole Lösung:

lambda s:chr(*{*range(*s[::~-len(s)])}-{*s})
total menschlich
quelle
1
.difference({*s})->-{*s}
Erik der Outgolfer
1
60 Bytes
Undichte Nonne
1
44 bytes with bytestring
Undichte Nonne
1
2 weitere Bytes
musicman523
1
Ihre Lösung ist das, wonach ich
gesucht habe,
4

Mathematica, 46 Bytes

Min@Complement[CharacterRange@@#[[{1,-1}]],#]&
J42161217
quelle
Ich glaube, das Min@Complement[CharacterRange@@#[[{1,-1}]],#]&würde ein Byte sparen.
LegionMammal978
@ LegionMammal978 eigentlich 2!
J42161217
3

JavaScript (ES6), 70 Byte

Eingabe als Zeichenfeld

(a,p)=>a.some(c=>(q=p+1,p=c.charCodeAt(),p>q))&&String.fromCharCode(q)

Weniger golfen

a=>{
  p = undefined;
  for(i = 0; c = a[i]; i++)
  {
    q = p+1
    p = c.charCodeAt()
    if (p>q)
      return String.fromCharCode(q)
  }
}

Prüfung

F=(a,p)=>a.some(c=>(q=p+1,p=c.charCodeAt(),p>q))&&String.fromCharCode(q)

function update() {
  var a0=A0.value.charCodeAt()
  var a1=A1.value.charCodeAt()
  if (a1>a0) {
    var r = [...Array(a1-a0+1)]
      .map((x,i)=>String.fromCharCode(a0+i))
      .filter(x => x != AX.value)
    I.textContent = r.join('') + " => " + F(r)
  }
  else {
    I.textContent=''
  }
}

update()
input { width: 1em }
Range from <input id=A0 value='O' pattern='[a-zA-Z]' length=1 oninput='update()'>
to <input id=A1 value='T' pattern='[a-zA-Z]' length=1 oninput='update()'>
excluding <input id=AX value='Q' pattern='[a-zA-Z]' length=1 oninput='update()'>
<pre id=I></pre>

edc65
quelle
3

PHP> = 7.1, 46 Bytes

Eingabe als String übernehmen

<?=trim(join(range(($a=$argn)[0],$a[-1])),$a);

PHP Sandbox Online

Jörg Hülsermann
quelle
3

Retina , 33 25 Bytes

$
¶$_
T`p`_p`.*$
D`.
!`.$

Probieren Sie es online! Funktioniert mit jedem Bereich von ASCII-Zeichen. Bearbeiten: 8 Bytes dank @MartinEnder gespeichert. Erläuterung: Die erste Stufe dupliziert die Eingabe. Die Sekunde verringert alle Zeichen in der Kopie um 1 Codepunkt. Die dritte Stufe löscht alle Zeichen in der Kopie, die noch im Original vorhanden sind. Dies belässt nur die ursprüngliche Eingabe, das Zeichen vor dem ersten Zeichen der ursprünglichen Eingabe und das fehlende Zeichen. Die letzte Stufe entspricht dann nur dem fehlenden Zeichen.

Neil
quelle
Hier ist 25, die gleiche Grundidee mit: tio.run/##K0otycxL/P9fhevQNpV4rpCEgoT4ggQ9LRUulwQ9LsUEPZX///... (. Ich bin Dekrementieren der zweiten Linie , weil das ein Byte speichert und dann zu finden bin ich die einzigartige char Deduplizierung verwenden)
Martin Ender
@MartinEnder Deduplication ist genau das, was ich schon immer wollte, und ich habe bereits vergessen, dass Retina es hat, seufz ... (Ich weiß, dass das Inkrementieren der ersten Zeile ein Byte mehr kostet als das Dekrementieren der zweiten Zeile, aber es hat den regulären Ausdruck kürzer gemacht.)
Neil
3

SWI-Prolog, 124 Bytes

m([H|T]):-n(H,N),c(T,N),!,m(T).
n(I,N):-o(I,C),D is C+1,o(N,D).
c([N|_],N).
c(_,N):-print(N),!,fail.
o(C,O):-char_code(C,O).

Beispiele:

?- m(['a','b','c','d','f']).
e
false.

?- m(['O','Q','R','S']).
'P'
false.

?- m(['x','z']).
y
false.

?- m(['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','w','x','y','z']).
v
false.

Kleine Erklärung:

Dies mist die "Haupt" -Prozedur, die ndas nächste erwartete Zeichen in der Liste erzeugt. Der cVergleich funktioniert - wenn die Erwartung mit dem nächsten Element übereinstimmt, fahren Sie fort, oder drucken Sie das erwartete Zeichen aus und springen Sie aus dem Fenster.

Jan Drozen
quelle
1
Kürzer als fail: 0=1.
Mat
3

C ++ 14, Standardbibliothek, generischer Containertyp ( 87-86 Byte)

[](auto a){return++*adjacent_find(begin(a),end(a),[](auto a,auto b){return a+1!=b;});}

Containertyp aus Namensraum ::stdwird davon ausgegangen (zB std::string, std::listoder std::vector. Andernfalls using namespace std;oder ähnlich würde angenommen werden.

Dank @Ven, mit ein wenig Präprozessor-Hacking, können Sie es auf 82 Bytes (1 Newline) bringen

#define x [](auto a,int b=0){return++
x *adjacent_find(begin(a),end(a),x a!=b;});}

Seht es euch an Live On Coliru

C ++ 14 keine Standardbibliothek (immer noch generisch, 64 63 Bytes)

[](auto& a){auto p=*begin(a);for(auto c:a)if(c!=p++)return--p;}

Auch hier muss die Namenssuche nur unterstützt werden, wenn der Containertyp nicht aus dem Namespace stammt ::std(oder diesem zugeordnet ist).

Live On Colirufür std::stringzB

Live On Colirufür char const[]zB

sehe
quelle
Sie müssen ein Leerzeichen zwischen dem durchgestrichenen und dem nächsten Text einfügen.
CJ Dennis
@CJDennis Fertig. Durch die Art und Weise, momentane rep (2469) ist eine schöne Zahl (3 * 823 ist und auch optisch gekoppelt , wie (24) , (69) , welche (2 2 2 3) (3 23))
sähe
2

Kohle , 18 Bytes

Fγ¿¬∨∨‹ι⌊θ›ι⌈θ№θιι

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Übernimmt die Eingabe als Zeichenfolge. Funktioniert mit nahezu zusammenhängenden Folgen von ASCII-Zeichen.

Neil
quelle
2

104 Bytes

using System.Linq;a=>(char)Enumerable.Range(a.Min(),a.Max()-a.Min()).Except(a.Select(c=>(int)c)).First()

Voll / Formatierte Version:

using System.Linq;

namespace System
{
    class P
    {
        static void Main()
        {
            Func<char[], char> f = a =>
                (char)Enumerable.Range(a.Min(), a.Max() - a.Min())
                                .Except(a.Select(c=>(int)c))
                                .First();

            Console.WriteLine(f(new[] { 'a', 'b', 'c', 'd', 'f' }));

            Console.ReadLine();
        }
    }
}
TheLethalCoder
quelle
Eine sehr clevere Linq-Version von Ed'ka :s=>s.Select(e=>++e).Except(s).First()
Charlie
@CarlosAlejo Ich habe gesehen, dass du es zu deiner Antwort hinzugefügt hast, damit ich meine nicht aktualisiere, aber ja, es ist sehr clever. Viel kürzer als meine Version.
TheLethalCoder
2

MATL, 8 7 Bytes

1 Byte gespart dank @Luis

tdqf)Qc

Probieren Sie es bei MATL Online aus

Erläuterung

      % Implicitly grab the input as a string
t     % Duplicate the string
d     % Compute the differences between successive characters
q     % Subtract 1 from each element
f     % Get the locations of all non-zero characters (1-based index)
)     % Extract that character from the string
Q     % Add one to get the next character (the missing one)
c     % Convert to character and display
Suever
quelle
@ LuisMendo Super, danke!
Suever
2

Excel, 110 + 2 = 112 Bytes

=CHAR(CODE(LEFT(A1))-1+MATCH(0,IFERROR(FIND(CHAR(ROW(INDIRECT(CODE(LEFT(A1))&":"&CODE(RIGHT(A1))))),A1),0),0))

Muss als Matrixformel ( Ctrl+ Shift+ Enter) eingegeben werden, die { }an jedem Ende geschweifte Klammern und zwei Bytes hinzufügt. Die Eingabe erfolgt als String in A1, was pro OP in Ordnung ist .

Dies ist bei weitem nicht die kürzeste Antwort (Excel ist selten), aber ich mag es zu sehen, ob es getan werden kann.

Ingenieur Toast
quelle
2

CJam , 6 Bytes (Vollprogramm) / 7 Bytes (Codeblock)

q),^W=

Probieren Sie es online!

Dies ist ein vollständiges CJam-Programm, das die Eingabezeichenfolge von der Standardeingabe liest und den fehlenden Buchstaben an die Standardausgabe ausgibt. CJam hat eigentlich keine "Methoden", was die Herausforderung verlangt, aber das Nächste wäre wahrscheinlich ein ausführbarer Codeblock, wie dieser:

{),^W=}

Probieren Sie es online!

Wenn dieser Codeblock ausgewertet wird, nimmt er die Eingabe als Zeichenfolge (dh als Array von Zeichen) auf dem Stapel und gibt das fehlende Zeichen auch auf dem Stapel zurück.


Erläuterung:q Liest im vollständigen Programm die Eingabezeichenfolge und platziert sie auf dem Stapel. )Anschließend wird das letzte Zeichen der Eingabezeichenfolge entfernt und der Bereichsoperator ,wandelt es in ein Array um, das alle Zeichen mit darunter liegenden Codepunkten enthält (einschließlich aller Buchstaben davor im Alphabet). Wenn also beispielsweise die Eingabe wäre cdfgh, dann ),würde der Stapel die Zeichenfolgen enthalten cdfg(dh die Eingabe mit dem letzten entfernten Buchstaben) und ...abcdefgwobei ...für eine Reihe von Zeichen mit unten stehenden ASCII-Codes stehta (dh alle Zeichen unter der zuletzt entfernten Eingabe) Brief).

Der Unterschiedsoperator für symmetrische Mengen ^kombiniert diese Zeichenfolgen zu einer einzigen Zeichenfolge, die genau die Zeichen enthält, die in einer der Zeichenfolgen, jedoch nicht in beiden, vorkommen. Es behält die Reihenfolge bei, in der die Zeichen in den Zeichenfolgen angezeigt werden. Für die Beispieleingabe lautet cdfgdas Ergebnis also "after ),^" ...abe, wobei ...wiederum eine Reihe von Zeichen mit den folgenden ASCII-Codes angegeben wird a. Zum Schluss W=extrahieren Sie einfach das letzte Zeichen dieser Zeichenfolge. Dies ist genau das fehlende Zeichen e, das wir suchen wollten (und verwerfen den Rest). Wenn das Programm endet, druckt der CJam-Interpreter implizit den Inhalt des Stapels aus.


Bonus: GolfScript , 6 Bytes (volles Programm)

),^-1>

Probieren Sie es online!

Es stellt sich heraus, dass fast derselbe Code auch in GolfScript funktioniert. Wir sparen ein Byte in der Vollversion des Programms aufgrund der impliziten Eingabe von GolfScript, verlieren aber ein Byte, weil im Gegensatz zu CJamW keine handliche Variable mit einem Buchstaben hat, die auf -1 initialisiert ist.

Außerdem hat CJam separate Ganzzahl- und Zeichentypen (und Strings sind nur Arrays, die Zeichen enthalten), während GolfScript nur einen einzigen Ganzzahlentyp hat (und einen speziellen String-Typ, der sich etwas anders verhält als normale Arrays). Das Ergebnis all dessen ist, dass, wenn der GolfScript-Interpreter den tatsächlich fehlenden Buchstaben anstelle der ASCII-Codenummer ausdrucken soll, statt nur des Zeichens selbst eine einzelne Zeichenfolge zurückgegeben werden muss. Glücklicherweise muss für diese Änderung nur der Indexierungsoperator durch den Operator =für die linke Kürzung des Arrays / Strings ersetzt werden >.

Dank des impliziten I / O von GolfScript kann der obige Code natürlich auch als Snippet verwendet werden, das eine Zeichenfolge aus dem Stapel liest und eine Zeichenfolge mit einem einzelnen Buchstaben zurückgibt, die den fehlenden Buchstaben enthält. Oder vielmehr ist jedes Snippet, das eine einzelne Zeichenfolge auf dem Stapel als Argument verwendet und dessen Ausgabe als druckbare Zeichenfolge auf dem Stapel zurückgibt, auch ein vollständiges GolfScript-Programm.

Ilmari Karonen
quelle
6
Codeausschnitte sind standardmäßig nicht zulässig . nur funktionen und volle programme sind. Also brauchst du wahrscheinlich das q(Programm) oder {...}(Block). +1 für den Ansatz aber
Luis Mendo
Das ist sehr schlau!
Esolanging Fruit
2

Schale , 6 Bytes

→S-(ḣ→

Probieren Sie es online!

Diese Funktion verwendet eine Zeichenfolge (Liste von Zeichen) als Eingabe und gibt ein Zeichen als Ausgabe zurück.

Erläuterung

→S-(ḣ→
    ḣ→    Get the list of all characters from the null byte to the last character of the input
 S-       Subtract the input from this list
→         Get the last element of the result
Löwe
quelle
2

Python 2 - 76 Bytes

Verliert gegenüber der bestehenden Python 2-Lösung, ist aber ein etwas anderer Ansatz, sodass ich dachte, ich würde es trotzdem posten:

lambda c:[chr(x)for x in range(ord(c[0]),ord(c[0]+26)if chr(x)not in c][0]
LangeHaare
quelle
2

8. 99 Bytes

Begründung

Wenn der Abstand zwischen den Buchstaben größer als zwei ist, fehlt ein Buchstabe. Die Buchstabenentfernung wird ermittelt, indem die Differenz zwischen den ASCII-Codes der einzelnen Buchstaben berechnet wird.

Code

: f ' nip s:each repeat over n:- 2 n:= if n:1+ "" swap s:+ . reset 1 then depth n:1- while! reset ;

Ungolfed-Version

: f \ s -- c 
  ' nip s:each    \ convert each letter into its ASCII code and put them on stack
  repeat
    over
    n:- 2 n:=     \ check if there is a missing letter 
    if            
      n:1+        \ compute the ASCII code of missing letter
      "" swap s:+ \ convert ASCII code into printable character
      .           \ print out the missing letter
      reset 1     \ set condition to exit from while!
    then
    depth n:1-    \ verify if there are letters to check
  while!          
  reset           \ clean stack
;

Verwendung und Beispiele

ok> "abcdf" f
e
ok> "OQRS" f
P
ok> "xz" f
y
ok> "abcdefghijklmnopqrstuwxyz" f
v
ok> "ab" f

ok> "def" f

ok>
Chaos Manor
quelle
2

JavaScript (ES6), 64 Byte

Übernimmt die Eingabe als Zeichenfolge.

s=>(g=p=>(c=String.fromCharCode(n++))<s[p]?p?c:g(p):g(p+1))(n=0)

Wie?

  • Initialisierung: Wir beginnen mit n = 0 und p = 0 und rufen die rekursive Funktion g () auf .

    g = p =>                                   // given p
      (c = String.fromCharCode(n++)) < s[p] ?  // if the next char. c is not equal to s[p]:
        p ?                                    //   if p is not equal to zero:
          c                                    //     step #3
        :                                      //   else:
          g(p)                                 //     step #1
      :                                        // else:
        g(p + 1)                               //   step #2
  • Schritt 1: Wir inkrementieren n, bis c = String.fromCharCode(n)das erste Zeichen der Eingabezeichenfolge s [0] entspricht .

  • Schritt 2: Jetzt, da wir synchronisiert sind, erhöhen wir sowohl n als auch p gleichzeitig, bis c = String.fromCharCode(n)nicht mehr s [p] entspricht .

  • Schritt 3: Wir geben c : das erwartete Zeichen zurück, das nicht gefunden wurde.

Testfälle

Arnauld
quelle
1

J, 20 Bytes

{&a.>:I.1 0 1&E.a.e.
  • a.e. Boolesche Maske für die Eingabebuchstaben im ASCII-Zeichensatz
  • 1 0 1&E.neue Boolesche Maske, die angibt, ob die Sequenz 101an diesem Index beginnt, dh wo eine "Sprung" -Sequenz beginnt
  • I. der Index dieser Übereinstimmung, dh das Zeichen vor dem übersprungenen
  • >: Inkrementiere um 1, dh den Index des übersprungenen Zeichens innerhalb des ASCII-Zeichensatzes
  • {&a. Wählen Sie diesen Index aus dem ASCII-Zeichensatz aus, dh geben Sie das übersprungene Zeichen zurück

Probieren Sie es online!

Jona
quelle
Das sieht für mich wie ein Ausschnitt aus.
Adám
@ Adám Es ist in einem stillschweigenden (punktfreien) Stil geschrieben, der meiner Meinung nach als "funktionsähnlich" im Gegensatz zu einem Snippet gilt. Soweit ich das beurteilen kann, ist es kein Schnipsel mehr als Ihre APL-Lösung (aber ich kenne Dyalog nicht, nehmen Sie, was ich sage, mit einem Körnchen Salz).
zgrep
@ Adám ja, in dem Sinne, dass es keiner Variablen zugeordnet werden kann, sondern die Eingabe auf der rechten Seite übernimmt. ist das nicht legal? Ich fragte irgendwo danach und mir wurde gesagt, dass es in Ordnung sei
Jonah
Mein Verständnis für APL / J / K ist, dass der Code in der Lage sein muss, sich in einem Namen zu befinden, sei es durch Zuweisung oder als Körper eines expliziten Verbs / einer expliziten Funktion (allerdings muss die explizite Form dann auch explizite Eingaben haben). Snippet ist Code, der Werte in Variablen annimmt und / oder in eine Zeile eingefügt werden muss, aber nicht für sich alleine stehen kann.
Adám,
@zgrep Nein, dieser Code ist explizit (nicht stillschweigend), aber es fehlt der Verweis auf sein Argument ganz rechts. Meine APL-Funktion ist eine vollständige implizite Funktion, die zugewiesen oder in eine Klammer gesetzt werden kann.
Adám
1

ES6, 125 Bytes:

(a=>((s,f)=>(r=(i,b)=>a[i]?r(i+1,b||(s[f](i)-s[f](i-1)-1&&String.fromCharCode(s[f](i-1)+1))):b)(1,0))(a.join(""),"charCodeAt"))

http://jsbin.com/vasoqidawe/edit?console

Die zurückgegebene Funktion muss mit einem Array aufgerufen werden

(["a","c"])

Man könnte weitere 9 Bytes sparen, indem man .join ("") entfernt und einen String übergibt:

("ac")

ES6, 108 Bytes:

(a=>((s,f,o)=>(a.find((_,i)=>(o?++o:o=s[f](i))!==s[f](i)),String.fromCharCode(o)))(a.join(""),'charCodeAt'),0))

http://jsbin.com/tudiribiye/edit?console

Jonas Wilms
quelle
1
binden ??? im Code Golf?
Edc65
@ edc65 was ist daran falsch? (Entschuldigung, wenn dies n00b ist, aber das ist mein erstes Golf :))
Jonas Wilms
@ edc65 aber du hast wahrscheinlich recht und entfernst es gespeichert 4 Bytes ...
Jonas Wilms
a.join("")könnte seina.join``
user2428118
1

Common Lisp, 88 Bytes

(lambda(s)(loop as(x y)on s if(>(#1=char-code y)(1+(#1#x)))return(code-char(1+(#1#x)))))

Probieren Sie es online!

Renzo
quelle
1

Python 2 , 69 Bytes

lambda a:chr((ord(a[0])+ord(a[-1]))*-~len(a)/2-sum(ord(x)for x in a))

Probieren Sie es online!

Einige Erklärungen Da wir das erste und das letzte Element der Liste kennen, können wir leicht die Summe der Codes aller Zeichen in der Liste berechnen list + the missed char(unter Verwendung von zusammenfassenden Formeln der arithmetischen Progression ). Die Differenz zwischen dieser Summe und der Summe der Codes aller Zeichen in listergibt den Code des fehlenden Buchstabens.

mdahmoune
quelle
1

05AB1E , 9 7 Bytes

ǤÝsKçθ

Probieren Sie es online!

Erik der Outgolfer
quelle
Ich gehe davon aus, 2dass wir den gleichen Algorithmus verwenden, obwohl ich 05AB1E kaum kenne :)
Undichte Nonne
@LeakyNun Nun, ich dachte auch an den Algorithmus ...
Erik the Outgolfer
Ich habe gerade meinen Algorithmus geändert.
Undichte Nonne
@LeakyNun In 05AB1E wäre es sowieso länger.
Erik der Outgolfer
Ich habe gerade an einen anderen Algorithmus gedacht, der 2 enthält , könnte Ihnen gehören ...
Undichte Nonne
1

APL (Dyalog) , 17 Bytes

(⊃⎕AV/⍨∨\∧~)⎕AV∘∊

Probieren Sie es online!

⎕AV∘∊ Boolean: Jedes Zeichen im A tomic V ector-Member (Zeichensatz) des Arguments?

() Wenden folgende stillschweigende Funktion an:

 das erste Element von

⎕AV der A tomic V ector (der Zeichensatz)

/⍨ welche

∨\ folgt der Initiale (Mitglied des Arguments)

 aber

~ ist nicht (ein Mitglied des Arguments)

Adam
quelle