Зворотна правда


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"

Застосовуються стандартні лазівки. Це є , тому найкоротший код у байтах виграє.

Таблиця лідерів


На кроці 3 потрібна лише одна заміна, або всі події слід замінити? наприклад true true false falseстає true true false falseабо true eslaf false eurt?
gaborsch

Повинен eurtстати falseчи true?
Зереги

@Zereges Це неправда і не відповідає дійсності до того, як вона буде перетворена, тому: eurt->true
Hannes Karppila

@HannesKarppila Отже, правила застосовуються в порядку:1 3 2 4 5
Зереги

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", якщо char-код першого char менше, ніж char-код'g' , це "false".

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

У цього була помилка, вона не повертала правильний вихід для falstrue.

string R(string t)=>string.Concat(t.Reverse()).Replace("eurt","false").Replace("eslaf","true");

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.

Якщо ви використовуєте lі iзамість tі f, ви можете опустити .s. f також заздалегідь визначений, щоб falseви могли отримати:xv¡g(l="eurt",i=f+¢)g(iv¡,lv¡)
Пуховик

Насправді навіть краще:xv¡g("eurt",f)g(f.T¡v¡,t)
Пуховик

@ Vɪʜᴀɴ Дякую за допомогу. не бачив цього в документах. Чи можна було б автоматично вставити (методи? Подобається replace(/(\.[BcCdeE...])/g,"$1(")чи подібне після вставки періодів.
intrepidcoder

1
Це не працює правильно для вводу falstrue.
feersum

@feersum Виправлено. Дякуємо, що вказали на це. Це було хитро.
intrepidcoder

7

Bash + GNU, 45 38 73 байт

Правка: працює з обома 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

1
Об’єднайте вирази sed в одне і видаліть «-e» та цитати:rev|sed s/eurt/false/g\;s/eslaf/true/g
Digital Trauma

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>


Прийшов сюди, щоб опублікувати дивовижне 62-байтне рішення ... знайшов неймовірне 59-байтне рішення. +1
ETHproductions

5

Windows Batch, 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 спасибі !!!!
Conor O'Brien

1
Я думаю, ви також повинні мати можливість використовувати [...x]замість x.split ''
Downgoat

2
67: x=>[...x].reverse().join``[r='replace'](/eurt/g,!1)[r](/eslaf/g,!0). Я також змінив парам приєднання на порожній рядок шаблону, щоб викреслити коми масиву.
Mama 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

Julia, 59 55 46 bytes

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

This creates an unnamed function that accepts a string and returns a string. To call it, give it a name, e.g. f=s->....

The input is reversed using reverse. We match on the regular expression eurt|eslaf which matches true or false backwards. To the match we apply a function that returns true if the match is lexicographically smaller than et (i.e. eslaf) and false otherwise. The boolean literals are converted to string in the output.

Saved 9 bytes and fixed an issue thanks to Glen O!


2
I don't believe this works correctly for the input falstrue.
feersum

It's using the same basic reasoning, so I'll offer it to you: s->replace(reverse(s),r"eurt|eslaf",i->i<"et") - uses a regex rather than doing it twice, and a function for the replace that evaluates to true if it was "elsaf" and to false if it was "eurt". 46 bytes.
Glen O

Oh, and it also fixes the falstrue issue.
Glen O

@GlenO That's great, thanks
Alex A.

@feersum Fixed now
Alex A.

2

Javascript, 135 Bytes

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

Test:

=>"false is the opposite of true"

<="true fo etisoppo eht si false"

Thanks ProgramFOX and edc65 for pointing out a bug!


Welcome to Programming Puzzles & Code Golf! The question requests a full program or a function, so not just a code snippet that assumes that a variable s exists. Also, your code does not work for falstrue: it should output falseslaf, not trueslaf. Do you want to fix these issues? Thanks! :)
ProgramFOX

@ProgramFOX Thank you! I'll get right on that!
Fuzzyzilla

1
You can save a few bytes if you use ES6, it has this arrow-function syntax: f=s=>s.split(""). ....
ProgramFOX

This is both overly complex and wrong. Test with 'false1' or 'true0' or 'true1'
edc65

@edc65 Why thank you, kind sir!
Fuzzyzilla

2

Java, 162 98 92 bytes

Thanks (and sorry!~) to @DanielM. for telling me about StringBuffer and the fact that we can use functions!

Because, you know, Java.

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

Returns the correct, reversed string.

Ungolfed Version:

s->new StringBuilder(
    s.replaceAll("false","eurt"))
    .reverse().toString().replaceAll("eurt","false");

