Dziwne: listy

11

Cel

Napisz program lub funkcję (lub równoważną), która uporządkuje i zwróci nieparzystą literę w macierzy o losowym rozmiarze.

Detale

Otrzymasz macierz (jako ciąg) jako dane wejściowe o losowych wymiarach, takich jak ten.

bbbbbbbbbb
bbbbbdbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb

Twoim zadaniem jest znalezienie litery, która nie pasuje do reszty (w tym przypadku jest ona dznaleziona w wierszu 2, kol. 6) i zwrócenie tej litery jako wyniku. Matryca będzie się składać z liter A-Z, a-zznaków nowej linii ( \ntylko na końcach wierszy) i będzie mieć wymiary od 5x5 do 10x10 (25-100 liter).

Obowiązują standardowe luki. To jest wyzwanie w golfa kodowego; Wpis z kodem najmniej bajtów wygrywa.

Wejście

Dane wejściowe będą przekazywane standardowym wejściem jako ciąg znaków, jeśli jest to program lub jako argument, jeśli funkcja (lub podobna).

Wynik

Jeden znak, że jest „dziwne” w matrycy lub None , nil, NUL, lub ciąg znaków "None", jeśli nie ma znaków „dziwne”.

Więcej przykładów

AAAAAAA
AAAAAAA
AAAAAAA
AAAIAAA
AAAAAAA

Odpowiedź: I

vvqvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv

Odpowiedź: q

puuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu

Odpowiedź: p

Generator

Oto losowy generator macierzy napisany w języku Python, którego można użyć do przetestowania programu. Uwaga: istnieje niewielka szansa, że ​​popełni błąd i nie wpisze dziwnego listu.

juniorRubyist
źródło
1
Oto dosłowne tłumaczenie kodu Python na JS.
Arnauld
1
@juniorRubyist „usunięcie bonusu” nie jest tym samym, co „uczynienie bonusu obowiązkowym”. Przenosząc część, która była do tej pory opcjonalna, do wymagań wyzwania, unieważniłeś dużą część istniejących odpowiedzi.
Martin Ender

Odpowiedzi:

6

J , 12 10 7 bajtów

-.}./.~

Wypróbuj online!

    /.~        Group identical items together
  }.           Remove one item from each group
-.             Remove the rest from the input

Wersja 10-bajtowa

