Війна - це мир. Свобода - це рабство. Невігластво - це сила


69

Як писав Джордж Оруелл у 1984 році :

Війна - мир
Свобода - це рабство
Невігластво - сила

Напишіть програму або функцію, яка бере одну із шести основних слів із цитати Орвелла та виводить її аналог.

Конкретно:

[input] -> [output]
war -> peace
peace -> war
freedom -> slavery
slavery -> freedom
ignorance -> strength
strength -> ignorance

Інші пари введення / виводу не потрібні.

Ви повинні припустити, що слова завжди повністю малі, як вище. Як альтернативи, ви можете вважати , що слова завжди повністю в верхньому регістрі: WAR -> PEACE, PEACE -> WARі т.д.

Виграє найкоротший код у байтах.



2
@Dennis Так. Або все є малі, або все є великими.
Захоплення Кальвіна

3
Не знаю, чи може хтось скористатися цим для більшого стиснення рядків (це не покращило мою оцінку в Піпі), але початкові літери цих слів ( w p f s i) ніде більше не зустрічаються ні в одному зі слів. Інтригуюча властивість.
DLosc

13
Це подвійний
сприятливий

Відповіді:


58

05AB1E , 30 байт

05AB1E використовує CP-1252 .

“ignorance¤í‡î—™šÔÃÒry“#DIk1^è

Спробуйте в Інтернеті! або як тестовий набір

Пояснення

Прямий підхід

  • Натисніть на рядок ignorance strength war peace freedom slavery
  • Розділіть на пробіли
  • Отримайте в списку індекс вхідних даних
  • XOR індекс з 1
  • Отримайте елемент у списку за цим індексом

42
На 14 байт коротше довжини всіх слів. Що навіть це за мова?
DJMcMayhem

65
> Натисніть на струну,ignorance strength war peace freedom slavery я відчуваю, що я пропускаю туди десятків кроків!
Боб


10
Хтось може пояснити, звідки беруться решта слів, окрім "незнання"?
Carcigenicate

36
05AB1E має вбудований словник слів, які представлені по 2 байти кожен: github.com/Adriandmen/05AB1E/blob/master/dictionary.py
Роберт Фрейзер

48

JavaScript (ES6), 80 байт

s=>'freedom,,war,,strength,,slavery,peace,ignorance'.split`,`[s.charCodeAt(1)%9]

Як це працює

Ми використовуємо невелику таблицю пошуку на основі коду ASCII 2-го символу кожного слова, повертаючи індекс його аналога.

Word      | 2nd char. | ASCII code | MOD 9
----------+-----------+------------+------
war       | a         | 97         | 7
peace     | e         | 101        | 2
freedom   | r         | 114        | 6
slavery   | l         | 108        | 0
ignorance | g         | 103        | 4
strength  | t         | 116        | 8

Як бічна примітка, якщо дозволено змішаний регістр, використання war PEACE FREEDOM slavery IGNORANCE strengthз модулем 6 призведе до ідеального хешу.

Тест


2
Це класний підхід. Ніколи б не думав про це.
Carcigenicate

Дуже хороша. Залишки не відрізняються від 6, 7, 8, тому вам потрібно 9.
ShreevatsaR

Використовуючи подільник, як zі потім стискаючи рядок, atobекономить 8 байт?
Пуховик

@Downgoat Чи не знадобиться багато втечі для персонажів поза діапазоном 32-126?
Арнольд

