Zainspirowany łańcuchem komentarzy ...
Chcę
enklact
wyjść z tego wyzwania, ale nie mogę ...@ETHproductions to enklact (v): aby zaimplementować tabelę wyszukiwania za pomocą podsekcji składającej się z unikalnych elementów.
Enklacting to bardzo przydatny sposób kompresji tabeli odnośników. Załóżmy na przykład, że masz następującą listę kolorów:
red
green
blue
yellow
purple
orange
Jeśli chcesz mieć kolor jako dane wejściowe i zwrócić jego indeks na tej liście, jest oczywiście prosty sposób:
["red", "green", "blue", "yellow", "purple", "orange"].index(input())
Ale jest sposób, abyśmy mogli to zrobić w sposób mniej bajtowy:
"rgbypo".index(input()[0])
Działa to, ponieważ pierwszy (lub 0-ty) indeks każdego łańcucha jest unikalny. Ten przykład jest oczywisty, ale czasem jest trochę trudniejszy. Co jeśli chcielibyśmy stworzyć tabelę odnośników dla tej listy?
Sweet Onion Chicken Teriyaki
Oven Roasted Chicken
Turkey Breast
Italian BMT
Tuna
Black Forest Ham
Meatball Marinara
W takim przypadku nie możemy tego zrobić:
"SOTITBM".index(input()[0])
ponieważ istnieją dwa różne dane wejściowe rozpoczynające się od 'T'
, a mianowicie „Tuńczyk” i „Turcja”. Musimy spojrzeć na inny indeks. Jeśli spojrzysz na czwarty indeks każdego łańcucha, zauważysz, że wszystkie są unikalne. Więc możemy to zrobić ...
"enklact".index(input()[3])
W tym przypadku „ciąg enklaction” to „enklact”.
To prowadzi nas do dzisiejszego wyzwania ...
Biorąc pod uwagę listę ciągów, zwróć dowolny prawidłowy ciąg enklaction. Innymi słowy, biorąc pod uwagę listę ciągów, zwróć dowolny nowy ciąg, w którym każda litera jest unikalna, a ciąg jest tworzony przez połączenie i-tej litery każdego ciągu.
Jeśli nie ma prawidłowego ciągu enklaction, zgłoszenie musi zwrócić pusty ciąg lub spójną wartość falsy. Jak zwykle dozwolone są zarówno funkcje, jak i pełne programy, a formaty wejścia / wyjścia są dozwolone (z uzasadnionego powodu).
Każdy ciąg będzie zawierał tylko ASCII do wydruku, a w tym wyzwaniu rozróżniana jest wielkość liter.
To jest golf golfowy , więc spróbuj napisać najkrótszy możliwy program w wybranym przez siebie języku!
Przypadki testowe
Input:
Programming
Puzzles
Code
Golf
Output (any one of these):
"ozdl"
"gzef"
Input:
the quick
brown fox
jumped over
lazy dogs
Output:
"tbjl"
"hrua"
"eomz"
" wpy"
"qne "
"if o"
"kxvs"
Note that "u dd" and "coog" are not valid.
Input:
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Output:
""
Input:
AbC
aBc
bbC
Output:
"Aab"
Input:
@#$%^_
Hello_World
How are you?
Output:
"#eo"
"$lw"
"%l "
"^oa"
Input:
a
ab
ac
Output:
""
Odpowiedzi:
Python3, 59 bajtów
Zwraca ciąg z enklactem, w przeciwnym razie None
źródło
Python 2 ,
686761 bajtówWypróbuj online!
Ulepszenia
Jeśli wyjście nie musi być ciągiem:
Python 3 , 49 bajtów
Wypróbuj online!
źródło
max(`j`[2::5]for j in[""]+zip(*a)if len(set(j))==len(j))
działa, aby uratować bajt.Retina ,
4332 bajtyWypróbuj online! Edycja: Zapisano 11 bajtów dzięki @MartinEnder. Wyjaśnienie:
Powtarzaj, gdy zmienia się wejście ...
... tylko jeśli jedna linia jest pusta lub dwie linie zaczynają się od tego samego znaku ...
... usuń pierwszy znak każdej linii. Powtórzenie kończy się, jeśli albo a) wszystkie wiersze zaczynają się od różnych znaków, w takim przypadku warunek nie powiedzie się, a dane wejściowe nie ulegną zmianie, lub b) co najmniej jedna linia stanie się pusta, w którym to przypadku wszystkie znaki zostaną ostatecznie usunięte, w tym momencie sygnał wejściowy przestaje się zmieniać.
Zbierz pierwszy znak z każdej linii. (Jeśli nie było rozwiązania, powyższa pętla usunie wszystko i nie będzie nic do zebrania.)
źródło
m
z grupą tutaj, wygląda na to, że etap warunkowy nie propaguje opcji).Haskell , 71 bajtów
Wypróbuj online!
BMO zapisało 3 bajty za pomocą
any null x
→elem""x
.Ørjan Johansen zapisał bajt za pomocą
sum[1|b<-y,a==b]<2
→filter(==a)[y]==[a]
.Wyjaśnienie
Jeśli zgłoszenie błędu (
Prelude.head: empty list
), gdy nie ma rozwiązania jest w porządku,|elem""x=""
można je usunąć dla 61 bajtów .źródło
filter(==a)y==[a]
Rubinowy , 38 bajtów
Wypróbuj online!
Dzięki GB za wskazanie błędu.
źródło
Pyth , 6 bajtów
Zestaw testowy.
Dane wyjściowe to lista singletonów, domyślnie dozwolona ; lista [] (pusta lista, fałsz) jest zwracana na wypadek, gdyby napis nie mógł zostać zaktywizowany .
Wyjaśnienie
Pyth , 5 bajtów
Byłoby to ważne, gdyby zawieszenie się liczyło jako wartość fałszowania.
Zestaw testowy.
źródło
Haskell ,
7674 bajtówWypróbuj online! Zwraca ostatni prawidłowy ciąg wyszukiwania lub pusty ciąg, jeśli taki ciąg nie istnieje.
7169 bajtówJeśli dozwolone jest zgłaszanie spójnego wyjątku jako wartości fałszowania:
Wypróbuj online! Zgłasza
empty list
wyjątek, jeśli nie znaleziono łańcucha, w przeciwnym razie zwraca pierwszy prawidłowy ciąg.-2 bajty dzięki Ørjan Johansen
źródło
notElem x
można skrócić doall(/=x)
.Galaretka , 7 bajtów
Zwraca liczbę całkowitą 0, jeśli ciągi nie mogą zostać zaklinowane.
Wypróbuj online!
Jak to działa
źródło
Perl 5 , 61 bajtów
Wypróbuj online!
źródło
Stax ,
98 bajtówUruchom i debuguj
Objaśnienie (rozpakowane):
źródło
R , 127 bajtów
Wypróbuj online!
sapply
zwykle zwraca a,matrix
gdy wszystkielength(FUN(X[[i]]))
są równe, z wyjątkiem kiedylength(FUN(X[[i]]))==1
, w którym to przypadku zwraca avector
. Aby skorzystać z operacji macierzowych, musimy przejść osubstring
jeden krok dalej niż musimy zagwarantować amatrix
, i dlategox
rozszerza się namax(nchar(S)+1)
.Następnie filtrujemy wiersze, które nie mają duplikatów i pustych ciągów. Ponieważ możemy zwrócić tylko jeden ciąg, bierzemy pierwszy, z wyjątkiem tego, że gdy nie ma wierszy spełniających kryteria, wyrzucilibyśmy błąd, więc dołączamy dodatkowy wiersz
""
na końcu.Następnie wypisujemy
enklact
ciąg ified lub pusty ciąg.źródło
R ,
11610795 bajtówR + pryr
Wypróbuj online!
baza R
Wypróbuj online!
Te dwa warianty oszczędzają 9 bajtów dzięki Giuseppe .
Wyjaśnienie:
To skutecznie obcina wszystkie użądlenia w wektorze
v
do długości najkrótszego i iteruje kolejne indeksy. Następnie sprawdza, czy w wybranych literach są jakieś duplikaty, a jeśli nie, wkleja je ze sobą i drukujecat
. Jeśli wszystkie indeksy zwracają zduplikowane wyniki, drukuje pusty ciąg.Wszystko zawinięte w anonimową
pryr
funkcję z,break
aby zatrzymać pętlę, lub podstawowa funkcja R zerująca wektor, aby przerwać pętlę.źródło
R+pryr
lub 107 bajtów w bazie R.Japt, 9 bajtów
Pobiera dane wejściowe jako tablicę tablic znaków, zwraca tablicę znaków lub
undefined
Wypróbuj (Dodaj nowy wiersz na początku programu z kodem,
qR mq
aby pobierać dane wejściowe jako oddzielny ciąg nowego wiersza, aby zaoszczędzić kłopotów z tworzeniem tablic.)Wyjaśnienie
źródło
z æ_¬eZ¬â
05AB1E , 7 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Python 3 , 75 bajtów
Działa na listach znaków zamiast ciągów znaków. Zwraca False, jeśli nie istnieje prawidłowy ciąg enklaction.
Wypróbuj online!
źródło
f=
jest uwzględniona w liczbie bajtów.C (gcc) , 161 bajtów
Wypróbuj online!
Każda pozycja znaku jest testowana pod kątem duplikacji i pomijana, jeśli zostanie wykryty duplikat; jest to kontynuowane aż do zakończenia najkrótszego ciągu. Niestety, tylko ASCII: ciągi DBCS / UTF-8 źle psują tę funkcję!
źródło
Japt , 12 bajtów
Zwraca
undefined
łańcuchy niekliniczne.Wypróbuj online!
Wyjaśnienie:
źródło
split
s.Wolfram Language (Mathematica) , 54 bajty
Wypróbuj online!
Pobiera na liście listę znaków, zwraca listę znaków. Zawiera U + F3C7, co odpowiada operatorowi „Transponuj”.
Zwraca
#1
i generuje wiele błędów, które można pominąć, gdy nie ma odpowiedniego ciągu.Wyjaśnienie:
Wprowadź dane wejściowe, aby każdy „ciąg” (lista znaków) miał tę samą długość. Dołącza liczby całkowite
0
(nie ciągi"0"
). Następnie dokonaj transpozycji.Wybierz ciągi, które nie zawierają liczb całkowitych
0
i wszystkie unikalne znaki.Zdobądź pierwszy.
źródło
JavaScript (ES6), 66 bajtów
Zwraca ciąg znaków lub
undefined
jeśli nie ma rozwiązania.Wypróbuj online!
Skomentował
źródło
Węgiel ,
2321 bajtów-2 bajty dzięki @Neil !
Wypróbuj online!
źródło
q
przestał być ciągiem b) StringMap zaczął działać na nie-ciągach? W każdym razie twójRange
jest niepotrzebny, oszczędzając ci 2 bajty.Łuska , 9 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
←ġLT
overḞz:∞ø
powinno zaoszczędzić bajt.Siatkówka ,
8156 bajtówWypróbuj online!
-25 bajtów dzięki @Neil
Transpozycja prostokątnego tekstu w siatkówce jest zaskakująco trudna.
źródło
Perl 6 , 27 bajtów
Wypróbuj online!
Po zobaczeniu, że wersja ruby została oceniona, skopiowałem podejście i użyłem list znaków zamiast ciągów znaków. Nie podoba mi się to
Moje starsze i bardziej poprawne zgłoszenie jest następujące:
Perl 6 , 38 bajtów
Podziel, rozpakuj, sprawdź niepowtarzalność, dołącz.
Wypróbuj online!
źródło
C (gcc) ,
121113110 bajtówWypróbuj online!
Nie golfił
-3 dzięki pułapce cat
Nadużywa to możliwości dodania 1 do wskaźnika łańcucha w C, aby uzyskać „ogon” łańcucha. Głównymi oszczędzającymi bajty są:
d+=x[y[i++]=*(*_)++]++
który dołącza pierwszego znaku pierwszego ciąg_
doy
, postęp pierwszy ciąg_
, aby usunąć swój pierwszy znak, dodaje sięx
wpis w tym charakterze dod
i przyrosty powiedziałx
wpisq=d?*x:puts(y)
który wypisuje,y
jeślid
jest niezerowy podczas ustawianiaq
wartości niezerowej, lub ustawiaq
na niezerowy, jeśli pierwszy elementx
jest niezerowy (gdybyśmy byli na końcu jednego z ciągów, wówczas wspomniany element byłby niezerowy zero)Edycja: Ogolone bajty poprzez przełączenie z pętli while na rekurencyjne wywołanie ogona i usunięcie nawiasów z pętli for.
źródło
for(d=i=0;*_;)
zamiastfor(d=0,i=0;*_;++_)
i*(*_++)++]++;d=d?!*x*f(s)
zamiast*(*_)++]++;d=d?*x?0:f(s)
Pyth, 13 bajtów
Wypróbuj tutaj
źródło
Czerwony , 139 bajtów
Wypróbuj online!
Wyjaśnienie:
Pobiera dane wejściowe jako blok (listę) ciągów znaków. Zwraca ciąg enklaction lub w
none
inny sposób.źródło
Röda ,
8077 bajtówWypróbuj online!
-1 bajt dzięki kwakowi Krowy
Wyjaśnienie:
Słowo
try
kluczowe służy do odrzucania błędów, które występują, jeślii
jest większy niż długość najmniejszego ciągu wa
lub brak odpowiedzi ihead
powoduje błąd.źródło
seq
aby uratować bajtJava 10, 106 bajtów
Daje błąd zamiast zwracania pustego ciągu, jeśli nie można znaleźć rozwiązania. Dane wejściowe są matrycą znaków.
Wypróbuj online.
Wyjaśnienie:
źródło
Clojure, 59 bajtów
Zwraca listę list znaków.
źródło
APL + WIN,
3533 bajtów2 bajty zapisane dzięki Adámowi
Monity o wiersze tekstu jako macierz znaków:
Wypróbuj online! Dzięki uprzejmości Dyalog Classic
Wyjaśnienie:
źródło
⊂[1]
→,⌿