Basically, I replace all instances of "false" with a backwards "true", then reverse the entire string, and then replace the now backwards versions of "true" (not the ones I just replaced) with "false". Easy peasy.


StringBuffer is a byte shorter. Also, functions are allowed.
Daniel M.

I'm preparing another answer in a different language, so you can keep this
Daniel M.

The return is implicit when dealing with one-line lambdas
Daniel M.

4
Java beat Python? Now surely the end is upon us
Downgoat

1
@GaborSch Nifty. :P Thanks!
Addison Crump


1

Python 3, 68 100 bytes

I'm still golfing it, but it's fixed to the bug, so falstrue -> falselsaf and trufalse -> trueurt

Pretty straightforward:

print(input()[::-1].replace("eurt","false").replace("eslaf","true").replace("falstrue","falseslaf"))

3
This does not work correctly for the input falstrue.
feersum

This can be easily remedied by switching the replace statements (print(input()[::-1].replace("eslaf","true").replace("eurt","false")))
Beta Decay

@BetaDecay, that will not work, because trufalse becomes trufalse, while it needs to be trueurt
Adnan

@Adriandmen However, that's not one of the example I/Os so it will suffice for now :)
Beta Decay

@BetaDecay Haha, they won't notice :)
Adnan

1

Japt, 26 bytes

Note: This may be invalid, as it requires bug fixes made after this challenge was posted.

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

Try it in the online interpreter! (Arrow function requires ES6-compliant browser, such as Firefox.)

How it works

             // 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

Here's a version that worked before the bug fixes: (38 bytes)

Uw $.replace(/eurt|eslaf/g,X=>X<"et")$


1

Pyth, 28 22

Amr`!dZ2jHjLGcR_Hc_z_G

6 bytes thanks to Jakube

Works correctly for falstrue, as shown in the suite below.

Test suite


No, I think I made a mistake. You 22 byte solution is correct.
Jakube

1

Haskell, 102 bytes

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

The replacement of "true" by "false" and vice-versa is quite lengthy with the pattern-matching, but at least it deals correctly with "falstrue" and the like. And besides, I suspect that a correct regex-based version would be a bit longer.


1

Python 3 - 108 92 bytes

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

Uses a regex to match on "true" or "false" and uses a lambda to process matches and choose what to use as a replacement string. Using repr gets the string representation of (len(match)>4) which gives "True" when "false" is matched and vice versa (and use .lower() because repr(bool) gives a capitalized string) to get the inverse of the match and finish up by reversing the replacement and then the processed input using [::-1]

Managed to get the length down 16 bytes from TFelds suggestions.

Edit: Python is back in front of java, no need for alarm.


5
We require here that programs work for all inputs, not just for the given test cases.
lirtosiast

You can save 6 bytes by reversing the string first, and then replacing (saving one [::-1]) print(re.compile("eslaf|eurt").sub(lambda m:repr(m.group(0)!="eurt").lower(),input()[::-1]))
TFeld

You can also get away with not using re.compile print(re.sub("eslaf|eurt",lambda m:repr(m.group(0)!="eurt").lower(),input()[::-1])) Change m.group(0)!="eurt" to len(m.group(0))>4 (for 1 more)
TFeld


1

Prolog, 225 bytes

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).

Try it out online here
Run by querying in the following way:

p("falstrue").

0

Ruby, 55 bytes

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

Test:

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

0

Perl 5, 68 bytes

67 plus 1 for -E instead of -e

%a=(false,eurt,true,eslaf);say~~reverse<>=~s/false|true/$a{$&}/gr

0

OpenSCAD, 178 bytes

(Note that this uses the String Theory library, as OpenSCAD doesn't exactly have a standard library. Additionally, this is a function because the only allowed input is to hard-code it.

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 bytes

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);}}

This is my first (real) post - I've seen someone using c# above didn't include: using system; class P{ }, static void main(), Console.WriteLine(); or Console.ReadLine();. These obviously take on a lot of bytes for me - if there is a way of golfing that or if it is excluded from code-golf - let me know :)
Belfield

0

PHP, 60 bytes

Simple, reverses the string first, then replaces the reversed versions with their respective swaps.

"falstrue" becomes "eurtslaf" becomes "falseslaf".

<?=strtr(strrev($argv[1]),{'eurt'=>'false','eslaf'=>'true'})

0

Perl 5.10, 54 bytes

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

Reverse, then replace. A different way of doing it besides the hash table used for the other Perl answer, which ends up being shorter!

Try it online.


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