-._1 1{\:~

syczenie ...

       \:~        Sort down
  _1 1{           Take the last character (which is a newline) and the second one.
-.                Remove those from the input
FrownyFrog
źródło
2
@ FrownyFrog To sprytny sposób na znalezienie dziwnej postaci
Galen Iwanow
nie mogę zdecydować, co lubię bardziej: ten piękny haczyk lub twój smoczy żart ...
Jonah
4

Brachylog , 8 4 bajtów

oḅ∋≠

Wypróbuj online!

Wyjaśnienie

Nie korzystałem wcześniej z Brachylog, więc może to nie być optymalne.

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.
Zgarb
źródło
To użycie ∋≠po do uzyskania wyników o długości 1 jest bardzo sprytne. Zdecydowanie powinieneś opublikować go w pytaniu dotyczącym porad Brachylog .
Fatalize
@ Fatalizuj Dzięki, dodałem wskazówkę.
Zgarb
3

K (oK) , 7 6 bajtów

Rozwiązanie

*<#:'=

Wypróbuj online!

Przykład:

*<#:'="vvqvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"q"

Wyjaśnienie:

Znaleziono nieco krótsze podejście: oceniane od prawej do lewej:

*<#:'= / the solution
     = / group matching items together
  #:'  / count (#:) each (')
 <     / sort ascending
*      / take the first one

Uwagi:

Chociaż oczekuję, że bonusowy aspekt tego wyzwania zostanie odrzucony, to rozwiązanie zwróci znak nowej linii, \njeśli nie będzie żadnego dziwnego znaku:

*<#:'="vvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"\n"
streetster
źródło
3

Prolog (SWI) , 46 bajtów

p(L):-select(X,L,Y),\+member(X,Y),writef([X]).

Wypróbuj online!

Lub jeśli standardowe prawdziwe dane wyjściowe z zapytań prologów są nieprawidłowe:

Prolog (SWI) , 48 bajtów

Z*L:-select(X,L,Y),\+member(X,Y),char_code(Z,X).

Wypróbuj online!

Wyjaśnienie

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

C (gcc) , 93 92 90 66 62 bajtów

Znacznie krótszy jako funkcja

t;f(char*p){for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

Wypróbuj online!

kod testowy

main()
{
    char s[99];
    for(;gets(s);)f(s);
}

stara wersja to program

C 86 bajtów

char*p;s[9];main(t){for(;p=gets(s);)for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

Zwraca nieparzysty znak lub nic. biegnij tak;

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
cleblanc
źródło
Nie wiem, czy wprowadzenie gets()sterownika testowego jest dość uczciwe, ponieważ dezynfekuje dane wejściowe, usuwając znaki \ n dla Ciebie. Robi to trochę pracy, aby twoja funkcja nie działała na oryginalnym wejściu.
Michael Dorgan
@MichaelDorgan Działa z wejściem potokowym ze skryptu Pythona, a także z wejściem w TIO. Inni po prostu zakodowali dane wejściowe, które nie wydawały się duchem wyzwania.
cleblanc
3

05AB1E ,  4  2 bajty

Zaoszczędzono 2 bajty dzięki Adnan

.m

Wypróbuj online!

Wyjaśnienie

.m   # push a list of the least frequent character(s) in input
Emigna
źródło
Czy musisz usunąć nowe linie, ponieważ gwarantujemy, że dane wejściowe będą miały co najmniej 5 linii?
Kudłaty
@Shaggy: Nie, nie wiem. Miało to obsługiwać 2x2matryce. Tęskniłem za częścią w 5x5górę i w górę. Dzięki!
Emigna
Musi wrócić, niljeśli nie ma „dziwnego”, prawda?
Magic Octopus Urn
@MagicOctopusUrn Ta część była opcjonalna, gdy opublikowano tę odpowiedź. Myślę, że ta zmiana unieważnia teraz większość odpowiedzi ...
Martin Ender
2

Siatkówka , 13 bajtów

s(O`.
(.)\1+

Wypróbuj online!

Wyjaśnienie

s(O`.

Sortuj wszystkie postacie.

(.)\1+

Usuń wszystkie znaki, które pojawiają się co najmniej dwa razy.

Martin Ender
źródło
2

Łuska , 2 bajty

◄=

Wypróbuj online!

Jest to funkcja pobierająca ciąg znaków jako dane wejściowe i zwracająca znak. Pobiera minimum łańcucha wejściowego podczas porównywania znaków w celu uzyskania równości (tzn. Zwraca znak równy najmniejszej liczbie innych znaków).

Lew
źródło
2

C, 94 bajty

Wróć przez wskaźnik. Jeśli nie, wróć\0 .

Spowoduje to wycieki pamięci. Zakładając, że intto 4 bajty.

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

Wypróbuj online!

Colera Su
źródło
@Shaggy W rzeczywistości nie wiem, jak interpretować tę regułę, ponieważ widzę, że niektórzy (inni) użytkownicy wyraźnie wiedzą o tej regule, ale nadal publikują takie odpowiedzi, jak ta.
user202729,
2
@ user202729, tylko dlatego, że inni to robią, nie oznacza, że ​​ma rację;) Jeśli zauważysz takie rozwiązania, najlepiej im to wskazać.
Kudłaty
@Shaggy Cóż, wyraźnie wskazałem regułę, ale ten użytkownik powiedział „reguła wyraźnie mówi, że ta jest ważna”. Nie wiem co powiedzieć. | W takim przypadku funkcja wymaga tzerowania tablicy przed wywołaniem za każdym razem, a nie za pierwszym razem.
user202729,
@Shaggy Thanks, naprawiono.
Colera Su
2

Bash , 15 20 bajtów

fold -1|sort|uniq -u

Wypróbuj online!

Objaśnienie: fold s jest wprowadzaniem 1znaku w wierszu, sorts w grupach pasujących liter, a następnie drukuje tylko te wiersze, które sąuniq ue.

Dzięki @Nahuel Fouilleul za złapanie i pomoc w rozwiązaniu problemu z tym podejściem.

Justin Mariner
źródło
nie działa, jeśli dziwna postać jest drugą lub penitlimatyczną
Nahuel Fouilleul
@NahuelFouilleul Dobry połów ... Nie jestem pewien, jak to naprawić w tej chwili, ale naprawię lub usunę później, chyba że masz sugerowaną poprawkę.
Justin Mariner
można to po prostu naprawić, |sort|ale może być lepsze rozwiązanie
Nahuel Fouilleul
również znalazł rozwiązanie z grep, ale jest ono dłuższegrep -oP '^(.)((?=(?!\1).){2}|.*\K(?!\1).)'
Nahuel Fouilleul
@NahuelFouilleul Idę z sortpoprawką, dzięki. Jednak zawsze możesz opublikować tę grep odpowiedź jako własną, jeśli chcesz.
Justin Mariner
1

Pyth , 4 bajty

ho/Q

Wypróbuj tutaj!

Pan Xcoder
źródło
.m/Qma również 4 bajty
Dave
@Dave To wychodzi jako lista, wybrałem to, ponieważ było bardziej eleganckie ;-)
Mr. Xcoder
1

Perl 5, 17 + 3 (-00p) -25% = 15 bajtów

/(.)\1/;s/
|$1//g

spróbuj online

Nahuel Fouilleul
źródło
1

Matlab, 25 bajtów

a=input('');a(a~=mode(a))

Wejście „a”, gdzie „a” nie jest trybem „a”. Wypisuje pustą tablicę dla nieparzystych.

Jeremiasz Peek
źródło
1

Haskell, 33 * 0,75 = 24,75 bajtów

f s=[c|[c]<-(`filter`s).(==)<$>s]

Zwraca pustą listę, jeśli nie ma nieparzystego znaku.

Wypróbuj online!

Dla każdego znaku cw macierzy (podanego jako ciąg s) utwórz ciąg wszystkich znaków, sktóre są równe ci zachowaj te o długości 1.

nimi
źródło
1

JavaScript (ES6), 37 bajtów

Zwraca, nulljeśli nie ma nieparzystej litery.

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

Przypadki testowe

Arnauld
źródło
1

Japt , 6 bajtów

Pobiera dane wejściowe jako ciąg wielu wierszy i wyprowadza ciąg jednego znaku lub pusty ciąg, jeśli nie ma rozwiązania.

k@èX É

Spróbuj


Wyjaśnienie

Usuń znaki zwracające wartość true ( k) po przejściu przez funkcję ( @), która zlicza ( è) wystąpienia bieżącego elementu ( X) na wejściu i odejmuje 1 ( É).

Kudłaty
źródło
1

Common Lisp, 47 bajtów

(lambda(s)(find-if(lambda(x)(=(count x s)1))s))

Wypróbuj online!

Zwraca nieparzystą literę lub NIL, jeśli nie istnieje.

Renzo
źródło
1

Galaretka , 4 bajty

ċ@ÐṂ

Wypróbuj online!

Wróć \n(pojedyncza nowa linia), jeśli nie ma nieparzystego znaku. Oczywiście\n nie jest postacią do wydrukowania.

Przypadkowo jest to dokładnie ten sam algorytm, co odpowiedź Mr.Xcoder Python. (Wymyśliłem to niezależnie)

Wyjaśnienie:

  ÐṂ    Ṃinimum value by...
ċ@      ċount. (the `@` switch the left and right arguments of `ċ`)

To działa, ponieważ w m×nmacierzy:

  • Jeśli istnieje nieparzysty znak: istnieje m-1 nowe wiersze, 1 nieparzysty znak i m×n-1normalny znak, a 1 < m-1 < m×n-1ponieważ 5 ≤ m, n ≤ 10.
  • Jeśli nie istnieje znak nieparzysty: są znaki m-1nowej linii i m×nznak normalny oraz m-1 < m×n.
użytkownik202729
źródło
1

C # (.NET Core) , 54 bajty

i=>i.GroupBy(x=>x).FirstOrDefault(g=>g.Count()<2)?.Key

Wypróbuj online!

Wakawakamush
źródło
Masz rację, moja odpowiedź była zła. Usunąłem to. Ale brakuje 18 bajtów z usinginstrukcji w liczbie bajtów.
raznagul
1

C (gcc) , 91 86 82 79 71 bajtów

f(char*s){for(;*++s==10?s+=2:0,*s;)if(*s^s[-1])return*s^s[1]?*s:s[-1];}

Wypróbuj online!

  • Dzięki Gastropner za xor i? lewy (-3 bajty)
  • Przerobiono wersję porównawczą, aby naprawić błędy, i użyłem magii Gastropner z komentarzy.

Wyjaśnienie:

Porównaj obecny i poprzedni znak, pomijając znaki nowej linii. Jeśli jest inny, porównaj następny znak. To mówi nam, czy zwrócimy obecny lub poprzedni znak. Funkcja zwraca „nieparzystą” wartość char, jeśli istnieje, lub 0, jeśli tablica nie jest nieparzysta. Unika nas „następny” czek znaków, ponieważ przed znakiem zawsze jest nowa linia \0. Jeśli nie ma nieparzystego znaku, wewnętrznie zwracamy \ 0 z pętli for.


Starszy, bardziej seksowny kod xor Objaśnienie:

Utwórz działającą maskę xor z następnych 3 wartości ciągu. Jeśli wszystkie są takie same, wartość będzie równa dowolnej z trzech. Jeśli są różne, 2 identyczne anulują się nawzajem, pozostawiając niepowtarzalne.

Należy uwzględnić współczynnik / n przed xor, aby uzyskać bałagan. Muszę również sprawdzić 2 znaki pod kątem nierówności w przypadku, gdy s [0] jest wartością nieparzystą. To kosztuje dodatkowe || czek.

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;}}
Michael Dorgan
źródło
79 z kilkoma poprawkami. Powrót 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;}}
awaryjny
Jeśli chodzi o bzdury, które piszę, TIO jest tym, co trzymam się. Dzięki!
Michael Dorgan
Zmiana układu niektórych wyrażeń pozwala na kolejną -2 dla 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;} Jednak wygrywającym koniem jest ten drugi, jeśli trochę się nim v;f(char*s){for(v=-1;*++s==10?s+=2,v--:0,*s;v=0)if(*s^s[-1])return s[v];}
bawisz
Tak, ale Xor wydaje się taki seksowny. :)
Michael Dorgan
Zaproponuj s+=*++s-10?0:2zamiast*++s==10?s+=2:0
ceilingcat
1

