Обратиться к истине

22

Напишите программу или функцию, которая:

  1. принимает строку из stdio или аргументов
  2. заменяет все вхождения trueс falseи falseсtrue
  3. переворачивает его, но не переворачивает trueиfalse
  4. возвращает или печатает результат

Примеры (левая сторона является входной):

"true"                     "false"
"2false"                   "true2"
"true is false"            "true si false"
"false,true,undefined"     "denifednu,false,true"
"stressed-false"           "true-desserts"
"falstrue"                 "falseslaf"
"true false true x"        "x false true false"

Применяются стандартные лазейки. Это , поэтому выигрывает самый короткий код в байтах.

Leaderboard

Ханнес Карппила
источник
На шаге 3 требуется только одна замена, или все случаи должны быть заменены? например true true false falseстановится true true false falseили true eslaf false eurt?
gaborsch
Должен eurtстал falseили true?
Zereges
@Zereges Это не ложь или правда, прежде чем это полностью изменено, так: eurt->true
Ханнес Карппила
@HannesKarppila Итак, правила применяются по порядку:1 3 2 4 5
Zereges
3
Это тоже значит trufalse -> trueurt?
Аднан

Ответы:

12

C # 6, 144 байта

string R(string t)=>string.Concat(new System.Text.RegularExpressions.Regex("true|false").Replace(t,m=>m.Value[0]<'g'?"eurt":"eslaf").Reverse());

Для сопоставления используется регулярное выражение true|false, и, если оно совпадает, trueоно будет заменено на eslaf, в противном случае - на eurt. m.Value[0]<'g'это более короткий способ сказать m.Value[0]=="false", потому что единственными возможными значениями для m.Valueявляются "true"или "false", поэтому, если код символа первого символа меньше, чем код символа 'g', это "false".

Старая версия, 95 байт

У этого был баг, он не вернул правильный вывод для falstrue.