Використовуючи atobви отримуєте рядок, який здебільшого є дійсним JavaScript - врешті-решт вам потрібно залишити лише `\` та завершальну пропозицію. Опублікувати його на цьому веб-сайті може бути важко, але це не скасовує відповідь. Дивіться відповідь perl від smis
edc65

32

Желе , 24 байти

“Ñ=ƘḊ¹ƥ¹Ƙ⁷ṅ8cøGị»Ḳµiɠ^1ị

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

Як це працює

По-перше, маркер

“Ñ=ƘḊ¹ƥ¹Ƙ⁷ṅ8cøGị»

індексує в словник Jelly, щоб створити рядок

strength war peace freedom slavery ignorance

який розбивається на пробіли, щоб отримати рядковий рядок

["strength", "war", "peace", "freedom", "slavery", "ignorance"]

µ починається новий, монадичний ланцюг, з таким масивом рядків як його аргументом, який також є поточним повернутим значенням.

ɠзчитує один рядок введення з STDIN і iзнаходить його індекс попереднього повернутого значення, тобто сформованого масиву рядків.

Тепер ^1беремо побітовий XOR цього індексу і 1 . Для парних індексів - пам'ятайте , що індекси Желе є 1 -А і модульним, тому сила має індекс 1 і невігластво має індекс 6 / 0 - це збільшує індекс; для непарних індексів - це зменшує їх.

Нарешті, виводить рядок у цьому індексі з аргументу ланцюга.


16

Математика, 84 байти

(x="war""peace")(y="freedom""slavery")(z="ignorance""strength")/#/.x->1/.y->1/.z->1&

Пояснення

Більш "арифметичний" з рядками! Як і у пов'язаній відповіді, це ґрунтується на тому, що ви можете "помножити" рядки в Mathematica, що залишить їх неоціненими (подібно до множення двох непризначених змінних x*y), але що Mathematica застосує основні спрощення, як скасування факторів у поділі.

Таким чином , ми починаємо зберігати три пари в якості продуктів в x, y, z, відповідно , і помножити їх все разом:

(x="war""peace")(y="freedom""slavery")(z="ignorance""strength")

Це оцінюється до

"freedom" "ignorance" "peace" "slavery" "strength" "war"

(Mathematica автоматично сортує фактори, але ми не дбаємо про порядок.)

Ми ділимо це введенням, щоб видалити слово, яке ми не хочемо .../#, оскільки Mathematica скасовує фактори. Наприклад, якби вхід "peace"ми закінчили:

"freedom" "ignorance" "slavery" "strength" "war"

Нарешті, ми позбавляємося від пар , ми не зацікавлені, шляхом заміни кожного з x, yі zз 1. Знову ж таки, спрощення Mathematica 1*aвикликає це завжди a. Ця частина виконується за допомогою:

/.x->1/.y->1/.z->1

Приємно те, що Mathematica знає, що це множення, Orderlessтому це знайде два чинники незалежно від того, суміжні вони у творі чи ні. Тільки слово, яке є протилежним до вводу, більше не спарюється у продукті, так що воно не буде вилучене та залишається єдиним результатом.


Аргу, так молодець! Я програю на 7 байт с WordList[][[<|"l"->14007,"t"->17083,"a"->25105,"r"->32106,"g"->33790,"e"->39048|>@#[[2]]]]&.
Грег Мартін

@GregMartin О, WordListприємно. Якщо взяти список символів як введення та повернути рядок, здається, трохи хиткою. ;) З цього приводу, ви можете зробити 4 байти краще x[[7-Position[x={"war","slavery","ignorance","strength","freedom","peace"},#][[1,1]]]]&.
Мартін Ендер

Мене зацікавить ваша думка, але мені здається, ухилення від PP & CG :)
Грег Мартін,

також <|#->#2&~MapThread~{x={"war","slavery","ignorance","strength","fre‌edom","peace"},Reverse@x}|>за 94 байти
Грег Мартін

13

Vim, 60 байт

D3iwar freedom ignorance peace slavery strength <esc>2?<C-r>"
3wdwVp

Спробуйте в Інтернеті! у зворотно сумісному V перекладачі.

Звичайно, якби ми перейшли на V, ми могли б зберегти один байт , використовуючи більш зручний метод введення. Але оскільки це така невелика різниця, я вважаю за краще використовувати версію для не гольфу.

Пояснення:

D                       " Delete this whole line
 3i...<esc>             " Insert the text three times
           2?           " Search backwards twice
             <C-r>"     " For the words we deleted
3w                      " Move three words forward
  dw                    " Delete a word
    V                   " Select this whole line
     p                  " And paste the word we deleted over it

10

C (gcc) , 120 107 байт

f(long*s){long r[2]={0};strcpy(r,s);s=*r>>40?*r>>56?"\n":"":"CE";*r^=*s;r[1]^=69;puts(r);}

Максимальне зловживання покажчиком! Потрібна машина з малою ендіанією та 64-бітні довжини.

Код містить декілька недрукованих матеріалів, але копіювання все одно має працювати.

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


8

Пітон, 81 байт

l='war peace freedom slavery ignorance strength'.split()
lambda s:l[l.index(s)^1]

Або однакової довжини:

l='war slavery ignorance strength freedom peace'.split()
dict(zip(l,l[::-1])).get

Чи дозволяються змінні визначення поза ламбою при використанні лямбда замість повної програми?
smls

1
@smls Так, дивіться цю мета-дискусію . Зауважте, що навіть в іншому випадку можна провести контрабанду lяк необов'язковий аргумент.
xnor

8

Perl 6 , 61 байт

З недрукованими символами, показаними як (тому що StackExchange знімає їх інакше):

{first {s/^\w+<(\0*$//},["���ce","�������","���
����e"X~^$_]}

Ось xxdшістнадцятковий дамп:

00000000: 7b66 6972 7374 207b 732f 5e5c 772b 3c28  {first {s/^\w+<(
00000010: 5c30 2a24 2f2f 7d2c 5b22 0704 1363 6522  \0*$//},["...ce"
00000020: 2c22 151e 0413 011d 1422 2c22 1a13 1c0a  ,".......","....
00000030: 1c06 1a0b 6522 587e 5e24 5f5d 7d0a       ....e"X~^$_]}.

Розширена версія (символи, що не друкуються, замінені послідовностями, а також додано пробіли та коментарі):

{    # A Lambda.
    first {                   # Return first element which:
        s/ ^ \w+ <( \0* $ //  #   after stripping \0 has only word characters left.
    },
    [                                                  # The array to search:
        "\x[7]\x[4]\x[13]ce",                          #   "war" xor "peace"
        "\x[15]\x[1e]\x[4]\x[13]\x[1]\x[1d]\x[14]",    #   "freedom" xor "slavery"
        "\x[1a]\x[13]\x[1c]\n\x[1c]\x[6]\x[1a]\x[b]e"  #   "ignorance" xor "strength"
        X~^ $_                                         #   each xor'ed with the input.
    ]
}

8

Баш , 100 87 86 78 байт

a=peace;e=war;r=slavery;l=freedom;g=strength;t=ignorance;x=${1:1:1};echo ${!x}

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

2-я літера кожного слова однозначно ідентифікує це слово, тому я використовую цей символ як ім'я змінної; значення цієї змінної - відповідне інше слово.

Наприклад, 2-я літера peaceє e, а відповідне слово peaceє war, тому я встановив e=war.

З огляду на рядок введення, другий символ цього рядка використовується як ім'я змінної для підтягування потрібного відповідного слова, використовуючи непряме розширення параметра bash.


8

TI-Basic, 103 84 77 байт

Зведення до однолінійки зберегло багато байтів! Ха-ха, як іронічно було це твердження ...

inString("EALRGT",sub(Ans,2,1
sub("WAR  PEACE FREEDOMSLAVERY STRENGTH IGNORANCE ",9Ans+1,4+Ans

7

Perl , 63 байти

62 байти + -pпрапор.

$_=(slavery,freedom,ignorance,strength,war,peace)[(ord)%6+/h/]

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

ordповертає char код першого символу введеного слова.
Після цього у %6нас є:

- свобода => ord = 102 =>% 6 = 0  
- рабство => ord = 115 =>% 6 = 1  
- незнання => ord = 105 =>% 6 = 3  
- сила => ord = 115 =>% 6 = 1  
- війна => орд = 119 =>% 6 = 5  
- мир => орд = 112 =>% 6 = 4  

Таким чином , у нас є slaveryі strengthяк повернення 1 (так як вони обидва починаються з тієї ж букви), і ніхто не повертався 2. Таким чином, ми додамо 1до strength(це єдине слово , яке буде відповідати /h/), і ми маємо кожне слово переведений з індексом від 0 до 5.


6

R, 86 87 92 байт

Змінено на неназвану функцію та gsubна subкілька байт. В grepвизначає , яка з 3 -х рядків використовуються , і вхідний видаляються з цього рядка з sub.

function(v)sub(v,'',(l=c("warpeace","freedomslavery","ignorancestrength"))[grep(v,l)])


5

Befunge, 89 88 байт

<>_00g1v2+%7~%2~"slavery"0"war"0"freedom"0"ignorance"0"strength"0"peace"
 |p00:-<
@>:#,_

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

Пояснення

Вихідний код із виділеними шляхами виконання

*Почнемо з натискання всіх можливих вихідних рядків на стек, нульове завершення. Ця послідовність виконується праворуч ліворуч, тому значення висуваються у зворотному порядку, оскільки це порядок, який символи знадобляться, коли вони з часом виводяться.
*Потім ми читаємо перші два символи з stdin, що є все, що нам потрібно для ідентифікації вхідного рядка. Якщо взяти значення ASCII першої літери mod 2 плюс другу букву mod 7, отримаємо унікальне число в діапазоні 2 до 7.

Input         ASCII      %2 %7   Sum
[fr]eedom     102 114    0  2    2
[pe]ace       112 101    0  3    3
[sl]avery     115 108    1  3    4
[st]rength    115 116    1  4    5
[ig]norance   105 103    1  5    6
[wa]r         119 97     1  6    7

*Це число може бути використане як своєрідний індекс до списку рядків у стеку. Ітераційно декрементуємо індекс (перший раз на 2), і для кожної ітерації очищаємо по одному рядку зі стека з послідовністю >_.
*Після того, як індекс досягне нуля, у нас залишається правильний вихідний рядок у верхній частині стека, тому ми використовуємо просту послідовність виводу рядка для запису результату в stdout.


2
Мені подобається використання :-<та @>:#"смайлики" тут :)
Тобіас Кіенцлер


5

С, 93

@ Відповідь Арнальда переніс на С

#define F(w)(char*[]){"freedom",0,"war",0,"strength",0,"slavery","peace","ignorance"}[w[1]%9]

4

C (gcc) , 113 108 байт

f(char*s){char*t="5WAR\0+PEACE\09FREEDOM\0'SLAVERY\0;IGNORANCE\0%STRENGTH";while(strcmp(s,++t));puts(t+*--t-47);}

Усі екземпляри \0можна замінити фактичними байтами NUL для оцінки балів.

t+*--t-47невизначена поведінка; це може / не працюватиме з іншими компіляторами.

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


4

JavaScript (ES6), 71 78

Настільки нудна, ніж відповідь Арнальда, але і коротша.

Тепер я додав кодування з btoa. У кодованому рядку є 4 байти, які я не можу розміщувати на цьому сайті, навіть якщо вони є дійсними символами в рядку javascript. Тому я використав шістнадцятковий втечу у формі \xHH. Кожна з цих вхідних місць рахується як 1 байт.

Зашифрований рядок є strength0ignorance0peace0war0slavery0freedom

x=>(w=btoa`²ÚÞ\x9e\x0baÒ('¢¶§qí)y§\x1eÓ\x06«ÒÉZ½êòÑúÞyÚ&`.split(0))[w.indexOf(x)^1]

Цей 82-річний і нечутливий до регістру

x=>',,strength,,slavery,war,,,ignorance,peace,freedom'.split`,`[parseInt(x,36)%15]

Тест

F=
x=>(w=btoa`²ÚÞ\x9e\x0baÒ('¢¶§qí)y§\x1eÓ\x06«ÒÉZ½êòÑúÞyÚ&`.split(0))[w.indexOf(x)^1]

;['freedom','slavery','war','peace','ignorance','strength']
.forEach(w=>console.log(w + ' -> ' + F(w)))


3

CJam, 52 (лише ASCII)

"/.|Mv
DO'y    EK{ {:nBct'Pt}d4sE"144b26b'af+'j/_ra#1^=

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

