Odwróć prawdę

22

Napisz program lub funkcję, która:

  1. pobiera ciąg ze stdio lub argumentów
  2. Zastępuje wszystkie wystąpienia truez falseoraz falseztrue
  3. odwraca to, ale nie odwraca trueifalse
  4. zwraca lub drukuje wynik

Przykłady (wejście po lewej stronie):

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

Obowiązują standardowe luki. To jest , więc wygrywa najkrótszy kod w bajtach.

Tabela liderów

Hannes Karppila
źródło
W kroku 3 wymagana jest tylko jedna wymiana, czy wszystkie wystąpienia należy wymienić? np. true true false falsestaje się true true false falselub true eslaf false eurt?
gaborsch
Powinien eurtzostać falselub true?
Zereges,
@Zereges To nie jest fałsz ani prawda, zanim zostanie odwrócone, więc: eurt->true
Hannes Karppila
@HannesKarppila Tak więc reguły są stosowane w kolejności:1 3 2 4 5
Zereges
3
Czy to też oznacza trufalse -> trueurt?
Adnan

Odpowiedzi:

12

C # 6, 144 bajty

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

Do dopasowania używa wyrażenia regularnego true|false, a jeśli pasuje true, zostanie zastąpione przez eslaf, w przeciwnym razie przez eurt. m.Value[0]<'g'jest krótszym sposobem na powiedzenie m.Value[0]=="false", ponieważ jedynymi możliwymi wartościami m.Value"true"lub "false", więc jeśli kod znaku pierwszego znaku jest mniejszy niż kod znaku 'g', to "false".

Stara wersja, 95 bajtów

Ten miał błąd, który nie zwrócił prawidłowego wyjścia falstrue.

string R(string t)=>string.Concat(t.Reverse()).Replace("eurt","false").Replace("eslaf","true");
ProgramFOX
źródło
15
Rozwiązanie AC # poniżej 100 bajtów? Z pewnością koniec dni już nadszedł.
Alex A.,
@AlexA. Haha, wszystko dzięki wersji 6; P
ProgramFOX
1
To nie działa poprawnie dla danych wejściowych falstrue.
feersum
2
@AlexA. Cóż, z niepoprawnym wyjściem dla falstrueustalonego, nie ma już <100 bajtów ... :(
ProgramFOX
14
Chociaż jest to rzeczywiście smutne, oznacza to, że nie musimy się już martwić apokalipsą. Błędy oprogramowania uratowały nas wszystkich.
Alex A.,
7

TeaScript , 36 25 24 bajtów

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

TeaScript to JavaScript do gry w golfa.

Edycje: Zapisano 11 bajtów dzięki @ Vɪʜᴀɴ. Naprawiono wprowadzanie falstruei zapisano bajt.

Stara wersja (nieprawidłowa):

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

Wyjaśnienie:

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
źródło
Jeśli używasz li izamiast ti f, możesz pominąć .s. f jest również predefiniowany, falsedzięki czemu można uzyskać:xv¡g(l="eurt",i=f+¢)g(iv¡,lv¡)
Downgoat
Właściwie jeszcze lepiej:xv¡g("eurt",f)g(f.T¡v¡,t)
Downgoat
@ Vɪʜᴀɴ Dzięki za pomoc. nie widziałem tego w dokumentach. Czy byłoby możliwe automatyczne wstawianie (po metodach? Jak replace(/(\.[BcCdeE...])/g,"$1(")lub podobny po włożeniu okresy.
intrepidcoder,
1
To nie działa poprawnie dla danych wejściowych falstrue.
feersum
@feersum Naprawiono. Dzięki za zwrócenie na to uwagi. To było trudne.
intrepidcoder,
7

Bash + GNU, 45 38 73 bajtów

Edycja: działa zarówno z, jak trufalseifalstrue

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

Stara wersja , 38 bajtów (skrócona dzięki Digital Trauma):

rev|sed s/eurt/false/g\;s/eslaf/true/g
Gaborsch
źródło
1
Połącz wyrażenia sed w jedno i usuń „-e” i cudzysłowy:rev|sed s/eurt/false/g\;s/eslaf/true/g
Digital Trauma
2
To nie działa poprawnie dla danych wejściowych falstrue.
feersum
@feersum Dobry punkt, naprawiony. Sprawdzone również pod kątem trufalse.
gaborsch
6

JavaScript ES6, 59

Jako funkcja anonimowa.

Uwaga: zamień jest używany tylko jako skrót dla match (). Map (). Zastąpiony ciąg jest odrzucany, a ciąg wyjściowy jest wykonywany kawałek po kawałku do tyłu (więc nie ma potrzeby cofania).

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

Przetestuj poniższy fragment kodu w przeglądarce zgodnej z 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
źródło
Przybyłem tutaj, aby opublikować niesamowite rozwiązanie 62-bajtowe ... znalazłem niesamowite rozwiązanie 59-bajtowe. +1
ETHprodukcje
5

Pakiet Windows, 184 213 bajtów

Naprawiono błąd falstrue -> falseslafitrufalse -> trueurt

Prawdopodobnie jeden z mniej popularnych języków:

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%
Adnan
źródło
1
To nie działa poprawnie dla danych wejściowych falstrue.
feersum
@feersum, naprawiono :)
Adnan
5

Haskell, 94 bajty

Wykonuje dopasowanie wzorca do ciągu wejściowego, szukając „false” lub „true” i dołącza przeciwieństwo do wyniku zastosowania funkcji na pozostałej części ciągu. Jeśli prawda lub fałsz nie zostaną znalezione, używa rekurencji do odwrócenia łańcucha w ten sam sposób.

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]
Craig Roy
źródło
Dodano teraz, przepraszam za to
Craig Roy
Nieważne. Wygląda na to, że popełniłem błąd, próbując go przetestować. Może po prostu wydrukowałem ciąg, nie zdołając zastosować do niego funkcji.
feersum
Wierzę, że możesz wziąć górną f[]=[]linię i zamiast tego umieścić f x=xna dole, aby zapisać bajt.
Michael Klein
4

