Invertire la verità


22

Scrivi un programma o una funzione che:

  1. accetta una stringa da stdio o argomenti
  2. sostituisce tutte le occorrenze di truecon falsee falsecontrue
  3. lo inverte, ma non inverte trueefalse
  4. restituisce o stampa il risultato

Esempi (viene inserito il lato sinistro):

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

Si applicano scappatoie standard. Questo è , quindi vince il codice più breve in byte.

Classifica


Nel passaggio 3, è necessaria una sola sostituzione o tutte le occorrenze devono essere sostituite? ad esempio true true false falsediventa true true false falseo true eslaf false eurt?
gaborsch,

Dovrebbe eurtdiventare falseo true?
Zereges,

@Zereges Non è falso o vero prima che sia invertito, quindi: eurt ->true
Hannes Karppila,

@HannesKarppila Quindi, le regole vengono applicate in ordine:1 3 2 4 5
Zereges,

3
Significa anche questo trufalse -> trueurt?
Adnan,

Risposte:


12

C # 6, 144 byte

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

Utilizza un'espressione regolare per la corrispondenza true|falsee se corrisponde trueverrà sostituita da eslaf, altrimenti da eurt. m.Value[0]<'g'è un modo più breve per dirlo m.Value[0]=="false", perché gli unici valori possibili per m.Valuesono "true"o "false", quindi se il codice char del primo carattere è più piccolo del codice char di 'g', è "false".

Vecchia versione, 95 byte

Questo aveva un bug, non restituiva un output corretto per falstrue.

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

15
Soluzione AC # inferiore a 100 byte? Sicuramente la fine dei giorni è alle porte.
Alex A.

@AlexA. Haha, tutto grazie alla versione 6; P
ProgramFOX

1
Questo non funziona correttamente per l'input falstrue.
febbraio

2
@AlexA. Bene, con l'output errato per falstruefixed, non è più <100 byte ... :(
ProgramFOX

14
Anche se questo è davvero triste, significa che non dobbiamo più preoccuparci dell'apocalisse. I bug del software ci hanno salvato tutti.
Alex A.

7

TeaScript , 36 25 24 byte

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

TeaScript è JavaScript per il golf.

Modifiche: salvato 11 byte grazie a @ Vɪʜᴀɴ. Risolto per input falstruee salvato un byte.

Vecchia versione (non valida):

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

Spiegazione:

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.

Se si utilizza le iinvece di te f, è possibile inserire i messaggi di posta elettronica .. f è anche predefinito in falsemodo da poter ottenere:xv¡g(l="eurt",i=f+¢)g(iv¡,lv¡)
Downgoat

In realtà anche meglio:xv¡g("eurt",f)g(f.T¡v¡,t)
Downgoat

@ Vɪʜᴀɴ Grazie per l'aiuto. non l'ho visto nei documenti. Sarebbe possibile inserire automaticamente (dopo i metodi? Mi piace replace(/(\.[BcCdeE...])/g,"$1(")o simile dopo aver inserito i periodi.
intrepidcoder

1
Questo non funziona correttamente per l'input falstrue.
febbraio

@feersum Fixed. Grazie per la segnalazione. È stato difficile.
intrepidcoder

7

Bash + GNU, 45 38 73 byte

Modifica: funziona con entrambi trufalseefalstrue

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

Vecchia versione , 38 byte (abbreviata, grazie a Digital Trauma):

rev|sed s/eurt/false/g\;s/eslaf/true/g

1
Combina le espressioni sed in una e rimuovi "-e" e le citazioni:rev|sed s/eurt/false/g\;s/eslaf/true/g
Digital Trauma

2
Questo non funziona correttamente per l'input falstrue.
febbraio

@feersum Buon punto, fisso. Controllato anche per trufalse.
Gaborsch,

6

JavaScript ES6, 59

Come una funzione anonima.

Nota, sostituire è usato solo come scorciatoia per match (). Map (). La stringa sostituita viene scartata e la stringa di output viene creata pezzo per pezzo all'indietro (quindi non è necessario invertire).

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

Prova a eseguire lo snippet di seguito in un browser compatibile con 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>


Sono venuto qui per pubblicare un'incredibile soluzione a 62 byte ... ho trovato un'incredibile soluzione a 59 byte. +1
ETHproductions

5

Batch di Windows, 184 213 byte

Risolto il bug falstrue -> falseslafetrufalse -> trueurt

Probabilmente una delle lingue meno popolari:

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
Questo non funziona correttamente per l'input falstrue.
febbraio

@feersum, riparato :)
Adnan,

5

Haskell, 94 byte

Esegue la corrispondenza del modello sulla stringa di input, cercando "false" o "true" e aggiunge il contrario al risultato dell'applicazione della funzione sul resto della stringa. Se non viene trovato vero o falso, utilizza la ricorsione per invertire la stringa nello stesso modo.

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]

Aggiunto ora, mi dispiace per quello
Craig Roy,

Non importa. Sembra che abbia fatto un errore quando ho provato a provarlo. Forse ho semplicemente stampato la stringa senza riuscire ad applicarvi la funzione.
febbraio

Credo che tu possa prendere la prima f[]=[]riga e invece metterla f x=xin fondo per salvare un byte.
Michael Klein,

4

JavaScript ES6, 95 93 byte

Funzione senza nome. Aggiungi f=all'inizio per usarlo. Grazie Ismael! Presuppone inoltre che l'input non contenga schede.

x=>[...x[r="replace"](/false/g,"\teslaf")[r](/(\t)*true/g,"eurt")[r](/\t/g,"")].reverse().join``

È possibile utilizzare .replace(/eurt/g,false).replace(/eslaf/g,true), poiché verranno convertiti in stringa. Prova true + ''(dovrebbe tornare 'true')
Ismael Miguel,

3
ASPETTARE!!! Cambia falsecon !1e truecon !0. Lì, alcuni byte più brevi
Ismael Miguel,

3
@IsmaelMiguel whoa grazie !!!!
Conor O'Brien,

1
Penso che dovresti anche essere in grado di usare [...x]invece di x.split ''
Downgoat,

2
67: x=>[...x].reverse().join``[r='replace'](/eurt/g,!1)[r](/eslaf/g,!0). Ho anche modificato il parametro join in una stringa di modello vuota per creare le virgole di array.
Mama Fun Roll,

2

Pyth, 30 byte

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

Ciò inverte input ( _z), sostituisce "eurt"per "false"e "eslaf"per "true". La sostituzione viene eseguita utilizzando :.

Provalo online


Puoi dichiarare "true"e "false"come una variabile:, =d"true"=k"false"::_z_dk_kde usare il contrario di essa. Salverà 3 byte.
Adnan,


5
Questo non funziona correttamente per l'input falstrue.
febbraio


2

Julia, 59 55 46 byte

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

Ciò crea una funzione senza nome che accetta una stringa e restituisce una stringa. Per chiamarlo, dagli un nome, ad es 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

Mathematica, 64 bytes

StringReverse@#~StringReplace~{"eurt"->"false","eslaf"->"true"}&

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.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.