string R(string t)=>string.Concat(t.Reverse()).Replace("eurt","false").Replace("eslaf","true");
ProgramFOX
источник
15
AC # решение до 100 байт? Конечно, конец дней на нас.
Алекс А.
@AlexA. Ха-ха, все благодаря версии 6; P
ProgramFOX
1
Это не работает правильно для ввода falstrue.
Feersum
2
@AlexA. Что ж, с некорректным выводом для falstrueфиксированного значения он больше не <100 байт ... :(
ProgramFOX
14
Хотя это действительно печально, это означает, что нам больше не нужно беспокоиться об апокалипсисе. Ошибки в программном обеспечении спасли нас всех.
Алекс А.
7

TeaScript , 36 25 24 байта

xv¡g("eurt|eslaf",#ln>4)   

TeaScript - это JavaScript для игры в гольф.

Изменения: Сохранено 11 байт благодаря @ Vɪʜᴀɴ. Исправлено для ввода falstrueи сохранен байт.

Старая версия (неверно):

xv¡g("eurt",f)g(f.T¡v¡,t)

Объяснение:

x    // Input
 v¡    // Reverse
   g("eurt",    // Global replace "eurt" with "false".
            f)    // f is predefined to false.
              g(f.T¡v¡, // Convert false to string, then reverse.
                       t) // t is predefined to true.
intrepidcoder
источник
Если вы используете lи iвместо tи f, вы можете опустить .s. f также предопределено, falseчтобы вы могли получить:xv¡g(l="eurt",i=f+¢)g(iv¡,lv¡)
Downgoat
На самом деле даже лучше:xv¡g("eurt",f)g(f.T¡v¡,t)
Downgoat
@ Vɪʜᴀɴ Спасибо за помощь. не видел этого в документах. Будет ли возможность автоматически вставлять (после методов? Как replace(/(\.[BcCdeE...])/g,"$1(")или похоже после вставки периодов.
Intrepidcoder
1
Это не работает правильно для ввода falstrue.
Feersum
@feersum Исправлено. Спасибо что подметил это. Это было сложно.
Intrepidcoder
7

Bash + GNU, 45 38 73 байта

Edit: работает как с trufalseиfalstrue

sed s/false/%eurt%/g\;s/true/%eslaf%/g|rev|sed "s/%\(true\|false\)%/\1/g"

Старая версия , 38 байт (сокращено, благодаря Digital Trauma):

rev|sed s/eurt/false/g\;s/eslaf/true/g
gaborsch
источник
1
Объедините выражения sed в одно и удалите "-e" и кавычки:rev|sed s/eurt/false/g\;s/eslaf/true/g
Цифровая травма
2
Это не работает правильно для ввода falstrue.
Feersum
@feersum Хороший вопрос, исправлено. Также проверено на trufalse.
gaborsch
6

JavaScript ES6, 59

Как анонимная функция.

Обратите внимание, что замена используется просто как сокращение для match (). Map (). Замененная строка отбрасывается, а выходная строка создается по частям в обратном направлении (поэтому нет необходимости переворачивать).

s=>s.replace(/false|true|./g,x=>s=(x[1]?x<'t':x)+s,s='')&&s

Попробуйте запустить приведенный ниже фрагмент в браузере, совместимом с EcmaScript 6.

f=s=>s.replace(/false|true|./g,x=>s=(x[1]?x<'t':x)+s,s='')&&s

//test

console.log=x=>O.innerHTML+=x+'\n'

;[
 ["true","false"]
,["falstrue","falseslaf"]  
,["1false","true1"]
,["true is false","true si false"]
,["false,true,undefined","denifednu,false,true"]
,["stressed-false","true-desserts"]
,["true false true x","x false true false"]
].forEach(t=>console.log(t[0]+' -> '+f(t[0])))
<pre id=O></pre>

edc65
источник
Пришли сюда, чтобы опубликовать удивительное 62-байтовое решение ... нашли невероятное 59-байтовое решение. +1
ETHproductions
5

Пакет Windows, 184 213 байт

Исправлена ​​ошибка, falstrue -> falseslafиtrufalse -> trueurt

Вероятно, один из менее популярных языков:

setlocal enabledelayedexpansion
set /p Q=
set N=0
:L
call set T=%%Q:~%N%,1%%%
set /a N+=1
if not "%T%" equ "" (
set R=%T%%R%
goto L
)
set R=%R:eurt=false%
set R=%R:eslaf=true%
set R=%R:falstrue=falseslaf%
echo %R%
Аднан
источник
1
Это не работает правильно для ввода falstrue.
Feersum
@feersum, исправил это :)
Аднан
5

Haskell, 94 байта

Выполняет сопоставление с образцом для входной строки, ищет «false» или «true» и добавляет противоположное к результату применения функции к оставшейся части строки. Если true или false не найдены, он использует рекурсию для обратного преобразования строки таким же образом.

f[]=[]
f('t':'r':'u':'e':s)=f s++"false"
f('f':'a':'l':'s':'e':s)=f s++"true"
f(x:s)=f s++[x]
Крейг Рой
источник
Добавлено сейчас, извините за это
Крейг Рой
Не берите в голову. Кажется, я сделал некоторую ошибку, пытаясь проверить это. Может быть, я просто распечатал строку, не успев применить к ней функцию.
feersum
Я считаю, что вы можете взять верхнюю f[]=[]строку и вместо этого поставить f x=xвнизу, чтобы сохранить байт.
Майкл Кляйн
4

JavaScript ES6, 95 93 байта

Безымянная функция. Добавьте f=к началу, чтобы использовать это. Спасибо Исмаэль! Также предполагается, что ввод не содержит вкладок.

x=>[...x[r="replace"](/false/g,"\teslaf")[r](/(\t)*true/g,"eurt")[r](/\t/g,"")].reverse().join``
Конор О'Брайен
источник
Вы можете использовать .replace(/eurt/g,false).replace(/eslaf/g,true), так как они будут преобразованы в строку. Попробуй true + ''(должен вернуться 'true')
Исмаэль Мигель
3
ПОДОЖДИТЕ!!! Изменить falseс !1и trueс !0. Там на несколько байт короче
Исмаэль Мигель
3
@IsmaelMiguel Вау спасибо !!!!
Конор О'Брайен
1
Я думаю, что вы также должны быть в состоянии использовать [...x]вместо x.split ''
Downgoat
2
67: x=>[...x].reverse().join``[r='replace'](/eurt/g,!1)[r](/eslaf/g,!0). Я также изменил параметр соединения на пустую строку шаблона, чтобы разделить запятые массива.
Мама Fun Roll
2

Pyth, 30 байт

::_z"eurt""false""eslaf""true"

Это переворачивает вход ( _z), заменители "eurt"для "false"и "eslaf"для "true". Замена производится с помощью :.

Попробуйте онлайн

Алекс А.
источник
Вы можете объявить "true"и "false"как переменную:, =d"true"=k"false"::_z_dk_kdи использовать обратное. Это сэкономит 3 байта.
Аднан
::_zJ"eurt"K"false"_K_Jсоставляет 23 байта.
PurkkaKoodari
5
Это не работает правильно для ввода falstrue.
Feersum
2

RS , 56 байт

\t
+(.*\t)(.)(.*)/\2\1\3
\t/
eurt/fals\t
eslaf/true
\t/e

Живая демоверсия и тестовые случаи.

kirbyfan64sos
источник
1
Это не работает правильно для ввода falstrue.
Feersum
@feersum Тьфу ... и Пиф не отвечает, к вашему сведению ...
kirbyfan64sos
По крайней мере, 7 ответов имеют эту проблему, которую я проверял
feersum
@feersum Хорошо; Я исправил это сейчас.
kirbyfan64sos
2

Юлия, 59 55 46 байтов

s->replace(reverse(s),r"eurt|eslaf",i->i<"et")

Это создает безымянную функцию, которая принимает строку и возвращает строку. Чтобы назвать его, дайте ему имя, например f=s->....

Ввод обратный с помощью reverse. Мы сопоставляем регулярное выражение, eurt|eslafкоторое соответствует trueили в falseобратном направлении. К совпадению мы применяем функцию, которая возвращает, trueесли совпадение лексикографически меньше, чем et(то есть eslaf), иfalse противном случае. Логические литералы преобразуются в строку в выходных данных.

Сохранено 9 байт и исправлена ​​проблема благодаря Glen O!

Алекс А.
источник
2
Я не верю, что это работает правильно для ввода falstrue.
Feersum
Он использует те же самые основные рассуждения, поэтому я предложу его вам: s->replace(reverse(s),r"eurt|eslaf",i->i<"et")- использует регулярное выражение вместо того, чтобы делать это дважды, и функцию для замены, которая оценивает, было trueли это «elsaf», и falseесли это было «eurt». 46 байтов.
Глен О
О, и это также решает falstrueпроблему.
Глен О
@GlenO Это здорово, спасибо
Алекс А.
@feersum Исправлено сейчас
Алекс А.
2

Javascript, 135 байт

function(s){return s.split("").reverse().join("").replace(/eslaf/i,'☺').replace(/eurt/i,'☻').replace(/☻/g,!1).replace(/☺/g,!1)}

Тест:

=>«ложь есть противоположность истине»

<="Истинно, Этосоппо Эхт Си Фальш"

Спасибо ProgramFOX и edc65 за указание на ошибку!

Fuzzyzilla
источник
Добро пожаловать в Программирование Пазлов и Code Golf! Вопрос запрашивает полную программу или функцию, а не просто фрагмент кода, который предполагает, что переменная sсуществует. Кроме того, ваш код не работает falstrue: он должен выводить falseslaf, а не trueslaf. Вы хотите исправить эти проблемы? Благодарность! :)
ProgramFOX
@ProgramFOX Спасибо! Я получу право на это!
Fuzzyzilla
1
Вы можете сохранить несколько байт , если вы используете ES6, то есть эта стрелка-функции синтаксис: f=s=>s.split(""). ....
ProgramFOX
Это слишком сложно и неправильно. Тест с «false1» или «true0» или «true1»
edc65
@ edc65 Почему спасибо, добрый сэр!
Fuzzyzilla
2

Java, 162 98 92 байта

Спасибо (и извините! ~) @DanielM. за то, что рассказал мне о StringBuffer и о том, что мы можем использовать функции!

Потому что, вы знаете, Java.

s -> ("" + new StringBuffer (s.replaceAll ("false", "eurt")). reverse ()). replaceAll ("eurt", "false");

Возвращает правильную, перевернутую строку.

Безголовая версия:

s-> new StringBuilder (
    s.replaceAll ( "ложь", "ВУРС"))
    .reverse () ToString () replaceAll ( "ВУРС", "ложь")..;

По сути, я заменяю все экземпляры «false» обратным «true», затем переворачиваю всю строку, а затем заменяю теперь обратные версии «true» (а не те, которые я только что заменил) на «false». Очень просто.

Аддисон Крамп
источник
StringBuffer на байт короче. Также функции разрешены.
Даниэль М.
Я готовлю еще один ответ на другом языке, чтобы вы могли сохранить это
Даниэль М.
Это returnподразумевается при работе с однострочными лямбдами
Даниэль М.
4
Java победил Python? Теперь, конечно, конец на нас
Downgoat
1
@GaborSch Nifty. : P Спасибо!
Эддисон Крамп
1

Mathematica, 64 байта

StringReverse@#~StringReplace~{"eurt"->"false","eslaf"->"true"}&
LegionMammal978
источник
1

Python 3, 68 100 байт

Я все еще играю в гольф, но это исправлено на ошибку, так falstrue -> falselsafиtrufalse -> trueurt

Довольно просто:

print(input()[::-1].replace("eurt","false").replace("eslaf","true").replace("falstrue","falseslaf"))
Аднан
источник
3
Это не работает правильно для ввода falstrue.
Feersum
Это можно легко исправить, переключив операторы замены ( print(input()[::-1].replace("eslaf","true").replace("eurt","false")))
Beta Decay
@BetaDecay, это не будет работать, потому что trufalseстановится trufalse, в то время как это должно бытьtrueurt
Adnan
@Adriandmen Тем не менее, это не один из примеров ввода / вывода, поэтому на данный момент его будет достаточно :)
Beta Decay
@BetaDecay Ха-ха, они не заметят :)
Аднан
1

