Znajdź brakujący list

27

Wytyczne

Zadanie

Napisz metodę, która pobiera tablicę kolejnych (rosnących) liter jako dane wejściowe i zwraca brakującą literę w tablicy (listy w niektórych językach).


Zasady

  • To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach!
  • Zawsze otrzymasz prawidłową tablicę
  • Zawsze brakuje dokładnie jednej litery
  • Długość tablicy zawsze będzie wynosić co najmniej 2.
  • Tablica zawsze będzie zawierać litery tylko w jednym przypadku (wielkie lub małe litery)
  • Musisz wyprowadzać dane w tym samym przypadku (wielkie lub małe litery), co dane wejściowe
  • Tablica zawsze będzie zawierać tylko jedną literę na raz (pomijanie brakującej litery)
  • Długość tablicy będzie wynosić od 2 do 25
  • Pierwszy lub ostatni element tablicy nigdy nie będzie brakować

Przykłady

['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
źródło
Czy zamiast tego mogę wziąć ciąg?
Leaky Nun
@LeakyNun Ciągi znaków to tablice znaków, więc tak.
Amorris,
1
Czy wyjściem może być tablica zawierająca brakujący znak (np .: dla wejścia ['a','b','c','d','f','g'], wyjścia ['e'], jeśli to skraca kod?
Pan Xcoder,
1
@ Mr.Xcoder Ciąg to po prostu tablica znaków, więc tak
Amorris,
2
Zasada czwarta jest po prostu podzbiorem reguły ósmej i może zostać usunięta (przynajmniej, jeśli umieścisz słowo „włącznie” na końcu reguły ósmej).
NH.

Odpowiedzi:

11

C # (.NET Core) , 48 47 46 bajtów, wejście jako tablica znaków

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

Wypróbuj online!

Objaśnienie: zwiększany jest pierwszy element tablicy, a także wskaźnik iterujący następujące elementy. Gdy zarówno pierwszy element, jak i bieżący element są różne, zwraca pierwszy element.

C # (.NET Core) , 58 56 50 bajtów, wprowadzany jako ciąg

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

Wypróbuj online!

Poprzednie 58-bajtowe rozwiązanie (wymienione w pierwszym komentarzu):

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

Algorytmy wykorzystujące System.Linq

Następujące algorytmy muszą dodać using System.Linq;(18 bajtów) do liczby bajtów, a zatem są dłuższe.

Całkiem mi się podobał (52 + 18 bajtów):

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

Masz również rozwiązanie jednoliniowe (45 + 18) bajtów:

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

I bardzo sprytne (37 + 18) bajtów rozwiązanie, dzięki uprzejmości Ed'ki:

s=>s.Select(e=>++e).Except(s).First()
Charlie
źródło
1
Czy nie uda się to skompilować z nie wszystkimi ścieżkami kodu zwracającymi wartość? Ale +1 za sprawdzenie porównania z s[i]-s[0], całkiem sprytne!
TheLethalCoder
@TheLethalCoder Nie zawiedzie, ponieważ forpętla nie ma warunku zatrzymania, więc będzie iterować, dopóki ifwarunek nie zostanie oceniony true.
Charlie,
1
Możesz zapisać 8 bajtów w ten sposób: a=>{int i=0;for(;a[++i]-a[0]<=i;);return--a[i];}(gdy weźmiesz dane wejściowe jako char[]). Nie dzięki mnie, dzięki komentarzowi @Nevay do mojej odpowiedzi Java 8 .
Kevin Cruijssen
1
@KevinCruijssen znalazł sposób na zaoszczędzenie dwóch kolejnych bajtów, przyjmując dane wejściowe jako tablicę znaków.
Charlie,
1
Krótsza wersja Linq:s=>s.Select(e=>++e).Except(s).First()
Ed'ka,
8

Alice , 10 bajtów

/X.
\ior@/

Wypróbuj online!

Wyjaśnienie

To tylko struktura dla programów liniowych, które działają całkowicie w trybie porządkowym (przetwarzanie ciągów):

/...
\.../

Rzeczywisty kod liniowy to:

i.rXo@

Co robi:

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
źródło
7

Haskell , 33 30 bajtów

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

Wypróbuj online!

Anders Kaseorg
źródło
untilzapisuje bajt:f(a:b)=until(`notElem`a:b)succ a
xnor
W rzeczywistości xxor 3 bajty. Dzięki!
Anders Kaseorg,
7

Ruby, 21 znaków

->a{[*a[0]..a[-1]]-a}

Zwraca tablicę jednego elementu, zgodnie z komentarzem właściciela pytania .

Przykładowy przebieg:

irb(main):001:0> ->a{[*a[0]..a[-1]]-a}[['a','b','c','d','f']]
=> ["e"]

Wypróbuj online!

człowiek w pracy
źródło
7

Java 8, 70 57 56 48 46 bajtów

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

-14 (70 → 56) i -2 (48 → 46) bajtów dzięki @CarlosAlejo .
-8 (56 → 48) bajtów dzięki @Nevay .

Wyjaśnienie:

Wypróbuj tutaj.

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
źródło
1
Możesz użyć niejawnego rzutowania zamiast jawnego rzutowania, aby zaoszczędzić 8 bajtów a->{int i=0;for(;a[++i]-a[0]<=i;);return--a[i];}.
Nevay,
6

C (gcc) , 3335 36 48 60 bajty

Wszystkie optymalizacje powinny być wyłączone i tylko w 32-bitowym GCC.

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

Weź dane jako ciąg.

Wypróbuj online!

Keyu Gan
źródło
2
„Wszystkie optymalizacje powinny być wyłączone i tylko w 32-bitowym GCC”. to bardzo ogólny sposób stwierdzenia, że ​​to nie działa (wydaje się, że działa tylko z powodu UB)
sehe
Powiedziałbym, że foo(char*a){return*a+1==a[1]?foo(a+1):++*a;}jest całkiem niezły; Tylko o 1 char krótszy niż bardziej naturalnyfoo(char*a){while(*a+1==a[1])a++;return++*a;}
patrz
@ ciągłe niezdefiniowane zachowanie jest uważane za dopuszczalne na PPCG
Keyu Gan
5

Python 3 , 74 62 58 44 40 bajtów

-12 bajtów dzięki Erikowi Outgolfer. -18 bajtów dzięki Leaky Nun. -4 bajty dzięki musicman523.

Pobiera dane wejściowe jako bajtowanie.

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

Wypróbuj online!

Kolejne fajne rozwiązanie:

lambda s:chr(*{*range(*s[::~-len(s)])}-{*s})
całkowicie ludzki
źródło
1
.difference({*s})->-{*s}
Erik the Outgolfer
1
60 bajtów
Leaky Nun
1
Jeszcze
1
Twoje rozwiązanie jest tym, czego szukałem, ale w znacznie bardziej elegancki sposób
Pureferret
4

Mathematica, 46 bajtów

Min@Complement[CharacterRange@@#[[{1,-1}]],#]&
J42161217
źródło
Wierzę, że Min@Complement[CharacterRange@@#[[{1,-1}]],#]&to uratuje bajt.
LegionMammal978
@ LegionMammal978 faktycznie 2!
J42161217,
3

JavaScript (ES6), 70 bajtów

Wprowadź jako tablicę znaków

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

Mniej golfa

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

Test

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
źródło
3

PHP> = 7.1, 46 bajtów

Weź dane jako ciąg

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

PHP Sandbox Online

Jörg Hülsermann
źródło
3

Siatkówka , 33 25 bajtów

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

Wypróbuj online! Działa z dowolnym zakresem znaków ASCII. Edycja: Zapisano 8 bajtów dzięki @MartinEnder. Objaśnienie: Pierwszy etap powiela dane wejściowe. Drugi zmniejsza wszystkie znaki w kopii o 1 punkt kodowy. Trzeci etap usuwa wszystkie znaki z kopii, które nadal pojawiają się w oryginale. To po prostu pozostawia oryginalne wejście, znak, który poprzedza pierwszy znak oryginalnego wejścia i brakujący znak. Ostatni etap po prostu dopasowuje brakującą postać.

Neil
źródło
Oto 25, używając tego samego podstawowego pomysłu: tio.run/##K0otycxL/P9fhevQNpV4rpCEgoT4ggQ9LRUulwQ9LsUEPZX///… ( Zmniejszam drugą linię, ponieważ to oszczędza bajt, a następnie znajduję unikalny znak za pomocą deduplikacji.)
Martin Ender
@MartinEnder Deduplikacja jest dokładnie tym, czego od zawsze chciałem, i już zapomniałem, że Retina ma to, westchnienie ... (Wiem, że zwiększenie pierwszej linii zajmuje bajt więcej niż zmniejszenie drugiej linii, ale spowodowało, że dopasowanie wyrażenia regularnego jest krótsze.)
Neil
3

SWI Prolog, 124 bajty

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

Przykłady:

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

Małe wyjaśnienie:

Jest mto „główna” procedura, która ntworzy następny oczekiwany znak na liście. cRobi porównania - jeśli oczekiwanie na mecz następny element, kontynuuj, jeszcze wydrukować oczekiwany charakter i wyskoczyć przez okno.

Jan Drozen
źródło
1
Krótszy niż fail: 0=1.
mat
3

C ++ 14, standardowa biblioteka, ogólny typ kontenera ( 87 86 bajtów)

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

Kontenerowe z nazw ::stdzakłada (na przykład std::string, std::listalbo std::vector. W przeciwnym wypadku using namespace std;lub podobnego byłoby założyć.

Dzięki @Ven, z odrobiną hakowania preprocesorów, dostajesz go do 82 bajtów (1 nowa linia)

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

Zobacz to Live On Coliru

C ++ 14 brak standardowej biblioteki (nadal ogólna, 64 63 bajty)

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

Ponownie, musisz pomóc w wyszukiwaniu nazw, tylko jeśli typ kontenera nie pochodzi z przestrzeni nazw ::std(lub jest z nią powiązany)

Live On Coliruna std::stringprzykład

Live On Coliruna char const[]przykład

sehe
źródło
Musisz wstawić spację między tekstem przekreślonym a następnym tekstem.
CJ Dennis,
@CJDennis Gotowe. Nawiasem mówiąc, twój obecny przedstawiciel (2469) jest piękną liczbą (jest 3 * 823, a także wizualnie sparowany jako (24) (69), który jest (2 2 2 3) (3 23))
sehe
2

Węgiel drzewny , 18 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane wejściowe jako ciąg. Działa z dowolną prawie ciągłą sekwencją znaków ASCII.

Neil
źródło
2

C #, 104 bajty

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

Wersja pełna / sformatowana:

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
źródło
Bardzo sprytna wersja Linq autorstwa Ed'ki :s=>s.Select(e=>++e).Except(s).First()
Charlie,
@CarlosAlejo Widziałem, że dodałeś go do swojej odpowiedzi, więc nie zaktualizuję mojego, ale tak, to bardzo sprytne. O wiele krótszy niż moja wersja robienia tego.
TheLethalCoder
2

MATL, 8 7 bajtów

1 bajt zapisany dzięki @Luis

tdqf)Qc

Wypróbuj w MATL Online

Wyjaśnienie

      % 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
źródło
@LuisMendo Awesome, dzięki!
Suever,
2

Excel, 110 + 2 = 112 bajtów

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

Należy wprowadzić jako formułę tablicową ( Ctrl+ Shift+ Enter), która dodaje nawiasy klamrowe { }na każdym końcu, dodając dwa bajty. Dane wejściowe są w postaci ciągu wejściowego A1, co jest OK na OP .

Jak dotąd nie jest to najkrótsza odpowiedź (Excel rzadko), ale lubię sprawdzać, czy da się to zrobić.

Inżynier Toast
źródło
2

Rexx (Regina) , 56 bajtów

a=arg(1)
say translate(xrange(left(a,1),right(a,1)),'',a)

Wypróbuj online!

Wreszcie taki, który umożliwia REXX wykorzystanie silnej manipulacji ciągami.

theblitz
źródło
2

CJam , 6 bajtów (pełny program) / 7 bajtów (blok kodu)

q),^W=

Wypróbuj online!

Jest to pełny program CJam, który odczytuje ciąg wejściowy ze standardowego wejścia i drukuje brakującą literę na standardowe wyjście. CJam tak naprawdę nie ma „metod”, o które prosi wyzwanie, ale najbliższą rzeczą byłby prawdopodobnie blok kodu wykonywalnego, taki jak ten:

{),^W=}

Wypróbuj online!

Ten blok kodu, gdy jest oceniany, przyjmuje dane wejściowe jako ciąg (tj. Tablicę znaków) na stosie i zwraca brakujący znak również na stosie.


Objaśnienie: W pełnym programie qodczytuje łańcuch wejściowy i umieszcza go na stosie. )następnie wyskakuje ostatni znak ciągu wejściowego, a operator zakresu ,zamienia go w tablicę zawierającą wszystkie znaki ze znakami kodu poniżej (w tym wszystkie litery przed nim w alfabecie). Tak więc, na przykład, jeśli dane wejściowe były cdfgh, wtedy ),stos zawierałby ciągi znaków cdfg(tj. Dane wejściowe z usuniętą ostatnią literą), a ...abcdefggdzie ...oznacza grupę znaków z kodami ASCII poniżej a(tj. Wszystkie znaki poniżej usuniętej ostatniej litery list).

