문자열 무효화


12

면책 조항 : 이것은 내 도전이 아니지만 ThisGuy 는 게시 해도 괜찮다고 말했습니다.


같은 때때로 나는 그것의 반대에 단어를 만들고 싶어 happiness간다 unhappiness. 불행히도 이런 일이 생기면 때때로 내 뇌가 비게됩니다. 그러던 어느 날, 또 다른 일이 일어 났을 때, 나는 내 자신에게 "이것은 프로그램이 무엇인가!"라고 생각했습니다.

영어에는 많은 예외가 있으므로 시작 문자의 접두사를 포함하는 목록을 만들었습니다.

q or h          -> dis- (honest -> dishonest)
l                -> il-  (legal -> illegal)
m or p           -> im-  (mature -> immature)
r                -> ir-  (responsible -> irresponsible)
everything else  -> un-  (worthy -> unworthy)

직무

문자열로 입력이 주어지면 문자열을 음수로 만들고 결과를 출력하십시오. 주어진 모든 입력이 위의 규칙에 적합하다고 가정 할 수 있습니다. 제출물은 스 니펫이 아닌 프로그램이나 기능 일 수 있습니다.

입력

매개 변수 또는 STDIN에서 가져온 단일 문자열

산출

위 규칙에 따라 해당 문자열의 부정 형식

이기는 방법

이것은 이므로 가장 짧은 코드가 승리합니다.


4
우리는 우리가 가진 단어 그 시작을 못할거야 가정 할 수 q없이 u?
비즈니스 고양이

3
내 머리의 맨 오프 qadi, qat, 전술 qi, qirsh그리고 qwerty. (나는 많은 글자 맞추기를한다)
AdmBorkBork

4
@wsbltc 글쎄, 공정한 몇 가지 가 있지만 다른 언어에서 빌린 모든 단어가 실제로 영어로 간주되는지 의심 스럽습니다 . 따라서 문자열에서 qa 뒤에 항상 a 가 오는 것으로 가정 할 수 u있습니까?
비즈니스 고양이

3
예 당신은 항상 가지고 가정 할 수있다u

11
이 도전은 pedant를 아주 불행하게 만들 수 있습니다 ...
Spratty

답변:


10

파이썬, 55 바이트

lambda n:'ddiiiiuiimmlrnss'[5-'rlmphq'.find(n[0])::7]+n

온라인으로 사용해보십시오!


우리는 7 가지 시작 문자를 처리해야합니다 :
g-> dis, h-> dis, p-> im, m-> im, l-> il, r-> ir및 기타 모든 것 ->un

이러한 모든 부정을 단일 문자열로 저장하고 슬라이싱을 통해 올바른 것을 추출 할 수 있습니다.

 d      i      s
  d      i      s
   i      m
    i      m
     i      l
      i      r
       u      n

'ddiiiiuiimmlrnss'[i::7]

이제 시작 인덱스를 계산해야합니다 i. 문자열에 포함되지 않은 모든 항목에 대해 'rlmphq'.find0 'r', 5에 대해 q-1을 반환 합니다. 필요한 값을 0에서 6으로 얻으려면 여전히 5에서 반환 값을 빼야합니다.이 코드는 다음과 같습니다.

'ddiiiiuiimmlrnss'[5-'rlmphq'.find(n[0])::7]

정말 귀여워요!
Steve Bennett

누군가 이것이 어떻게 작동하는지 설명 할 수 있습니까? 나는 슬라이스 표기법으로 무슨 일이 일어나고 있는지 이해하지만, 마술 줄 ddiiiiuiimmlrnssrlmphq숫자 5는 무엇이며, 왜 슬라이스가 7을 건너 뜁니까?
Keatinge

@Keatinge 님이 설명을 추가했습니다. 도움이 되길 바랍니다
ovs

6

GNU sed , 50 바이트

에 +1 포함 -r

