Znajdź Semordnilaps

21

Semordnilaps (znany również jako heteropalindromy, semi-palindromy, półpalindromy, reversgramy, mynoretehs, odwracalne anagramy, reversals lub anadromy) są słowami, które są również słowami, gdy zostały przeliterowane. Oto kilka przykładów:

  • Totem <=> Remis
  • Wydobyty <=> Dżins
  • Części <=> Pasek

Biorąc pod uwagę dodatnią liczbę całkowitą N (poprzez argument funkcji lub STDIN), zwróć / wypisz listę semordnilaps z tej listy angielskich słów , które mają dokładnie N liter. Lista słów mogą być zapisywane lokalnie na komputerze jako plik tekstowy o nazwie: w.txt. Możesz także pobrać listę z adresu URL, ale zostanie ona uwzględniona w liczbie bajtów.

Zasady:

  1. Palindromy nie są semordnilapsami! Dlatego słów „południe”, „rotor” i „radar” nie należy umieszczać na liście.
  2. Tylko jedno słowo (w parze semordnilap) powinno znajdować się na liście. Dlatego jeśli „pies” znajduje się na liście, „bóg” nie powinien być (nie ma znaczenia, który z nich jest uwzględniony).
  3. Jeśli nie ma semordnilaps, wynikiem powinien być pusty ciąg, 0, FAŁSZ lub coś innego wskazującego, że nie było żadnych wyników. Funkcja musi działać, nawet jeśli nie ma żadnych wyników.

To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach!


Tabela liderów

Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań dla każdego języka oraz b) jako ogólnej tabeli wyników.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

## Perl, 43 + 2 (-p flag) = 45 bytes

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

Stewie Griffin
źródło
5
Czy liczba pojedyncza Emordnilapi mnoga nie powinna być Semordnilap? ;)
FryAmTheEggman
1
„Palindromy nie są semordnilapsami!” Wow, to zdanie / kula nie mogą być bardziej niejasne, ale teraz rozumiem, co masz na myśli. Słowa, które same są odwrócone, nie są semordnilaps.
kot

Odpowiedzi:

10

Pyth , 23 (kod 18, 5 niezbędnych STDIN)

J'f&qlTQ&}_TJ>_TTJ

Jest to dość proste rozwiązanie.

Jprzechowuje listę słów. Następnie filtrujemy listę słów ( f J) według długości słowa będącego wejściem ( qlTQ), odwrócone słowo znajduje się na liście ( }_TJ), a odwrócenie słowa jest większe niż słowo ( >_TT). Ostatni warunek zapewnia T, że nie jest palindromiczny i że drukowana jest tylko jedna z tych par. Powstała lista zostanie wydrukowana.

Jak działa Pyth, jedynym sposobem otwarcia pliku jest otrzymanie jego nazwy na STDIN. Dlatego policzyłem 5 z bajtów STDIN w.txt, w moim wyniku.

Przykładowy przebieg:

$ pyth -c "J'f&qlTQ&}_TJ>_TTJ" <<< '6
w.txt'
['animal', 'denier', 'diaper', 'drawer', 'pupils', 'recaps', 'redraw', 'sleets', 'snoops', 'sports']
isaacg
źródło
10

Rubinowy, 74 bajty

f=->n{i=IO.read('w.txt').split
p *i&[f.reverse]if f.size==n while f=i.pop}

Iteruje po liście, usuwając elementy, co pozwala uniknąć obu palindromów i wyświetla zarówno „stres”, jak i „desery”. Użycie tej samej nazwy zmiennej dla funkcji i iteratora omija dziwaczną składnię Ruby: nawet jeśli f=i.popzostanie to wcześniej ocenione f.reverse, linia nie zostanie przeanalizowana, chyba fże coś już znaczy. Mógłbym również użyć p.

histocrat
źródło
4

bash 134 157 118 bajtów

