文字列を無効にする


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
a qなしで始まる単語を取得しないと仮定できますuか?
ビジネス猫

3
、私の頭の上からqadiqat前述のqiqirshqwerty。(私は多くのスクラブルをプレイします)
AdmBorkBork

4
@wsbltcまあ、かなりの数がありますが、それらはほとんどすべて他の言語から借用された単語なので、本当に英語としてカウントされるのか疑問です。それで、文字列内でqaの後に常にa が続くと仮定することができuますか?
ビジネス猫

3
はい、常に持っていると仮定できますu

10
この挑戦は... PEDANTはかなりdishappy作ることができる
Spratty

回答:


10

Python、55バイト

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

オンラインでお試しください!


7つの異なる開始文字を処理する必要があります:
g-> dish-> disp-> imm-> iml-> ilr -> irおよびその他すべて ->un

これらすべての否定を単一の文字列に格納し、スライスを通じて正しいものを抽出できます。

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

'ddiiiiuiimmlrnss'[i::7]

ここで、開始インデックスを計算する必要がありますi。文字列に含まれていないものすべてに対して'rlmphq'.find0、5、および-1を返します。0から6の必要な値を取得するには、5から戻り値を減算する必要があります。このコードは次のようになります。'r'q

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

それは本当にかわいいです!
スティーブベネット

誰かがこれがどのように機能するのか説明できますか?私はスライス表記で何が起こっているのか理解していますが、魔法の文字列ddiiiiuiimmlrnssrlmphq数字5は何ですか、なぜスライスは7をスキップしますか?
キーティンゲ

@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”、参照されている場合、前に付けることになる第五指標である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 [...]。特定のパターンに続くもののみを置き換えることができます。したがって、このプログラムでは、肯定的な単語の始まりが否定的な単語の始まりに置き換えられます。これ#は、新しい始まりが追加されると、新しい始まりが追加されないようにするために追加されました。また、#「その他すべて:un」を実行できるようになりました。

ゴルフは彼が始めたときに新しい代用を取り入れてい/^/\/\/#/ます:これは、すべて^//#に置き換えます。これは、元のバージョンでは一般的なパターンでした。


3

TI-Basic、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

JavaScript(71 64 61バイト)

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

編集:

  • @ErtySeidohlのおかげで7バイトを節約(charAt(0)->[0]
  • @ 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)か?
アーティセイドール

@ErtySeidohlありがとう!何か新しいことを学んだ
ばかり

私はここに新しいですが、ちょうどで始まる答えを提供することは合法w=>...ですか?実際の関数定義にはlet f=w=>...?(おそらくどこかのFAQでカバーされています...)
スティーブベネット

@SteveBennettはい、それは合法です。関数の名前は関係ありません
-edc65

1
w=>({q:a='dis',h:a,l:'il',m:b='im',p:b,r:'ir'}[w[0]]||'un')+w3バイト少ない
-edc65

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%

単語の最初の文字をカスタムプレフィックスのリストと照合し、その場合はプレフィックスをデフォルトのから変更しますunqu21バイトのコストで特別なケーシングが可能です。


2

Haskell、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
アルジュン

そして、あなたは2500人の担当者を持っています!おめでとう!
アルジュン

そして、あなたのユーザーインデックスは26600です!
アルジュン

そんなに完璧なベース10!
アルジュン

2

Javascript、 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つの要素しかない場合に最適です。
スティーブベネット


1

Mathematica、107バイト

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

説明:

StartOfString~~x:#:>#2<>x&は、最初の引数が文字列の先頭で一致する文字列パターンであり、2番目の引数が一致の前に追加する文字列である純関数です。内での使用に適した遅延ルールを返します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

Excel 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

大文字で返信することにより、例えば、強力な-> IMPOTENTのように、数バイトを節約します。



0

Clojure、65バイト

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

まあこれは退屈です...しかし、私はそれを短くすることができませんでした。少なくとも空白はほとんどありません。


0

OCaml、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.