Негати Рядок


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 Добре небагато , але вони майже всі запозичені слова з інших мов, настільки сумнівно, чи справді вони вважаються англійською. Тож чи можемо ми припустити, що в рядку qзавжди супроводжується a uчи ні?
Ділова кішка

3
Так, ви можете припустити, що у нього завжди єu

10
Цей виклик може зробити педанта дуже нещасним ...
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'.findповертає 0 for 'r', 5 for qі -1 для всього, що не міститься в рядку. Щоб отримати необхідне значення від 0 до 6, нам ще потрібно відняти повернене значення від 5, в результаті чого цей код:

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

Це справді мило!
Стів Беннетт

Хтось може пояснити, як це, чортве, працює? Я розумію, що відбувається з позначенням фрагмента, але що таке магічні рядки ddiiiiuiimmlrnssта rlmphqчисельність 5, чому фрагмент пропускає 7?
Кітінг

@Keatinge додав пояснення. Я сподіваюсь, що це допоможе вам
п.

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-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=>...? (Можливо, десь
Стів Беннетт

@SteveBennett так, це законно.
Називання

1
w=>({q:a='dis',h:a,l:'il',m:b='im',p:b,r:'ir'}[w[0]]||'un')+wНа 3 байти менше
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$+

Перший раз я використовував сітківку. Це досить акуратна мова.

Спробуйте в Інтернеті!


Дуже приємно спершу спробувати мову! +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

Якщо це потребує будь-якого пояснення, я використовую переваги пар q / h та m / p, комбінуючи їх індекс у рядку пошуку з mod 4, а потім використовую його як пошук у масиві префіксів.


Чудова відповідь. Збережіть 1 байт, використовуючи searchзамість indexOf. І ще деякі, я думаю, використовуючи &замість%
edc65

Дякую! Я про це не знав search. Не можу зрозуміти, як змусити & трюк працювати - було б ідеально, якби у мого масиву було лише 4 елементи.
Стів Беннетт


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

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

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)

Анонімна функція, використовує відповідність шаблону на своєму першому знаку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.