Japt, 26 байт

Примечание. Это может быть недействительным, так как требует исправления ошибок, внесенных после публикации этого запроса.

Uw r"eurt|eslaf",X=>X<"et"

Попробуйте это в онлайн-переводчике ! (Функция стрелки требует ES6-совместимого браузера, такого как Firefox.)

Как это работает

             // Implicit: U = input string
Uw r         // reverse U, then replace:
"eurt|eslaf" // occurrences of either "eurt" or "eslaf"
X=>X<"et"    // with "false" or "true", respectively
             // Implicit: output last expression

Вот версия, которая работала до исправления ошибки: (38 байт)

Uw $.replace(/eurt|eslaf/g,X=>X<"et")$
ETHproductions
источник
1

Гема, 43

*=@a{@reverse{*}};a:eurt=false;a:eslaf=true

( Gema - неясный макроязык.)

Стивен Тащук
источник
1

Пиф, 28 22

Amr`!dZ2jHjLGcR_Hc_z_G

6 байтов благодаря Якубе

Работает правильно для falstrue, как показано в наборе ниже.

Тестирование

FryAmTheEggman
источник
Нет, я думаю, что сделал ошибку. У вас 22 байтовое решение верное.
Якуб
1

Haskell, 102 байта

h('t':'r':'u':'e':s)="eslaf"++h s
h('f':'a':'l':'s':'e':s)="eurt"++h s
h(x:s)=x:h s
h[]=""
r=reverse.h

Замена «true» на «false» и наоборот довольно длительна при сопоставлении с образцом, но, по крайней мере, правильно работает с «falstrue» и тому подобным. И, кроме того, я подозреваю, что правильная версия на основе регулярных выражений будет немного длиннее.

arjanen
источник
1

Python 3 - 108 92 байта

import re
print(re.sub("eslaf|eurt",lambda m:repr(len(m.group(0))>4).lower(),input()[::-1]))

Использует регулярное выражение для соответствия «истина» или «ложь» и использует лямбду для обработки совпадений и выбора того, что использовать в качестве строки замены. Использование repr возвращает строковое представление (len (match)> 4), которое выдает «True», когда «false» сопоставляется, и наоборот (и использует .lower (), потому что repr (bool) дает заглавную строку) для получения обратного совпадения и завершить, отменив замену, а затем обработав ввод, используя [:: - 1]

Удалось уменьшить длину на 16 байт из предложений TFelds.

Изменить: Python вернулся перед Java, нет необходимости для тревоги.

Phyxie
источник
5
Здесь мы требуем, чтобы программы работали для всех входных данных, а не только для данных тестовых случаев.
Lirtosiast
Вы можете сохранить 6 байтов, сначала перевернув строку, а затем заменив (сохраняя один [::-1]) print(re.compile("eslaf|eurt").sub(lambda m:repr(m.group(0)!="eurt").lower(),input()[::-1]))
TFeld
Вы также можете обойтись без использования re.compile print(re.sub("eslaf|eurt",lambda m:repr(m.group(0)!="eurt").lower(),input()[::-1])) Изменить m.group(0)!="eurt"на len(m.group(0))>4(еще на 1)
TFeld
1

𝔼𝕊𝕄𝕚𝕟, 40 символов / 65 байт

ô[…ïċ/false|true/g,⇏[…⬯+!שúa]ù⬮ø⬯)]ù⬮ø⬯)

Try it here (Firefox only).

Спасибо @feersum за указание на ошибку!

21 символ / 43 байта, неконкурентный

ôᴙ(ïċ/⊭|⊨⌿,↪ᴙ(⬯+!ë$⸩⸩

Try it here (Firefox only).

Mama Fun Roll
источник
2
Это не работает правильно для ввода falstrue.
Feersum
1

Пролог, 225 байт

p(X):-string_to_list(X,L),reverse(L,B),q(B,C),string_to_list(Z,C),write(Z),!.
q([],[]).
q([101,117,114,116|T],[102,97,108,115,101|L]):-q(T,L).
q([101,115,108,97,102|T],[116,114,117,101|L]):-q(T,L).
q([H|T],[H|L]):-q(T,L).

Попробуйте это онлайн здесь.
Запустите запрос следующим образом:

p("falstrue").
Emigna
источник
0

Рубин, 55 байт

->s{s.gsub(/true|false/){$&[?t]?:eslaf: :eurt}.reverse}

Тест:

->s{s.gsub(/true|false/){$&[?t]?:eslaf: :eurt}.reverse}["false,true,undefined"]
=> "denifednu,false,true"
daniero
источник
0

Perl 5, 68 байт

67 плюс 1 -Eвместо-e

%a=(false,eurt,true,eslaf);say~~reverse<>=~s/false|true/$a{$&}/gr
msh210
источник
0

OpenSCAD, 178 байт

(Обратите внимание, что здесь используется библиотека String Theory , так как OpenSCAD не имеет стандартной библиотеки. Кроме того, это функция, потому что единственный допустимый ввод - это жесткое ее кодирование.

use <Strings.scad>;function f(a)=contains(g(a),"eurt")?replace(g(a),"eurt","false"):g(a);function g(a)=contains(reverse(a),"eslaf")?replace(reverse(a),"eslaf","true"):reverse(a);
Даниэль М.
источник
0

C #, 260 байт

using System;class P{static void Main(){var y=Console.ReadLine();char[] n=y.ToCharArray();Array.Reverse(n);var s=new string(n);if(s.Contains("eslaf")){s=s.Replace("eslaf","true");}if(s.Contains("eurt")){s=s.Replace("eurt","false");}Console.WriteLine(s);}}
Belfield
источник
Это мой первый (настоящий) пост - я видел, как кто-то, использующий c # выше, не включал: использование системы; class P {}, static void main (), Console.WriteLine (); или Console.ReadLine () ;. Они, очевидно, занимают много байтов для меня - если есть способ игры в гольф, или если он исключен из кода-гольфа - дайте мне знать :)
Belfield
0

PHP, 60 байт

Простой, сначала переворачивает строку, а затем заменяет перевернутые версии их соответствующими перестановками.

«falstrue» становится «eurtslaf» становится «falseslaf».

<?=strtr(strrev($argv[1]),{'eurt'=>'false','eslaf'=>'true'})
Xanderhall
источник
0

Perl 5,10, 54 байта

$_=reverse<>;s/(eurt)|(eslaf)/$1?"false":"true"/eg;say

Обратный, затем заменить. Другой способ сделать это, кроме хеш-таблицы, используемой для другого ответа Perl, который в итоге оказывается короче!

Попробуйте онлайн.

Пол Пикард
источник
-1

Pyth - 18 байт

Можно играть в гольф намного больше.

Amr`!dZ2::_z_GH_HG

Тестовый пакет .

Maltysen
источник
6
Это не работает правильно для ввода falstrue.
Feersum