Примітка: речі, що виглядають у просторі, - це символи на вкладках (один перед "та" після "ЕК {")

Пояснення:

Частина до "+" - це декомпресія рядка "slaveryjfreedomjwarjpeacejignorancejstrength", використовуючи базове перетворення:
рядок (трактується як масив кодів символів) → (база 144) число → (база 26) масив чисел → (додавання 'a' до кожного число) рядок

'j/    split around 'j' characters
_      duplicate the resulting word array
ra     read the input and wrap in array
#      find the index of the input in the word array
1^     XOR with 1
=      get the word at the new index

3

> <> (Риба), 84 78 байт

0i~ia%.
v'raw'
>ol?!;
^'htgnerts'
^'yrevals'

^'ecnarongi'
^'ecaep'
^'modeerf'

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

Починаємо плавати з верхнього лівого кута, прямуючи праворуч. Спочатку завантажуємо стек на 0. Потім читаємо першу літеру введення ( i), відкидаємо її ( ~), читаємо другу букву ( i) і зменшуємо її значення ASCII по модулю 10 ( a%). Це відображає a, e, r, l, g і t відповідно до 7, 1, 4, 8, 3 і 6 відповідно - назвемо це число N. .з'являється два значення зі стека - N і 0 - і переходить до рядок N, символ 0.

