คัดค้านสตริง


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(ฉันเล่น Scrabble มาก)
AdmBorkBork

4
@ wsbltc มีน้อยคนนัก แต่พวกเขาทุกคนยืมคำจากภาษาอื่น ๆ ได้อย่างน่าสงสัยดังนั้นพวกเขาจึงนับว่าเป็นภาษาอังกฤษจริงๆ ดังนั้นเราสามารถสรุปได้ว่า a qตามด้วย a uในสตริงเสมอหรือไม่?
แมวธุรกิจ

3
ใช่คุณสามารถสันนิษฐานได้ว่ามันมีu

11
ความท้าทายนี้จะทำให้คนอวดรู้ dishappy ค่อนข้าง ...
Spratty

คำตอบ:


10

Python ขนาด 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'.findส่งคืนค่า 0 สำหรับ'r', 5 สำหรับqและ -1 สำหรับทุกสิ่งที่ไม่มีอยู่ในสตริง ในการรับค่าที่ต้องการจาก 0 ถึง 6 เรายังคงต้องลบค่าส่งคืนจาก 5 เป็นผลลัพธ์ในรหัสนี้:

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

มันน่ารักจริงๆ!
Steve Bennett

บางคนสามารถอธิบายได้ว่านรกทำงานอย่างไร ผมเข้าใจในสิ่งที่เกิดขึ้นกับโน้ตชิ้น แต่สิ่งที่เป็นสตริงมายากลddiiiiuiimmlrnssและrlmphqและจำนวน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 ซึ่งหากอ้างอิงจะส่งผลให้ prepending unจึงดีพอ ๆ กันจะเป็นอะไรอื่นที่ไม่ใช่หรือhp


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

การแก้ไข:

  • บันทึกแล้ว 7 ไบต์ขอบคุณ @ErtySeidohl ( charAt(0)-> [0])
  • 3 ไบต์ที่บันทึกไว้ต้องขอบคุณ @ edc65 (การกำหนดคำนำหน้าที่แบ่งปันให้กับตัวแปร)

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=>...? (อาจครอบคลุมในคำถามที่พบบ่อยที่ไหนสักแห่ง ... )
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

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ตรวจสอบตัวอักษรตัวแรกของคำกับรายการของคำนำที่กำหนดเองและถ้าเป็นเช่นนั้นการเปลี่ยนแปลงคำนำหน้าจากค่าเริ่มต้นของ เคสพิเศษquมีราคา 21 ไบต์


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
อาร์จัน

และด้วยการที่คุณมี 2,500 ตัวแทน! ขอแสดงความยินดี!
อาร์จัน

และดัชนีผู้ใช้ของคุณคือ 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

ในกรณีนี้ต้องการคำอธิบายใด ๆ ฉันใช้ประโยชน์จากคู่ q / h และ m / p โดยรวมดัชนีของพวกเขาในสตริงการค้นหากับ mod 4 แล้วใช้มันเป็นการค้นหาในอาร์เรย์คำนำหน้า


คำตอบที่ดี บันทึก 1 ไบต์ใช้แทนsearch indexOfและอีกอย่างฉันคิดว่าใช้&แทน%
edc65

ขอบคุณ! searchผมไม่ทราบเกี่ยวกับ ไม่เห็นวิธีที่จะทำให้ & เคล็ดลับ - จะสมบูรณ์แบบถ้าอาร์เรย์ของฉันมีองค์ประกอบเพียง 4 อย่าง
Steve Bennett


1

Mathematica, 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 มี builtin สำหรับทุกสิ่งหรือไม่?


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

บันทึกสองสามไบต์โดยการตอบกลับใน UPPERCASE เช่น potent -> IMPOTENT


0

Perl, 49 + 1 ( -pธง) = 50 ไบต์

s|^[hq]|dis$&|||s|^[lmr]|i$&$&|||s|p|imp|||s||un|

โดยใช้:

perl -pe 's|^[hq]|dis$&|||s|^[lmr]|i$&$&|||s|p|imp|||s||un|' <<< responsible

ลองมันออนไลน์


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.