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'
code-golf
array-manipulation
alphabet
Amorris
źródło
źródło
['a','b','c','d','f','g']
, wyjścia['e']
, jeśli to skraca kod?Odpowiedzi:
Pyth , 5 bajtów
Wypróbuj online!
źródło
C # (.NET Core) ,
48 4746 bajtów, wejście jako tablica znakówWypró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 5650 bajtów, wprowadzany jako ciągWypróbuj online!
Poprzednie 58-bajtowe rozwiązanie (wymienione w pierwszym komentarzu):
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):
Masz również rozwiązanie jednoliniowe (45 + 18) bajtów:
I bardzo sprytne (37 + 18) bajtów rozwiązanie, dzięki uprzejmości Ed'ki:
źródło
s[i]-s[0]
, całkiem sprytne!for
pętla nie ma warunku zatrzymania, więc będzie iterować, dopókiif
warunek nie zostanie ocenionytrue
.a=>{int i=0;for(;a[++i]-a[0]<=i;);return--a[i];}
(gdy weźmiesz dane wejściowe jakochar[]
). Nie dzięki mnie, dzięki komentarzowi @Nevay do mojej odpowiedzi Java 8 .s=>s.Select(e=>++e).Except(s).First()
Alice , 10 bajtów
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:
Co robi:
źródło
Haskell ,
3330 bajtówWypróbuj online!
źródło
until
zapisuje bajt:f(a:b)=until(`notElem`a:b)succ a
Ruby, 21 znaków
Zwraca tablicę jednego elementu, zgodnie z komentarzem właściciela pytania .
Przykładowy przebieg:
Wypróbuj online!
źródło
Java 8,
7057564846 bajtów-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.
źródło
a->{int i=0;for(;a[++i]-a[0]<=i;);return--a[i];}
.C (gcc) , 33
35364860bajtyWszystkie optymalizacje powinny być wyłączone i tylko w 32-bitowym GCC.
Weź dane jako ciąg.
Wypróbuj online!
źródło
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;}
Python 3 ,
7462584440 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.
Wypróbuj online!
Kolejne fajne rozwiązanie:
źródło
.difference({*s})
->-{*s}
Mathematica, 46 bajtów
źródło
Min@Complement[CharacterRange@@#[[{1,-1}]],#]&
to uratuje bajt.JavaScript (ES6), 70 bajtów
Wprowadź jako tablicę znaków
Mniej golfa
Test
źródło
PHP> = 7.1, 46 bajtów
Weź dane jako ciąg
PHP Sandbox Online
źródło
Siatkówka ,
3325 bajtówWypró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ć.
źródło
SWI Prolog, 124 bajty
Przykłady:
Małe wyjaśnienie:
Jest
m
to „główna” procedura, któran
tworzy następny oczekiwany znak na liście.c
Robi porównania - jeśli oczekiwanie na mecz następny element, kontynuuj, jeszcze wydrukować oczekiwany charakter i wyskoczyć przez okno.źródło
fail
:0=1
.C ++ 14, standardowa biblioteka, ogólny typ kontenera (
8786 bajtów)Kontenerowe z nazw
::std
zakłada (na przykładstd::string
,std::list
albostd::vector
. W przeciwnym wypadkuusing namespace std;
lub podobnego byłoby założyć.Zobacz to Live On Coliru
C ++ 14 brak standardowej biblioteki (nadal ogólna,
6463 bajty)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::string
przykładLive On Coliruna
char const[]
przykładźródło
Węgiel drzewny , 18 bajtów
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.
źródło
C #, 104 bajty
Wersja pełna / sformatowana:
źródło
s=>s.Select(e=>++e).Except(s).First()
MATL,
87 bajtów1 bajt zapisany dzięki @Luis
Wypróbuj w MATL Online
Wyjaśnienie
źródło
Excel, 110 + 2 = 112 bajtów
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ściowegoA1
, co jest OK na OP .Jak dotąd nie jest to najkrótsza odpowiedź (Excel rzadko), ale lubię sprawdzać, czy da się to zrobić.
źródło
Rexx (Regina) , 56 bajtów
Wypróbuj online!
Wreszcie taki, który umożliwia REXX wykorzystanie silnej manipulacji ciągami.
źródło
CJam , 6 bajtów (pełny program) / 7 bajtów (blok kodu)
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:
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
q
odczytuje ł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łycdfgh
, wtedy),
stos zawierałby ciągi znakówcdfg
(tj. Dane wejściowe z usuniętą ostatnią literą), a...abcdefg
gdzie...
oznacza grupę znaków z kodami ASCII poniżeja
(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ściacdfg
wynik),^
będzie następujący...abe
, gdzie...
znowu oznacza kilka znaków z kodami ASCII poniżeja
. Wreszcie,W=
po prostu wyodrębnia ostatni znak tego ciągu, który jest dokładnie brakującym znakieme
, 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)
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.
źródło
q
(programu) lub{...}
(bloku). +1 za podejścieŁuska , 6 bajtów
Wypróbuj online!
Ta funkcja pobiera ciąg (listę znaków) jako dane wejściowe i zwraca znak jako wynik.
Wyjaśnienie
źródło
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ę:
źródło
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
Wersja bez golfa
Zastosowanie i przykłady
źródło
JavaScript (ES6), 64 bajty
Pobiera dane wejściowe jako ciąg.
W jaki sposób?
Inicjalizacja: Zacznijmy od n = 0 , a p = 0 i wywołania funkcji rekurencyjnej g () .
Krok # 1: Zwiększamy n, aż
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, aż
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
Pokaż fragment kodu
źródło
J, 20 bajtów
a.e.
maska logiczna dla liter wejściowych w zestawie znaków ascii1 0 1&E.
nowa maska boolowska wskazująca, czy sekwencja101
zaczyna 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 znakWypróbuj online!
źródło
ES6, 125 bajtów:
http://jsbin.com/vasoqidawe/edit?console
Zwróconą funkcję należy wywołać za pomocą tablicy
można zapisać kolejne 9 bajtów, usuwając plik .join („”) i przekazując ciąg znaków:
ES6, 108 bajtów:
http://jsbin.com/tudiribiye/edit?console
źródło
a.join("")
może byća.join``
Common Lisp, 88 bajtów
Wypróbuj online!
źródło
Python 2 , 69 bajtów
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 wlist
podanym kodzie daje kod brakującej litery.źródło
05AB1E ,
97 bajtówWypróbuj online!
źródło
2
że używamy tego samego algorytmu, chociaż prawie nie znam 05AB1E :)APL (Dyalog) , 17 bajtów
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⎕AV
Tomic V ector (zestaw znaków)/⍨
który∨\
następuje inicjał (członek argumentu)∧
ale~
nie jest (członek argumentu)źródło