Після стрибка риба переходить до одного галочки перед виконанням інструкцій, тому вона ігнорує першого символу і перепливає по лінії N, яка завантажує відповідне слово на стек. Нарешті ми переходимо до рядка 2, який видає весь стек і виходить.

  • Збережено шість байтів за допомогою стрибка замість прохолодної самомодифікації коду, яку я використовував раніше. Ну добре.

3

JavaScript, 78 байт

w=>(a="war slavery ignorance strength freedom peace".split` `)[5-a.indexOf(w)]

Це своєрідний порт моєї відповіді Python . Ми зберігаємо слова в рядку, де кожне перебуває у протилежному положенні до свого аналога. Ми знаходимо індекс даного слова wі отримуємо цей індекс з кінця, щоб повернути результат.

Фрагмент тесту:

f = w=>(a="war slavery ignorance strength freedom peace".split` `)[5-a.indexOf(w)]

console.log(f("peace"))
console.log(f("ignorance"))
console.log(f("war"))


2

Парі / ГП, 86 байт

Pari / GP - це інтерактивний перекладач, нам не потрібен "print" -cmd для виводу; однак утиліта Try-It_Online потребує "print" -cmd, тому я розділив це на "нижній колонтитул".
Ми визначаємо "об'єкт-функцію" (буква O нагадує мені прекрасну функцію Оруелла ... ;-)):