s/^q|^h/dis&/
s/^l|^r|^m/i&&/
s/^p/imp/
t
s/^/un/

멋진 것은 없습니다. &대체에 사용 하여 몇 개의 대체를 결합 t하고 첫 번째 대체 중 하나가 발생하면 마지막 대체 를 건너 뜁니다.

온라인으로 사용해보십시오!


5

젤리 , 30 바이트

1ị“qmlrrhp”iị“3bµWI⁼ṡ÷ʠ$»œs5¤;

온라인으로 사용해보십시오!

어떻게?

1ị“qmlrrhp”iị“3bµWI⁼ṡ÷ʠ$»œs5¤; - Main link: string
1ị                             - 1 index into the string (first character of the string)
           i                   - 1-based index of 1st occurrence of that in (else zero):
  “qmlrrhp”                    -     char list "qmlrrhp"
            ị                  - index into (1-based and modulo):
                            ¤  -     nilad followed by link(s) as a nilad:
             “3bµWI⁼ṡ÷ʠ$»      -         compressed string "dis"+"imili"+"run"="disimilirun"
                         œs5   -         split "equally" into 5: ["dis","im","il","ir","un"]
                             ; - concatenate with the string

반복 r되는 “qmlrrhp”은 5 번째 인덱스에 있으며 참조 할 경우 앞에을 추가 un하여 h또는 이외의 다른 것이 될 수 있습니다 p.


4

/// , 59 56 바이트

/^/\/\/#//#qu/disqu^h/dish^l/ill^m/imm^p/ipp^r/irr^/un/#

온라인으로 사용해보십시오!

입력은 가장 마지막에갑니다 #.

작동 방식 :

크기를 56 바이트로 줄인 최적화를 만들었지 만 복잡하기 때문에 원래 버전을 설명하고 골프를 설명합니다.

/#qu/disqu//#h/dish//#l/ill//#m/imm//#p/ipp//#r/irr//#/un/# |everything after the ` |` is not code.
/#qu/disqu/                                                 |replace `qu` with `disqu`
           /#h/dish/                                        |replace `h` with `dish`.
                    /#l/ill/                                |replace `l` with `ill`.
                            /#m/imm/                        |replace `m` with `imm`.
                                    /#p/ipp/                |replace `p` with `ipp`.
                                            /#r/irr/        |replace `r` with `irr`.
                                                    /#/un/  |replace everything else with `un`.
                                                          # |safety control

직감 : 도전은 충분히 간단합니다. 단어의 시작에 따라 부정적인 것을 추가하십시오. 그러나 ///에서는 단지 concatenate if [...]특정 패턴을 따르는 것만 바꿀 수 는 없습니다 . 따라서이 프로그램에서 양의 단어 시작은 음의 단어 시작으로 대체됩니다. 은 #확실히 새로운 시작을 첨가되면 더 이상 새로운 시작이 추가되지 것입니다 있는지 확인하기 위해 추가되었습니다. 은 #또한 ': 않은 다른 모든 것들'을 수행하는 것이 가능했다.

골프는 그가 처음 시작할 때 새로운 대체물을 포함합니다 : /^/\/\/#/. 이것은 모든 대체 ^//#원래 버전의 일반적인 패턴이었다을.


3

TI 기본, 104 바이트

