Semordnilaps 찾기


21

Semordnilaps (이종 회문, 반 회문, 반 회문, 리버스 그램, 근종, 가역적 아나그램, 단어 반전 또는 아노 드롬이라고도 함)는 철자가 틀린 단어입니다. 몇 가지 예는 다음과 같습니다.

  • 와드 <=> 그리기
  • 채광 <=> 데님
  • 부품 <=> 스트랩

양의 정수 N (함수 인수 또는 STDIN을 통해)이 주어지면 이 영어 단어 목록에서 semordnilaps 목록을 반환 / 출력하십시오 . 단어 목록은 다음과 같은 텍스트 파일로 컴퓨터에 로컬로 저장할 수 있습니다 w.txt. URL에서 목록을 가져올 수도 있지만 바이트 수에 포함됩니다.

규칙 :

  1. 회문 은 semordnilaps가 아닙니다! 따라서 "정오", "로터"및 "레이더"라는 단어는 목록에 포함되지 않아야합니다.
  2. semordnilap 쌍의 단어 중 하나만 목록에 포함해야합니다. 따라서 "dog"이 목록에 있으면 "god"가 없어야합니다 (어떤 것이 포함되어 있는지는 중요하지 않습니다).
  3. semordnilap이 없으면 출력은 빈 문자열, 0, FALSE 또는 결과가 없음을 나타내는 다른 것이어야합니다. 결과가없는 경우에도 기능이 작동해야합니다.

이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


리더 보드

이 게시물의 맨 아래에있는 스택 스 니펫은 답변 a) 언어 당 가장 짧은 솔루션 목록으로, b) 전체 리더 보드로 카탈로그를 생성합니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

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

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

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

언어 이름을 링크로 만들면 스 니펫에 표시됩니다.

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



5
단수형이어야 Emordnilap하고 복수형이어야 Semordnilap합니까? ;)
FryAmTheEggman

1
"회막은 semordnilaps가 아닙니다!" 와, 그 문장 / 글 머리 기호는 더 명확하지 않을 수 있지만 이제는 당신이 무슨 뜻인지 알 수 있습니다. 뒤집어 졌을 때의 단어는 semordnilap이 아닙니다.
고양이

답변:


10

Pyth , 23 (18 코드, 5 필수 STDIN)

J'f&qlTQ&}_TJ>_TTJ

이것은 매우 간단한 해결책입니다.

J단어 목록을 저장합니다. 그런 다음 f J입력 된 단어 길이 ( qlTQ), 반대 단어는 목록 ( }_TJ), 단어 반전은 단어 ( >_TT) 보다 큰 단어 목록 ( ) 을 필터링 합니다 . 마지막 조건은T 회문이 아니며 쌍 중 하나만 인쇄되도록합니다. 결과 목록이 인쇄됩니다.

Pyth가 작동하는 방식에서 파일을 여는 유일한 방법은 STDIN에서 파일 이름을받는 것입니다. 이것이 내가 STDIN 바이트의 5를 세는 이유입니다.w.txt 내가 점수에서 입니다.

예제 실행 :

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

10

루비, 74 바이트

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

회문 모두를 피하고 "스트레스"와 "디저트"를 모두 출력하는 요소를 제거하여 목록을 반복합니다. 기능에 대해 동일한 변수 이름을 사용하고 반복자는 걸어 다니는 루비 구문 특질 : 비록 f=i.pop이전에 평가 f.reverse하지 않는 한 라인이 구문 분석하지 않습니다 f이미 무언가를 의미한다. 나는 또한 사용할 수 있습니다 p.


4

떠들썩한 파티 134 157 118 바이트

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

이것은 심각한 항목이 아니라 Brian 's Bash의 답변에 대한 답변 입니다. 이것이 Bash 자체를 가능한 한 적게 사용하고 내장 도구가 모든 작업을 수행하게하여 Bash에서 이러한 종류의 프로그래밍을 생각하는 방법입니다.


어쨌든 통신에서 단어와 그 반사를 모두 얻을 수 있습니다. "$ w"를 에코하고 여분의 정렬과 꼬리를 신경 쓰지 않아도됩니다. 그렇게하면 결과가 이미 정렬되어 있으므로 최종 정렬도 제거 할 수 있습니다.
오리온

나는 따르지 않는다. 접근 방식에서 중복 제거를 어떻게 수행합니까?
Aaron Davies

또한 회문을 제거하는 것을 완전히 잊었습니다. 결정된.
Aaron Davies

죄송합니다, 수면 박탈 ... 당신은 실제로 그중 하나만을 유지하기 위해 그 반대와 비교할 필요가 있지만 회문에 대해 신경 쓸 필요는 없으며 나머지 의견은 여전히 ​​유효합니다. bash에는 문자열 비교 연산자가 있으므로 &&[[ $w > $(rev<<<$w) ]]&& echo $w여전히 피하십시오 sort|tail -1. 그것으로, 나는 그것이 회문을 제거하기 때문에 당신도, 최종 종류의 독특한 드롭 수 있다고 생각 하고 단지 단어 중 하나 출력합니다.
오리온

또한 처음에는 쓸모없는 고양이 <(sort w.txt)가 좋습니다.
오리온