f () { comm -12 <(sort w.txt) <(rev w.txt|sort)|while read w; do ((${#w}==$1))&&[[ $w<$(rev<<<$w) ]]&&echo $w; done; }

To nie jest poważny wpis, ale raczej w odpowiedzi na odpowiedź Briana Basha . Właśnie tak myślę o programowaniu tego rodzaju rzeczy w Bash - używając samego Basha tak mało, jak to możliwe, i pozwalając wbudowanym narzędziom wykonać całą pracę.

Aaron Davies
źródło
W każdym razie dostaniesz zarówno słowo, jak i jego odbicie, możesz po prostu powtórzyć „$ w” i nie zawracać sobie głowy dodatkowym sortowaniem i ogonem. Jeśli to zrobisz, wynik powinien być już posortowany, aby można było również usunąć sortowanie końcowe.
Orion
Nie podążam. Jak mam zrobić dedupe w twoim podejściu?
Aaron Davies,
Poza tym całkowicie zapomniałem usunąć palindromy. Naprawiony.
Aaron Davies,
Niestety, brak snu ... naprawdę musisz porównać z odwrotnością, aby zachować tylko jedną z nich, ale nie musisz się przejmować palindromami, a reszta moich komentarzy jest nadal aktualna. A teraz, kiedy o tym wspominasz, bash ma operator porównywania ciągów, więc &&[[ $w > $(rev<<<$w) ]]&& echo $wnadal unika sort|tail -1. Dzięki temu myślę, że możesz nawet upuścić ostatni rodzaj i unikat, ponieważ usuwa on palindromy i wyświetla tylko jedno ze słów.
orion,
Poza tym bezużyteczny kot na początku: <(sort w.txt)jest w porządku.
orion,
4

Python, 126 125 120 bajtów

N=input()
J=open("w.txt").read().split()
for c in set(J):
 if N==len(c)and c!=c[::-1]and c[::-1]in J:print c;J.remove(c)

Całkiem proste rozwiązanie.

Claudiu
źródło
Wydaje się, że jest krótszy do zdefiniowania k=c[::-1]. Czy nie możesz zadzwonić set()tylko za drugim razem? Nie sądzę, żeby w pliku były powtórzenia?
FryAmTheEggman
@FryAmTheEggman: Właściwie zajęłoby 11 znaków k(9 dla definicji plus 1 dla nowej linii plus 1 dla spacji), ale zapisałbym tylko 10 znaków (wyjmij [::-1]dla 6, ale dodaj 1, bo wtedy potrzebuję spacji). O tym set, muszę Jbyć zestawem, ponieważ usuwam z niego używane słowa, aby spełnić zasadę braku dupe
Claudiu
przełączenie na N==len(c)andoszczędność miejsca.
isaacg
@isaacg: Ach tak, ty
Claudiu
Jesteś niski i =powinien być ==.
isaacg
3

CJam, 48 47 45 42 38 bajtów

Ponieważ adres URL musi być policzony, używam tego samego skracacza adresów URL co Optymalizator.

"ri.ms/§"gDcN+/{,ea~i=},_Wf%&{_W%>},N*

§Jest częścią rozszerzonego ASCII, więc każdy znak w kodzie mogą być zakodowane w jednym bajcie.

Podobnie jak w przypadku Optymalizatora, będziesz musiał użyć interpretera Java i uruchomić go lokalnie z pliku, powiedzmy semordnilap.cjam, a następnie

java -jar cjam-0.6.2.jar semordnilap.cjam <N>

więc dane wejściowe podano jako argument wiersza poleceń.

Jak to działa (nieco nieaktualne):

"Prepare word list:";
"ri.ms/§"gDcN+/ 
"ri.ms/§"g      "Fetch list from shortened URL.";
          DcN+  "Create \r\n string.";
              / "Split input into lines.";

"Process input:";
{,ea~i=},
{      }, "Filter the list.";
 ,        "Get word length.";
  ea      "Push command-line arguments.";
    ~     "Unwrap array.";
     i    "Convert to integer.";
      =   "Check equality.";

"Find all palindromes and semordnilaps:";
_Wf%&
_     "Duplicate list.";
 Wf%  "Reverse each line.";
    & "Set intersection.";

"Remove duplicates and palindromes:";
{_W%>},N*
{    },   "Filter list.";
 _W%      "Duplicate word, reverse.";
    >     "Check lexicographic order.";
       N* "Join with newlines.";

Powstały ciąg jest automatycznie drukowany na końcu programu.

Martin Ender
źródło
3

Java, 280 218 bajtów

W porównaniu z resztą zawodów absolutnie nie mam pojęcia, czy to dobry wynik.

void a(int n)throws Exception{List<String>l=Files.readAllLines(Paths.get("w.txt"));for(String s:l){String c=new StringBuilder(s).reverse()+"";if(s.length()==n&&c.compareTo(s)>0&&l.contains(c)){System.out.println(s);}}}

Rozszerzony:

void a(int n)throws Exception{
    List<String>l=Files.readAllLines(Paths.get("w.txt"));
    for(String s:l){
        String c=new StringBuilder(s).reverse()+"";
        if(s.length()==n&&c.compareTo(s)>0&&l.contains(c)){
            System.out.println(s);
        }
    }
}

Używa funkcji CompareTo () do jednoczesnego ignorowania palindromów i duplikatów.

Stretch Maniac
źródło
2
Java zawsze będzie wiać w golfa.
Rodolfo Dias,
Nigdy wcześniej nie widziałem Files.readAllLines(Paths.get("w.txt")). To przydatna sztuczka.
Ypnypn,
2

CJam, 68 bajtów

"www.ri.ms/§"gDc-N/{_,ea~~=\_W%=!*},:Q{_W%aQ\/,({Q\a-:Q;1}{;0}?},N*

Musisz pobrać stąd wersję kompilatora Java i zapisać powyższy kod w pliku o nazwie words.cjam (może mieć dowolną nazwę). Następnie uruchom kod podobny do

java -jar cjam-0.6.2.jar <file_name> <input_number> [> <output_file_name>]

Na przykład w przypadku N = 8,

java -jar cjam-0.6.2.jar words.cjam 8 > out.txt  
Optymalizator
źródło
Java - to nie skrót. Proszę nie przeliteruj JAVA.
FUZxxl
@FUZxxl tyle samo można edytować.
Optymalizator
Nie jestem policjantem. Ludzie mają różne opinie na temat pisowni i szanuję twoją opinię. Po prostu sugeruję, żebyś nie pisał w Javie, jakby to był akronim, nie chcę narzucać ci innego zaklęcia.
FUZxxl
@FUZxxl Naprawdę nie w połowie: D
Optymalizator
2

Node.js, 172 bajty

Funkcjonować:

function d(n){return(require('fs').readFileSync("w.txt")+"").match(RegExp(("b"+Array(n+1).join("(.)")+"b(?=(.|s)*b"+"87654321".substr(-n)+"b)").replace(/\w/g,"\\$&"),"g"))}

Testowanie:

console.log(d(+process.argv[2]));
// run from command line like this:
// node main 4
// where
//   main is js file name
//   4    is length
Qwertiy
źródło
2

K, 59 bajtów

{*+?{x@<x}'+(w;r)@\:&(x=#:'w)&(~w~'r)&w in r:|:'w:0:`w.txt}

Całkiem proste. Przeczytaj listę, zbuduj listę odwrotną, weź ich skrzyżowanie, odfiltruj palindromy, odfiltruj wymaganą liczbę, posortuj i deduplikuj pary.

Aaron Davies
źródło
2

Rubinowy, 95 bajtów

f=->n{l=[]
(a=IO.read"w.txt").split.map{|w|a[w]=?.
w.size==n&&a[/^#{r=w.reverse}\s$/]&&l<<w}
l}

Wyjaśnienie

  • Dane wejściowe są traktowane jako argument dla lambda. Oczekuje Integer.
  • Wczytaj plik do pamięci jako String( a).
  • Pętla przez Arraywszystkie słowa (bez znaków nowej linii).
    • Usuń słowo z a.
    • Dodaj odpowiednie słowa do Array l.
  • Return l.

Puste Arrayjest zwracane, gdy nie znaleziono żadnych kwalifikujących się słów.

Britishtea
źródło
1

Node.js, CoffeeScript, 132 bajty

f=(n)->(require('fs').readFileSync('w.txt')+'').split('\n').filter((s,i,f)->s.length==n&&f.indexOf(s.split('').reverse().join(''))>i)

Node.js, 162 bajtów

function a(n){return(require('fs').readFileSync('w.txt')+'').split('\n').filter(function(s,i,f){return s.length==n&&f.indexOf(s.split('').reverse().join(''))>i})}

Chrome Dev Tools Console, 111 bajtów (na stronie pobierania)

f=(n=>$('pre').innerText.split('\n').filter((x,i,a)=>x.length==n&&a.indexOf(x.split('').reverse().join(''))>i))

Wszystkie wersje zwracają tablicę wszystkich Semordnilaps długości n.

Node.js, 162 bajtów

Wyświetla wszystkie semordnilaps:

function a(n){(require('fs').readFileSync('w.txt')+'').split('\n').map(function(s,i,f){s.length==n&&f.indexOf(s.split('').reverse().join(''))>i&&console.log(s)})}
cPu1
źródło
1

Julia, 101 bajtów

k=split(readall("w.txt"))
for(i=k)
([]!=(l=find(x->x==reverse(i)&&x!=i,k)))&&(println(i);k[l]="")
end

To powinno faktycznie działać ...

eaglgenes101
źródło
1

Mathematica, 105 bajtów

F[f_,n_]:=(W=StringSplit@Import@f;Select[W,StringLength@#==n&&MemberQ[W,r@#]&&Order[r@#,#]==1&&r@#!=# &])

Czasami Import automatycznie podzieli tekst na listę linii lub potraktuje jako CSV lub TSV. W innym przypadku Import odczyta zawartość pliku do łańcucha. Import zrobił to drugie dla danych testowych.

testy

Ming-Tang
źródło
0

GRZMOTNĄĆ

f() {
  w=($(cat "${1}"))
  for ((i=0;i<=${#w[@]};i++)); do
    if ((${#w[$i]} == $2)); then
      r=
      for((x=${#w[$i]}-1;x>=0;x--)); do
        r="$r${w[$i]:$x:1}";
      done
      if [[ ${w[$i]} != ${r} ]] && grep -qw $r "${1}"; then
        echo "${w[$i]}, ${r}"
      fi
      unset w[$i]
    fi
  done
}

testy ...

f /usr/share/dict/words 5

debut, tubed
decaf, faced
decal, laced
deeps, speed
denim, mined
devil, lived
draws, sward
faced, decaf
keels, sleek
knits, stink
laced, decal
lager, regal
leper, repel
lever, revel
lived, devil
loops, spool
loots, stool
mined, denim
parts, strap
peels, sleep
pools, sloop
ports, strop
rebut, tuber
regal, lager
remit, timer
repel, leper
revel, lever
sleek, keels
sleep, peels
sloop, pools
smart, trams
snaps, spans
snips, spins
spans, snaps
speed, deeps
spins, snips
spool, loops
spots, stops
sprat, tarps
stink, knits
stool, loots
stops, spots
strap, parts
straw, warts
strop, ports
sward, draws
tarps, sprat
timer, remit
trams, smart
Brian
źródło
2
Myślę, że to nie jest bardzo gra w golfa ..? To byłaby miła odpowiedź na temat przepełnienia stosu (gdyby zawierał kilka komentarzy i wyjaśnień).
Stewie Griffin
1
Zgadzam się, to była moja pierwsza iteracja rozwiązania tego w bash. Zmęczyłem się, aby uczynić to tak czytelnym jak to możliwe. ale jeśli chodzi o golfa. to bardziej, jak postrzeliłem 9 na par 3: -)
Brian