Oktawa , 26 25 bajtów

1 bajt zapisany dzięki @Giuseppe

@(x)x(sum(x(:)==x(:)')<2)

Anonimowa funkcja, która pobiera tablicę znaków 2D jako dane wejściowe i wyświetla nieparzystą literę lub pusty ciąg, jeśli nie istnieje.

Wypróbuj online!

Luis Mendo
źródło
0

Alice , 16 * 75% = 12 bajtów

/-.nDo&
\i..*N@/

Wypróbuj online!

Wyjścia Jabberwocky jeśli nie ma zduplikowanego znaku.

Wyjaśnienie

/...@
\.../

Jest to framework dla programów liniowych, które działają całkowicie w Ordinal (tryb przetwarzania łańcucha znaków). Rzeczywisty kod jest wykonywany w sposób zygzakowaty i rozwija się w celu:

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

Zamiast tego &-możemy również użyć ey(transliteracja do pustego ciągu). Alternatywnie, wydając jeszcze jeden znak na manipulację stosem, możemy również deduplikować dane wejściowe, co pozwala nam usunąć niechciane znaki N, ale nadal jest taka sama liczba bajtów:

i.D.QXN.n*o@

Alice , 13 bajtów

/N.-D@
\i&.o/

Wypróbuj online!

Jest to rozwiązanie bez premii, po prostu brakuje .n*.

Martin Ender
źródło
0

APL + WIN, 16 bajtów

(1=+/a∘.=a)/a←,⎕

Monituje o wprowadzenie ekranu i wyświetla nieparzystą literę lub nic, jeśli nie ma nieparzystej litery

Graham
źródło
a/⍨1=+/a∘.=a←,⎕bajt
Uriel
@Uriel Dzięki, ale obawiam się, że operator ⍨ nie jest dostępny w mojej starej wersji APL + WIN 5 :(
Graham
0

PowerShell , 39 bajtów

([char[]]"$args"|group|sort c*)[0].Name

Wypróbuj online!

Pobiera dane wejściowe jako ciąg znaków z nowymi liniami (jak określono w wyzwaniu), konwertuje je na chartablicę. My następnie Group-Objectpostacie, dzięki czemu postacie są pogrupowane według ich nazw, a następnie sortna podstawie cliczby. To gwarantuje, że samotna postać jest pierwsza, więc bierzemy [0]indeks i tworzymy go.Name .

Jeśli nowa linia jest akceptowalna jako „nic”, to kwalifikuje się do premii.

AdmBorkBork
źródło
Miałem nadzieję, że sort c*)[0]może zostać skrócony, ale to, co wymyśliłem była taka sama liczba bajtów ? c* -eq 1).
korzeń
można skrócić, usuwając podwójne cudzysłowy $args. Jest również bardziej dokładny, ([char[]]$args|group|? c* -eq 1).Nameponieważ powróci, nullgdy nie będzie żadnego nieparzystego znaku (zamiast nowej linii). Jednak pod względem bajtów wciąż nie spadnie to poniżej 37.
cogumel0
@ cogumel0 Nie działa bez podwójnych cudzysłowów.
root
@root masz rację. Jednak, aby przejść jedną z wymogami (pojedynczy znak, który jest „dziwne” w matrycy lub None, nil, NUL, lub ciąg znaków "None", jeśli nie ma znaków „dziwne”.) To powinno być jeszcze zmienione. Newline nie jest częścią akceptowalnych odpowiedzi.
cogumel0
@ cogumel0 Ah, wyzwanie zostało zmienione, odkąd opublikowałem swoją odpowiedź. Opcja „Brak / zero / cokolwiek” była po prostu premią, a nie obowiązkiem. Mam zamiar zachować swoją obecną odpowiedź.
AdmBorkBork
0

Perl 6 ,  27  24 -25% = 18 bajtów

*.comb.Bag.min(*.value).key

Sprawdź to

{%(.comb.Bag.invert){1}}

Sprawdź to

Będzie to powrót nieokreślonej wartości , gdy podane dane wejściowe, które nie mają dziwny znak out.

Rozszerzony:

{  # 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
}
Brad Gilbert b2gills
źródło
0

Brainfuck, 125 bajtów

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

Wypróbuj online

Drukuje literę matrycy, jeśli nie ma jednej nieparzystej

Jo King
źródło
0

Java 8, 85 bajtów

Jest to lambda od Stringdo String(np Function<String, String>.). Zasadniczo jest to kopia rozwiązania Lucy , ale trochę posortowałem łańcuch.

s->new String(s.chars().sorted().toArray(),0,s.length()).replaceAll("(.)\\1+|\\n","")

Wypróbuj online

Jakob
źródło