x.O=s=[war,freedom,ignorance,strength,slavery,peace];for(k=1,6,if(x==s[k],i=7-k));s[i]

Після цього дзвоніть

print(war.O)   \\ input to Pari/GP with the O-rwell-member of "war"
       peace   \\ output by Pari/GP

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

(Зауважте, що в Pari / GP наведені тут лексеми - це не рядки, а легальні назви змінних! Цим змінним ніколи не повинно бути присвоєне значення)


2

Складено, 70 байт

@x'war
strength
freedom
slavery
ignorance
peace'LF split:x index\rev\#

Спробуйте тут! Здійснює введення даних про стек і залишає вихід у стеці. Наприклад:

'war'

@x'war
strength
freedom
slavery
ignorance
peace'LF split:x index\rev\#

out

Цей код є досить зрозумілим. Трохи модифікований для запуску всіх тестових випадків:

('war' 'slavery' 'ignorance')
{x:'war
strength
freedom
slavery
ignorance
peace'LF split:x index\rev\#x\,}"!
disp

1
що робить 'LF?
Пуховик

1
@Downgoat Ну, @xвстановлює змінну, '...'це рядок і LFє змінною linefeed
Conor O'Brien

1
Ну я бачу, так що аргумент функції виходить перед назвою функції?
Пуховик

1
@Downgoat точно. Stacked є, ну, на основі стека.
Conor O'Brien

1
так, зараз я почуваюсь німим за те, що не усвідомлюю такого очевидного факту: |
Пуховик

2

Джолф, 35 байт

.γG"ΞΠΞ¦ΞpΞsΞΈΞ3I"-5 iγ

Існує багато недрукованих видань. Ось шістнадцятковий, хоча це не принесе багато користі:

00000000: 2ece b347 22ce 9e07 cea0 c28e ce9e 07c2  ...G"...........
00000010: 8ac2 a6ce 9e06 c28e 70ce 9e07 73c2 8fce  ........p...s...
00000020: 9e06 ce88 c280 ce9e 0133 4922 052d 3520  .........3I".-5
00000030: 69ce b3                                  i..

Ось онлайн-посилання.

В основному код виглядає так:

.γG"..."♣-5 iγ
  G"..."♣        split uncompressed string on spaces
 γ               set gamma to this
            iγ   index of the input in gamma
.γ       -5      and get 5 - this from gamma

2

Насправді 56 байт

' "war peace freedom slavery ignorance strength"s;)í1^@E

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

На жаль, без будь-яких вбудованих стискань, коротше не стискати рядок і вручну розпаковувати її.

Пояснення:

' "war peace freedom slavery ignorance strength"s;)í1^@E
' "war peace freedom slavery ignorance strength"s         split the string on spaces
                                                 ;)       make a copy, push it to the bottom of the stack
                                                   í      index of input in list
                                                    1^    XOR with 1
                                                      @E  that element in the list