Prompt Str0
sub(Str0,1,1→Str2
Str0
If Str2="Q" or Str2="H
"DIS"+Ans
If Str2="L
"IL"+Ans
If Str2="M" or Str2="P
"IM"+Ans
If Str2="R
"IR"+Ans
If Ans=Str0
"UN"+Ans
Ans

모든 대문자가 필요합니다.

설명:

Prompt Str0             # 4 bytes, input user string to Str0
sub(Str0,1,1→Str2       # 12 bytes, store first character in Str2
Str0                    # 3 bytes, store Str0 in Ans
If Str2="Q" or Str2="H  # 14 bytes, if the first letter was Q or H
"DIS"+Ans               # 8 bytes, store DIS+Ans in Ans
If Str2="L              # 7 bytes, If the first letter was L
"IL"+Ans                # 7 bytes, store IL+Ans in Ans
If Str2="Q" or Str2="H  # 14 bytes, if the first letter was Q or H
"IM"+Ans                # 7 bytes, store DIS+Ans in Ans
If Str2="R              # 7 bytes, if the first letter was R
"IR"+Ans                # 7 bytes, store IR+Ans in Ans
If Ans=Str0             # 6 bytes, if Ans has not been changed (first letter was none of the above)
"UN"+Ans                # 7 bytes, store UN+Ans in Ans
Ans                     # 1 byte, implicitly return Ans

3

자바 스크립트 ( 71 64 61 bytes)

w=>({q:a='dis',h:a,l:'il',m:b='im',p:b,r:'ir'}[w[0]]||'un')+w

편집 :

  • @ErtySeidohl ( charAt(0)-> [0]) 덕분에 7 바이트 절약
  • @ edc65 덕분에 3 바이트 절약 (변수에 공유 접두사 할당)

var f = w=>({q:a='dis',h:a,l:'il',m:b='im',p:b,r:'ir'}[w[0]]||'un')+w;

function onChange() {
   var word = event.target.value;
   var output = f(word);
   document.getElementById('output').innerHTML = output;
}
Input Word: <input type='text' oninput='onChange()'/><br/>
Output Word: <span id="output">


1
IE7과의 하위 호환성에 신경 쓰지 않는다면 w[0]대신 사용할 수 w.charAt(0)없습니까?
Erty Seidohl

@ErtySeidohl 감사합니다! 새로운 것을 배웠다 ;-)
forrert

나는 여기에 처음이지만, 단지 시작으로 대답하는 것이 합법적 w=>...입니까? 실제 함수 정의에는 let f=w=>...? (아마도 FAQ에서 다룰 것입니다 ...)
Steve Bennett

@SteveBennett 예, 합법적입니다. 기능을 명명하는 것은 관련이 없습니다
edc65

1
w=>({q:a='dis',h:a,l:'il',m:b='im',p:b,r:'ir'}[w[0]]||'un')+w3 바이트 미만
edc65 10

2

배치, 114 바이트

@set/pw=
@set p=un
@for %%p in (dis.q dis.h il.l im.m im.p ir.r)do @if .%w:~,1%==%%~xp set p=%%~np
@echo %p%%w%

사용자 정의 접두사 목록과 비교하여 단어의 첫 문자를 확인하고 접두사를 기본값 인에서 변경합니다 un. qu21 바이트의 비용으로 특수 케이스 가 가능합니다.


2

하스켈, 71 바이트

f l=maybe"un"id(lookup(l!!0)$zip"qhlmpr"$words"dis dis il im im ir")++l

사용 예 : f "legal"-> "illegal". 온라인으로 사용해보십시오!

입력 문자열의 첫 번째 문자를 "un"찾을 수없는 경우 기본값으로 찾도록 접두사 / 대체 쌍의 찾아보기 테이블을 빌드하십시오 .


2

레티 나 , 54 바이트

^[^hqlmpr]
un$+
^[hq]
dis$+
^l
il$+
^[mp]
im$+
^r
ir$+

설명:

             {implicit replace stage}
^[^hqlmpr]   Append un to words starting with none of: hqlmpr
un$+         
^[hq]        Append dis to words starting with h or q
dis$+        
 ^l          Append il to words starting with l
il$+          
^[mp]        Append il to words starting with m or p
im$+    
^r           Append ir to words starting with r
ir$+

처음 Retina를 사용했습니다. 꽤 깔끔한 언어입니다.

온라인으로 사용해보십시오!


아주 좋은 언어를 먼저 시도하십시오! +1
Arjun

그리고 당신은 2500 담당자가 있습니다! 축하합니다!
Arjun

그리고 사용자 인덱스는 26600입니다!
Arjun

너무 완벽한 base-10!
Arjun

2

자바 스크립트, 72 71 66 61 60 59 바이트

w=>('dis....il.im...im.dis.ir'.split('.')[w.charCodeAt(0)-104]||'un')+w

w=>'un.dis.dis.il.im.im.ir'.split('.')['qhlmpr'.indexOf(w[0])+1]+w

예, 기존 솔루션보다 여전히 깁니다. :)