JavaScript ES6, 95 93 bajtów

Funkcja bez nazwy. Dodaj f=do początku, aby z niego korzystać. Dzięki Ismael! Zakłada również, że dane wejściowe nie zawierają tabulatorów.

x=>[...x[r="replace"](/false/g,"\teslaf")[r](/(\t)*true/g,"eurt")[r](/\t/g,"")].reverse().join``
Conor O'Brien
źródło
Możesz użyć .replace(/eurt/g,false).replace(/eslaf/g,true), ponieważ zostaną przekonwertowane na ciąg. Spróbuj true + ''(powinien wrócić 'true')
Ismael Miguel
3
CZEKAĆ!!! Zmień za falsepomocą !1i za truepomocą !0. Tam kilka bajtów krótszych
Ismael Miguel
3
@IsmaelMiguel whoa dzięki !!!!
Conor O'Brien
1
Myślę, że powinieneś także móc używać [...x]zamiast x.split ''
Downgoat
2
67: x=>[...x].reverse().join``[r='replace'](/eurt/g,!1)[r](/eslaf/g,!0). I also changed the join param to an empty template string to make strip out array commas.
Mama Fun Roll
2

Pyth, 30 bytes

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

This reverses the input (_z), substitutes "eurt" for "false" and "eslaf" for "true". Replacement is done using :.

Try it online

Alex A.
źródło
You can declare "true" and "false" as a variable: =d"true"=k"false"::_z_dk_kd, and use the reverse of it. It will save 3 bytes.
Adnan
::_zJ"eurt"K"false"_K_J is 23 bytes.
PurkkaKoodari
5
This does not work correctly for the input falstrue.
feersum
2

rs, 56 bytes

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

Live demo and test cases.

kirbyfan64sos
źródło
1
This does not work correctly for the input falstrue.
feersum
@feersum Ugh...neither does the Pyth answer, FYI...
kirbyfan64sos
At least 7 answers have this problem that I have tested
feersum
@feersum Ok; I fixed it now.
kirbyfan64sos
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!

Alex A.
źródł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!

Fuzzyzilla
źródło
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.

Addison Crump
źródło
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

Mathematica, 64 bytes

StringReverse@#~StringReplace~{"eurt"->"false","eslaf"->"true"}&
LegionMammal978
źródło
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"))
Adnan
źródło
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")$
ETHproductions
źródło
1

Gema, 43

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

(Gema is an obscure macro language.)

Steven Taschuk
źródło
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

FryAmTheEggman
źródło
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.

arjanen
źródło
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.

Phyxie
źródło
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

𝔼𝕊𝕄𝕚𝕟, 40 chars / 65 bytes

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

Try it here (Firefox only).

Thanks to @feersum for pointing out a bug!

21 chars / 43 bytes, non-competitive

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

Try it here (Firefox only).

Mama Fun Roll
źródło
2
This does not work correctly for the input falstrue.
feersum
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").
Emigna
źródło
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"
daniero
źródło
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
msh210
źródło
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);
Daniel M.
źródło
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);}}
Belfield
źródło
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'})
Xanderhall
źródło
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.

Paul Picard
źródło
-1

Pyth - 18 bytes

Can be golfed a lot more.

Amr`!dZ2::_z_GH_HG

Test Suite.

Maltysen
źródło
6
This does not work correctly for the input falstrue.
feersum