2

Haskell, 104 111 байт

data O=WAR|FREEDOM|IGNORANCE|PEACE|SLAVERY|STRENGTH deriving(Show,Enum)
f s=toEnum$mod(3+fromEnum s)6::O

Ідея:

  • Перерахуйте ключові слова таким чином, щоб їх аналог був на 3 позиції
  • Візьміть ключове слово, отримайте його позицію fromEnum, переведіть 3 кроки вправо (модуль 6) і перетворіть назад на ключове слово
  • ::OНеобхідно тому , що визначення типу мають деякі проблеми. Надання fпідпису f :: O -> Oматиме такий же ефект, але це не так вже й коротко.

Редагувати:

Замінено

f s=toEnum$mod(3+fromEnum s)6

по

f=toEnum.(`mod`6).(+3).fromEnum

завдяки @Laikoni


2
Використання повної позначення крапки для fкоротше:f s=toEnum$mod(3+fromEnum s)6
Laikoni

2

Діалог APL , 66 байт

Будь-який із них:

'slavery' 'freedom' 'ignorance' 'strength' 'war' 'peace'⊃⍨6|⎕UCS⊃⍞використовує цей метод (вимагає ⎕IO←0встановлення за замовчуванням у багатьох системах).

'strength' 'freedom' 'war' 'peace' 'slavery' 'ignorance'(⍳⊃(⌽⊣))⊂⍞ робить пошук, а потім вибирає відповідний елемент із перевернутого списку.


2

Qbasic, 138 99 байт

D$="ignorancefreedom  peace    strength slavery  war      ":INPUT A$:?MID$(D$+D$,INSTR(D$,A$)+27,9)

D$зберігає всі слова з лівого боку мантри, потім усі слова правого боку. Кожне слово прокладено пробілами рівно до 9 літер на кожне слово. D$потім приєднується до себе.

Потім instrвикористовується для пошуку індексу слова, введеного користувачем. Інша частина мантри завжди зберігається рівно на 9 * 3 позицій далі в рядку, тому ми друкуємо підрядку, починаючи з цього положення, займаючи 9 символів.


2

SmileBASIC, 92 байти

A$="PEACE
E$="WAR
R$="SLAVERY
L$="FREEDOM
G$="STRENGTH
T$="IGNORANCE
INPUT I$?VAR(I$[1]+"$")

2

Пітон , 80 байт

Якось перевершив кнор!

Це неназвана лямбда-функція, яка повертає результат.

lambda w,a="war slavery ignorance strength freedom peace".split():a[~a.index(w)]

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

Список слів розташований таким чином, що кожне з них знаходиться в протилежному положенні до свого аналога. Враховуючи слово w, ми знаходимо його індекс у списку слів, а потім побіжно НЕ ( ~) його. Це перевертає всі біти, які є обчисленнями n => -n-1. Через негативну індексацію Python отримує протилежний індекс у списку.

Як свого роду ненавмисний бонус, ви можете передати будь-який список слів протилежностей цій функції як другий аргумент.

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