w=>['un','dis','im','il','ir']['qmlrhp'.search(w[0])%4+1]+w

이것이 설명이 필요한 경우 검색 문자열의 색인을 mod 4와 결합 한 다음 접두사 배열의 조회로 사용하여 q / h 및 m / p 쌍을 활용합니다.


좋은 대답입니다. search대신 1 바이트를 저장하십시오 indexOf. 그리고 더 많은 것, &대신에%
edc65를

감사합니다! 나는 몰랐다 search. & 트릭을 작동시키는 방법을 볼 수 없습니다-내 배열이 4 요소 일 경우 완벽합니다.
Steve Bennett


1

수학, 107 바이트

StringReplace[StartOfString~~x:#:>#2<>x&@@@{{"q"|"h","dis"},{"l","il"},{"m"|"p","im"},{"r","ir"},{_,"un"}}]

설명:

StartOfString~~x:#:>#2<>x&첫 번째 인수는 문자열 의 시작 부분에서 일치 하는 문자열 패턴 이고 두 번째 인수는 일치 앞에 추가 할 문자열입니다. 내에서 사용하기에 적합한 지연된 규칙을 반환합니다 StringReplace. 그런 다음 각 쌍에 적용되어 {{"q"|"h","dis"},{"l","il"},{"m"|"p","im"},{"r","ir"},{_,"un"}}규칙 목록이 생성됩니다.

{
  StartOfString~~x:"q"|"h":>"dis"<>x,
  StartOfString~~x:"l":>"il"<>x,
  StartOfString~~x:"m"|"p":>"im"<>x,
  StartOfString~~x:"r":>"ir"<>x,
  StartOfString~~x_:>"un"<>x
}

마지막으로 StringReplace문자열에 연산자를 제공하는 이 목록이 전달 됩니다.


2
Mathmatica에는 모든 것이 내장되어 있습니까?


1

엑셀 78 바이트

=TRIM(MID("  disdisil im im ir un",IFERROR(FIND(LEFT(A1),"qhlmpr"),7)*3,3))&A1

81 바이트를 기록한 다른 방법을 사용하여 가까운 경쟁자를 발견했습니다.

=IFERROR(CHOOSE(FIND(LEFT(A1),"qhlmpr"),"dis","dis","il","im","im","ir"),"un")&A1

그리고 84 바이트 :

=IFERROR(TRIM(MID("im disi"&LEFT(A1),MOD(FIND(LEFT(F1),"qlmhrp"),3)*3+1,3)),"un")&A1

0

REXX, 78 바이트

arg a
s.=un
s.q=dis
s.h=s.q
s.l=il
s.m=im
s.p=im
s.r=ir
p=left(a,1)
say s.p||a

대문자로 응답하여 몇 바이트를 절약합니다 (예 : potent-> IMPOTENT).



0

클로저, 65 바이트

#(str(get{\q"dis"\h"dis"\l"il"\m"im"\p"im"\r"ir"}(first %)"un")%)

글쎄, 이것은 지루하다 ... 그러나 나는 그것을 더 짧게 만들 수 없었다. 최소한 공백이 거의 없습니다.


0

오캄, 85

(fun s->(match s.[0]with|'q'|'h'->"dis"|'l'->"il"|'m'|'p'->"im"|'r'->"ir"|_->"un")^s)

익명 함수는 첫 번째 문자에서 패턴 일치를 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.