4

파이썬 126 125 120 바이트

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)

매우 간단한 솔루션입니다.


정의하는 것이 더 짧은 것 같습니다 k=c[::-1]. 또한 set()두 번째로만 전화를 걸 수 없었 습니까? 파일에 반복이 있다고 생각하지 않습니까?
FryAmTheEggman 2014

@FryAmTheEggman : 실제로 할당하는 데 11 문자가 k필요하지만 (정의의 경우 9 + 개행의 경우 1 + 공백의 경우 1) 저장하지만 10 자만 저장합니다 ( [::-1]6 자를 제외 하고 1 개를 추가하면 공백이 필요합니다). 에 대해 set, 나는 J속지 않는 규칙을 만족시키기 위해 사용 된 단어를 제거하기 때문에 세트가되어야합니다
Claudiu

로 전환 N==len(c)and하면 공간 이 절약됩니다.
isaacg 2014

@isaacg : 아 네, ty
Claudiu

당신은 짧아야 =합니다 ==.
isaacg

3

CJam, 48 47 45 42 38 바이트

URL을 계산해야하므로 Optimizer와 동일한 URL 단축기를 사용하고 있습니다.

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

그만큼 § 확장 ASCII의 일부이기 때문에, 코드의 각 문자는 단일 바이트로 인코딩 될 수있다.

최적화의 경우와 마찬가지로, 당신은 사용해야합니다 자바 인터프리터 와 말, 파일에서 로컬로 실행 semordnilap.cjam다음과

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

입력은 명령 행 인수로 제공됩니다.

작동 방식 (약간 구식) :

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

결과 문자열은 프로그램 끝에서 자동으로 인쇄됩니다.


3

자바, 280 218 바이트

다른 경쟁사와 비교할 때 이것이 좋은 점수인지 전혀 모릅니다.

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

넓히는:

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

compareTo ()를 사용하여 회문과 복제본을 동시에 무시합니다.


2
자바는 항상 골프 경연 대회에 나선다.
Rodolfo Dias

나는 Files.readAllLines(Paths.get("w.txt"))전에 본 적이 없다 . 유용한 트릭입니다.
Ypnypn

2

CJam, 68 바이트

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

여기 에서 Java 버전의 컴파일러를 다운로드해야합니다. 위의 코드를 words.cjam (어떤 이름이든 가능)이라는 파일에 저장해야합니다. 그런 다음 코드를 실행하십시오.

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

예를 들어, 대한 N = 8,

java -jar cjam-0.6.2.jar words.cjam 8 > out.txt  

Java – 약어가 아닙니다. 자바로 철자를 쓰지 마십시오.
FUZxxl

@FUZxxl이 많은 자체 편집 가능 ..
Optimizer

저는 경찰이 아닙니다. 사람들은 철자법에 대해 다른 의견을 가지고 있으며 귀하의 의견을 존중합니다. 나는 단지 약어 인 것처럼 Java의 철자를 쓰지 말 것을 제안한다. 나는 당신에게 다른 철자를 강요하고 싶지 않다.
FUZxxl

@FUZxxl 정말 중간에 없습니다 : D
Optimizer

2

Node.js, 172 바이트

기능:

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"))}

테스트 :

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

2

K, 59 바이트

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

꽤 직설적 인. 리스트를 읽고, 리버스리스트를 구성하고, 교차를 취하고, 회문을 걸러 내고, 필요한 수를 걸러 내고, 쌍을 분류하고 중복 제거하십시오.


2

루비, 95 바이트

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

설명

  • 입력은 람다에 대한 인수로 간주됩니다. 기대합니다 Integer.
  • 파일을 메모리에 String( a) 로 읽습니다 .
  • Array바꿈없이 모든 단어 중 하나 를 반복 합니다.
    • 에서 단어를 제거 a .
    • 에 적합한 단어를 추가하십시오 Array l.
  • 을 반환 l합니다.

Array적합한 단어가 없으면 비어 있습니다.


1

Node.js, CoffeeScript, 132 바이트

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 바이트

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 개발자 도구 콘솔, 111 바이트 (다운로드 페이지)

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

모든 버전은 length의 모든 Semordnilap 배열을 반환합니다 n.

Node.js, 162 바이트

모든 semordnilap을 인쇄합니다 :

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

1

줄리아, 101 바이트

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

이것은 실제로 작동해야합니다 ...


1

수학, 105 바이트

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

때로는 가져 오기에서 텍스트를 자동으로 줄 목록으로 나누거나 CSV 또는 TSV로 취급합니다. 다른 경우 Import는 파일의 내용을 문자열로 읽습니다. 가져 오기는 테스트 데이터에 대해 후자를 수행했습니다.

테스트


0

세게 때리다

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
}

테스트 ...

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

2
골프 골프가 아닌 것 같아요 ..? 이것은 스택 오버플로에 대한 좋은 답변 일 것입니다 (댓글과 설명이있는 경우).
Stewie Griffin

1
동의, 이것은 bash에서 이것을 해결하는 첫 번째 반복이었습니다. 가능한 한 읽을 수 있도록 피곤했습니다. 그러나 골프가가는 한. 파 3에서 9를 쏜 것 같습니다
Brian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.