Gerçeği ters çevir


22

Aşağıdakileri yapan bir program veya işlev yazın:

  1. stdio veya argümanlardan bir string alır
  2. tüm oluşumlarını değiştirir trueile falseve falseiletrue
  3. bunu tersine çevirir, ancak ters gelmez truevefalse
  4. sonucu döndürür veya yazdırır

Örnekler (sol taraf giriş):

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

Standart boşluklar uygulanır. Bu , bayt cinsinden en kısa kod kazanır.

Liderler Sıralaması


3. Adımda, yalnızca bir değişiklik gereklidir, yoksa tüm olaylar değiştirilmeli mi? mesela true true false falseolur true true false falseya true eslaf false eurt?
gaborsch

Meli eurtoldu falseya true?
Zereges

@Zereges Tersine çevrilmeden önce yanlış veya doğru değildir, bu yüzden: eurt->true
Hannes Karppila

@HannesKarppila Yani, kurallar sırayla uygulanır:1 3 2 4 5
Zereges

3
Bu aynı zamanda bunun anlamına mı geliyor trufalse -> trueurt?
Adnan

Yanıtlar:


12

C # 6, 144 bayt

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

Bu maç için normal bir ifade kullanır true|falseve bu eşleşirse trueo yerini alacaktır eslaftarafından aksi takdirde eurt. m.Value[0]<'g'söylemek için daha kısa bir yoldur m.Value[0]=="false"için tek olası değerler çünkü, m.Valueolan "true"veya "false"birinci char karakter kodu karakter kodu küçükse, yani'g' , bu kadar "false".

Eski versiyon, 95 bayt

Bunda hata vardı, doğru çıktı döndürmedi falstrue.

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

15
100 byte altında AC # çözümü? Elbette günlerin sonu üzerimizde.
Alex A.

@AlexA. Haha, hepsi sürüm 6'ya teşekkürler; P
ProgramFOX

1
Bu giriş için doğru çalışmıyor falstrue.
feersum

2
@AlexA. Doğru, falstruesabit çıktı için , artık <100 bayt değil ... :(
ProgramFOX

14
Bu gerçekten üzücü olsa da, artık kıyamet hakkında endişelenmek zorunda kalmayacağımız anlamına geliyor. Yazılım hataları hepimizi kurtardı.
Alex A.

7

TeaScript , 36 25 24 bayt

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

TeaScript, golf oynamak için JavaScript'tir.

Düzenlemeler: @ Vɪʜᴀɴ sayesinde 11 bayt kaydedildi. Giriş için sabitfalstrue ve bir bayt kaydedildi.

Eski versiyon (Geçersiz):

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

Açıklama:

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.

Eğer kullanıyorsanız lve iyerine tve f, sen ommit yapabilirsiniz .s. f ayrıca önceden tanımlanmıştır, falseböylece şunları elde edebilirsiniz:xv¡g(l="eurt",i=f+¢)g(iv¡,lv¡)
Downgoat

Aslında daha da iyi:xv¡g("eurt",f)g(f.T¡v¡,t)
Downgoat

@ Vɪʜᴀɴ Yardımın için teşekkürler. bunu dokümanda görmedim. (Yöntemlerden sonra otomatik ekleme yapmak mümkün olur mu? Gibi replace(/(\.[BcCdeE...])/g,"$1(")veya nokta taktıktan sonra benzer.
intrepidcoder

1
Bu giriş için doğru çalışmıyor falstrue.
feersum

@ feersum Sabit. Gösterdiğin için teşekkürler. Bu zor oldu.
intrepidcoder

7

Bash + GNU, 45 38 73 bayt

Düzenleme: her ikisi ile çalışır trufalsevefalstrue

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

Eski versiyon , 38 byte (Dijital Travma sayesinde kısaltılmıştır):

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

1
Sed ifadeleri bire bir birleştirin ve "-e" yi ve tırnak işaretlerini kaldırın:rev|sed s/eurt/false/g\;s/eslaf/true/g
Digital Trauma

2
Bu giriş için doğru çalışmıyor falstrue.
feersum

@ feersum İyi nokta, düzeltildi. Ayrıca kontrol edildi trufalse.
gaborsch

6

JavaScript ES6, 59

Anonim bir işlev olarak.

Not: change, match (). Map () için kısa yol olarak kullanılır. Değiştirilen dize atılır ve çıktı dizisi geriye doğru parça parça yapılır (bu nedenle geri çevirmeye gerek yoktur).

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

Aşağıdaki pasajı EcmaScript 6 uyumlu bir tarayıcıda çalıştırmayı test edin.

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>


İnanılmaz 62 baytlık bir çözüm göndermek için buraya geldim ... inanılmaz 59 baytlık bir çözüm buldu. +1
ETHProductions

5

Windows Batch, 184 213 bytes

Fixed the bug, falstrue -> falseslaf and trufalse -> trueurt

Probably one of the less popular languages:

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
This does not work correctly for the input falstrue.
feersum

@feersum, fixed it :)
Adnan

5

Haskell, 94 bytes

Performs pattern matching on the input string, looking for "false" or "true" and appends the opposite to the result of applying the function on the remainder of the string. If true or false isn't found, it uses recursion to reverse the string in the same fashion.

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]

Added now, sorry about that
Craig Roy

Never mind. It seems I made some mistake when trying to test it. Maybe I simply printed out the string without managing to apply the function to it.
feersum

I believe you can take the top f[]=[] line and instead put f x=x at the bottom to save a byte.
Michael Klein

4

JavaScript ES6, 95 93 bytes

Unnamed function. Add f= to the beginning to use it. Thanks Ismael! Also assumes that the input does not contain tabs.

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

You can use .replace(/eurt/g,false).replace(/eslaf/g,true), since they will be converted to string. Try true + '' (should return 'true')
Ismael Miguel

3
WAIT!!! Change false with !1 and true with !0. There, a few bytes shorter
Ismael Miguel

3
@IsmaelMiguel whoa thanks!!!!
Conor O'Brien

1
I think you should also be able to use [...x] instead of 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


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


5
This does not work correctly for the input 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

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.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.