Operator symetrycznej różnicy zestawów ^łączy następnie te ciągi w jeden ciąg, który zawiera dokładnie te znaki, które pojawiają się w jednym z ciągów, ale nie w obu. Zachowuje kolejność, w jakiej znaki pojawiają się w łańcuchach, więc dla przykładowego wejścia cdfgwynik ),^będzie następujący ...abe, gdzie ...znowu oznacza kilka znaków z kodami ASCII poniżej a. Wreszcie, W=po prostu wyodrębnia ostatni znak tego ciągu, który jest dokładnie brakującym znakiem e, który chcieliśmy znaleźć (i odrzuca resztę). Po zakończeniu programu interpreter CJam domyślnie drukuje zawartość stosu.


Bonus: GolfScript , 6 bajtów (pełny program)

),^-1>

Wypróbuj online!

Okazuje się, że prawie ten sam kod działa również w GolfScript. Zapisujemy jeden bajt w pełnej wersji programu ze względu na niejawne dane wejściowe GolfScript, ale tracimy jeden bajt, ponieważ w przeciwieństwie do CJam W, GolfScript nie ma poręcznej zmiennej jednoliterowej zainicjowanej na -1.

Ponadto CJam ma oddzielne typy liczb całkowitych i znaków (a łańcuchy są tylko tablicami zawierającymi znaki), podczas gdy GolfScript ma tylko jeden typ liczb całkowitych (i ma specjalny typ łańcucha, który zachowuje się nieco inaczej niż normalne tablice). Wynikiem tego wszystkiego jest to, że jeśli chcemy, aby interpreter GolfScript wydrukował brakującą literę zamiast numeru kodu ASCII, musimy zwrócić łańcuch jednoznakowy zamiast samego znaku. Na szczęście dokonanie tej zmiany wymaga jedynie zastąpienia operatora indeksowania operatorem =obcięcia tablicy / łańcucha >.

Oczywiście, dzięki niejawnym operacjom we / wy GolfScript, powyższy kod może być również użyty jako fragment kodu, który odczytuje łańcuch ze stosu i zwraca łańcuch jednoznakowy zawierający brakującą literę. Lub raczej każdy fragment kodu, który przyjmuje pojedynczy ciąg znaków na stosie jako argument i zwraca swój wynik jako ciąg znaków do wydrukowania na stosie, jest również pełnym programem GolfScript.

Ilmari Karonen
źródło
6
Fragmenty kodu są domyślnie niedozwolone ; są tylko funkcje i pełne programy. Prawdopodobnie potrzebujesz tego q(programu) lub {...}(bloku). +1 za podejście
Luis Mendo
To bardzo sprytne!
Esolanging Fruit,
2

Łuska , 6 bajtów

→S-(ḣ→

Wypróbuj online!

Ta funkcja pobiera ciąg (listę znaków) jako dane wejściowe i zwraca znak jako wynik.

Wyjaśnienie

→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
Lew
źródło
2

Python 2 - 76 bajtów

Przegrywa z istniejącym rozwiązaniem Pythona 2, ale jest to nieco inne podejście, więc pomyślałem, że mimo to opublikuję:

lambda c:[chr(x)for x in range(ord(c[0]),ord(c[0]+26)if chr(x)not in c][0]
LangeHaare
źródło
2

8 , 99 bajtów

Racjonalne uzasadnienie

Jeśli odległość między literami jest większa niż dwie, oznacza to brakującą literę. Odległość między literami jest obliczana na podstawie różnicy między kodem ASCII każdej litery.

Kod

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

Wersja bez golfa

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

Zastosowanie i przykłady

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

ok> "def" f

ok>
Dwór Chaosu
źródło
2

JavaScript (ES6), 64 bajty

Pobiera dane wejściowe jako ciąg.

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

W jaki sposób?

  • Inicjalizacja: Zacznijmy od n = 0 , a p = 0 i wywołania funkcji rekurencyjnej g () .

    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
  • Krok # 1: Zwiększamy n,c = String.fromCharCode(n)będzie równy pierwszemu znakowi wejściowego ciągu s [0] .

  • Krok # 2: Teraz, gdy jesteśmy zsynchronizowani, zwiększamy jednocześnie n i p,c = String.fromCharCode(n)nie będzie już równy s [p] .

  • Krok # 3: Zwracamy c : oczekiwany znak, który nie został znaleziony.

Przypadki testowe

Arnauld
źródło
1

J, 20 bajtów

{&a.>:I.1 0 1&E.a.e.
  • a.e. maska ​​logiczna dla liter wejściowych w zestawie znaków ascii
  • 1 0 1&E.nowa maska ​​boolowska wskazująca, czy sekwencja 101zaczyna się od tego indeksu, tj. znajdź miejsce, w którym rozpoczyna się sekwencja „pomijania”
  • I. indeks tego dopasowania, tj. znak przed pominiętym
  • >: przyrost o 1, tj. indeks pomijanego znaku w zestawie znaków ascii
  • {&a. wybierz ten indeks z zestawu znaków ascii, tj. zwróć pominięty znak

Wypróbuj online!

Jonasz
źródło
Dla mnie to wygląda jak urywek.
Adám
@ Adám Jest napisany w sposób cichy (bez punktów), który moim zdaniem liczy się jako „funkcjonalny” w przeciwieństwie do fragmentu kodu. Jak mogę najlepiej powiedzieć, nie jest to bardziej fragment kodu niż rozwiązanie APL (ale nie znam dyalogu, więc weź to, co mówię, z odrobiną soli).
zgrep
@ Adám tak, w tym sensie, że nie można go przypisać do zmiennej, ale zakłada dane wejściowe po jej prawej stronie. czy to nie jest legalne? zapytałem gdzieś o to i powiedziano mi, że było w porządku
Jonah
Rozumiem, że dla APL / J / K kod musi znajdować się w nazwie, czy to przez przypisanie, czy jako treść jawnego czasownika / funkcji (jednak jawna forma musi wtedy również mieć wyraźne dane wejściowe). Snippet to kod, który przyjmuje wartości w zmiennych i / lub wymaga wklejenia do linii, ale nie może samodzielnie działać.
Adám
@zgrep Nie, ten kod jest jawny (niejawny), ale brakuje odniesienia do jego argumentu po prawej stronie. Moja funkcja APL jest kompletną funkcją ukrytą, która może przypisywać lub umieszczać w nawiasach.
Adám
1

ES6, 125 bajtów:

(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

Zwróconą funkcję należy wywołać za pomocą tablicy

(["a","c"])

można zapisać kolejne 9 bajtów, usuwając plik .join („”) i przekazując ciąg znaków:

("ac")

ES6, 108 bajtów:

(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
źródło
1
wiązać ??? w golfa kodu?
edc65
@ edc65 co z tym nie tak? (przepraszam, jeśli to n00b, ale to mój pierwszy golf :))
Jonas Wilms
@ edc65, ale prawdopodobnie masz rację, usunięcie go zapisało 4 bajty ...
Jonas Wilms
a.join("")może byća.join``
user2428118 17.07.17
1

Common Lisp, 88 bajtów

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

Wypróbuj online!

Renzo
źródło
1

Python 2 , 69 bajtów

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

Wypróbuj online!

Kilka wyjaśnień Znając pierwszy i ostatni element listy, możemy łatwo obliczyć sumę kodów wszystkich znaków w list + the missed char(używając podsumowujących wzorów postępu arytmetycznego ). Różnica między tą sumą a sumą kodów wszystkich znaków w listpodanym kodzie daje kod brakującej litery.

mdahmoune
źródło
1

05AB1E , 9 7 bajtów

ǤÝsKçθ

Wypróbuj online!

Erik the Outgolfer
źródło
Będę sądzić po tym, 2że używamy tego samego algorytmu, chociaż prawie nie znam 05AB1E :)
Leaky Nun
@LeakyNun Cóż, myślałem też o algorytmie ...
Erik the Outgolfer
Właśnie zmieniłem algorytm.
Leaky Nun
@LeakyNun W każdym razie byłoby dłużej w 05AB1E.
Erik the Outgolfer,
Właśnie pomyślałem o innym algorytmie, który zawiera 2 , może być twój ...
Leaky Nun
1

APL (Dyalog) , 17 bajtów

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

Wypróbuj online!

⎕AV∘∊ Boolean: każda postać w Tomic V Ector (Character set) członek argumentu?

() Zastosuj następującą funkcję ukrytą:

 pierwszy element

⎕AVTomic V ector (zestaw znaków)

/⍨ który

∨\ następuje inicjał (członek argumentu)

 ale

~ nie jest (członek argumentu)

Adám
źródło