Kaynak kodunu ters çeviririm, çıktısını olumsuzlarsınız!


39

Göreviniz, kabul etmek isterseniz, sıfır olmayan bir sayı veren bir program yazmaktır (tam sayı veya kayan olabilir). İşin zor yanı, kaynak kodunuzu tersine çevirirsem çıktının olumsuzlanan tamsayı olması gerektiğidir.

kurallar

  • Tam bir program oluşturmalısınız . Yani, çıktınızın STDOUT'a yazdırılması gerekiyor.

  • Her iki sayı da 10. basamakta yer almalıdır (bunları başka bir temelde veya bilimsel gösterime sokmak yasaktır).

  • Sayıların sondaki / baştaki boşluklarla çıkmasına izin verilir.

  • Bu kod golf, yani her dilde en kısa (orijinal) kod kazanıyor!

  • Varsayılan Loopholes uygulanır.

Örnek

Diyelim ki kaynak kodunuz ABCve bunun çıktısı çıktı 4. Ben yazarsam CBAyerine ve çalıştırın, çıkış olmalıdır -4.


6
Bayt düzeyi yerine bit düzeyinde geri -dönebilirsek , bir bayt (0x45 = 0b00101101) Jelly'te çalışır - -hazır bilgi -1'i tanımladığı için -1 verir; sıfır girişinin açıklaması. (Tabii ki aynı şekilde çalışır: p)
Jonathan Allan,

@TwilightSparkle "Kullanılmayan, boş bir girişi var mı" demek, hemen EOF'ye ulaşan giriş fonksiyonlarına güvenebileceğimiz anlamına mı geliyor?
Borka223

1
@ Borka223 Hayır, olmayabilir.
HighlyRadioactive

@JoKing Kopyalama. Bunu kaldıracağım.
HighlyRadioactive

Yanıtlar:



28

JavaScript (V8) , 19 bayt

print(1)//)1-(tnirp

Çevrimiçi deneyin!


neredeyse aynı ...

C # (Visual C # Etkileşimli Derleyici) , 19 bayt

Print(1)//)1-(tnirP

Çevrimiçi deneyin!

(işaret ettiği için @someone sayesinde)


hala hemen hemen aynı

Lua , 19 bayt

print(1)--)1-(tnirp

Çevrimiçi deneyin!


ama daha kısa ...

Python 2,15 bayt

print 1#1-tnirp

Çevrimiçi deneyin!


PHP'de bile daha kısa, çünkü bu sihirli baskı aracı var: <?=...

PHP , 12 bayt

<?=1;#;1-=?<

Çevrimiçi deneyin!


Ruby'de inspectdaha kısa , çünkü yazdırabilmek yerine

Ruby , 8 bayt

p 1#1- p

Çevrimiçi deneyin!


Ayrıca C # Etkileşimli Print(1)//)-1(tnirP,. ( Çevrimiçi deneyin! )
Biri

C # için en kısa program muhtemelen önemsiz olanıdır:class A{static void Main(){System.Console.Write(1);}}//}};)1-(etirW.elosnoC.metsyS{)(niaM diov citats{A ssalc
LegionMammal978

Bir programlama dili değil, ancak tersine çevrilecek 1<!--!<1-olan HTML'yi (9 bayt) yapabilirsiniz -1<!--!<1. Cevabınızla tamamen aynı.
Ismael Miguel,

Lua'da çoğunlukla aynı:print(1)--)1-(tnirp
val



12

/// , 4 bayt

9/9-

Çıkışlar 9.

Çevrimiçi deneyin!

ters:

-9/9

Çıkışlar -9.

Çevrimiçi deneyin!

Önce /basılan her şey , gerisi göz ardı edilirken (gerçekte fazla kullanılmaz, bu yüzden ne olduğunu tam olarak bilmiyorum ama hiçbir şey çıkarmaz).


2
Slashes kullanmak için +1. /Desen okuma işlemini başlatır ve böylece, ondan sonra karakterler değil outputted desen, içine okundu.
HighRadioactive

2
Ben ile geldi /\-//1-ve ben zeki olduğunu düşünüyorum. : D
Tanner Swett


10

Boşluk , 21 bayt

S S S T N
T   N
S T N
N
N
T   S N
T   N
T   T   S S 

Harfler S(boşluk), T(sekme) ve N(yeni satır) yalnızca vurgulama olarak eklenmiştir.

Çıkışlar 1/ -1.

Çevrimiçi deneyin veya ters çevrilmiş çevrimiçi deneyin (yalnızca boşluklarla, sekmelerle ve yeni satırlarla).

Açıklama:

Yararlanma Programdan Çık kısa palindrom olmanın yerleşik NNN.
Düzenli program:

SSSTN  # Push 1 to the stack
TNST   # Pop and print the top of the stack as number
NNN    # Exit the program, making everything after it no-ops

Tersine program:

SSTTN  # Push -1 to the stack
TNST   # Pop and print the top of the stack as number
NNN    # Exit the program, making everything after it no-ops

Bir numarayı itmenin küçük açıklaması:

  • İlk S: Yığın Manipülasyonunu Etkinleştir
  • İkincisi S: Yığına bir sayı itin
  • Sveya T: Sırasıyla pozitif / negatif
  • Bazıları S/ Tardından gelenler N: İkili sayı, nerede S=0veT=1

Yani SSTTSTSNiter -10.



7

Japt , 2 bayt

Herhangi bir tek rakamlı bir tam >0yerine kullanılabilir 2olarak kutu A-G, H, I, Jya da L( 10-16, 32, 64, -1ve 100, sırası ile).

n2

Test et | ters

nBir tamsayı uygulanan yöntem olup, çıkarır değişken arasında bir tam sayıdır için varsayılan olarak, geçirilen bu 0. İleriye doğru çalıştırıldığında, nyöntem aynı zamanda varsayılan olan gizli ilk giriş üzerinde çalıştırılmaktadır 0.

Alternatif olarak, gonun yerine n, argümanının uygulandığı tam sayıdan çıkarılmasının sonucunun bir işareti olan yöntem kullanılabilir .


7

Yorum yapmadan Haskell , 41 bayt

İleriye doğru baskılar 1+ yeni satır:

main=print$!1
niam=main
"1-"!$rtStup=niam

Çevrimiçi deneyin!

Yeni -1satır içermeyen ters baskılar (2 byte eklenebilir):

main=putStr$!"-1"
niam=main
1!$tnirp=niam

Çevrimiçi deneyin!

  • Her programın ilk satırı numarayı yazdırır.
    • İçin -1dize çıkış parantez önlemek için kullanılır.
    • Kullanılması $!ters çizgi yerine boşluk (sıkı uygulama) sağlar operatör geçerli bir tanım olması !$(sadece $yeniden tanımlanması kullanımını kıracak çünkü yapmazdı).
  • Orta çizgi niambunun son satır için tanımlanmasını sağlar .
  • Son satır, !$kullanılmayan ancak doğru bir şekilde ayrıştırılması ve yazılması gereken bir operatör tanımıdır.

7

PHP , 15 13 bayt

Yorum kötüye kullanma olmadan bir PHP versiyonu. ohcetanımsız bir sabittir, bu nedenle adının dize değerine eşit olacaktır. Sonuç olarak, bu yazdırmaya +1-'ohce'veya -1+'ohce'tersine çevrildiğinde çalışacaktır . Yana 'ohce'olmayan bir sayısal değerdir, 0 aritmetik işlemler yerine kullanılan ve sadece edilecek 1veya -1yazdırılacaktır.

;echo+1-ohce;

Çevrimiçi deneyin!

Çevrimiçi deneyin!


Zekice. Güzel!
AdmBorkBork

1
Dostum, seninle aynı cevaba geldiğim için üzgünüm, 3 saat gecikti :( Olumlu oyum var
Ismael Miguel




6

Cubix , 7 6 5 bayt

@)O(@

Burada deneyin
Ters

açıklama

Cubified:

  @
) O ( @
  .

Kontrol akışını açarak )O(@hangi artışları, çıkışları, azalışları ve çıkışları gerçekleştiririz.

Tersine çevrildi ve cubube edildi:

  @
( O ) @
  .

Kontrol akışını açarak hangi azalışları (O)@, çıkışları, artışları ve çıkışları gerçekleştiririz.

Önceki versiyon

@O(.)O@

Burada deneyin
Ters

Kısa değil, estetik açıdan hoş.


boyutu 1 küp koymak için güzel, yol!
Giuseppe

3
@)O(@5 bayt ve simetri restorasyonu için :)
MickyT



5

Yığın Kedileri -mn , 4 bayt

:-:_

Çevrimiçi deneyin! Altbilgiye diğer tüm 4-baytlık çözümleri dahil ettim. (Stack Cats, ilk satır beslemesinden sonraki her şeyi görmezden gelir.)

Tersini dene!

açıklama

-nSayısal çıkışına bayrak dönüşler (ve girdi ama hiç yok) ve -mbayrak normalde kaynak kodunun gereksiz kısmını önlemek sağlar sadece bir golf kolaylığıdır. Bunun nedeni, her Stack Cats programının ayna simetrisine sahip olması gerektiğidir. İle -mbayrak sadece o ilk yarıyı (artı merkezi karakter) verir. Yani buradaki asıl program:

:-:_:-:

İlk TIO bağlantısında görebileceğiniz gibi, bir ton 4-byte çözüm var, ama basitliği için bunu seçtim. Yığın Kedileri yığın tabanlıdır ve bu program yalnızca ilk yığını kullanır. Herhangi bir girdiye sahip olmadığımızdan, -1sonsuz bir sıfır kuyusunun üstüne tek bir (EOF işaretleyici) içerir. Programdaki üç komut aşağıdaki anlama gelir:

:   Swap the top two stack elements.
-   Negate the top stack element (i.e. multiply by -1).
_   Pop a. Peek b. Push b-a.

Yani programın yığını nasıl değiştirdiği (durumların ve komutların her komutun yığını bir durumdan diğerine nasıl değiştirdiğini gösterecek şekilde kademeli olduğu):

   :   -   :   _   :   -   :

-1   0   0  -1   1   0   0   1
 0  -1  -1   0   0   1   1   0
 0   0   0   0   0   0   0   0
 …   …   …   …   …   …   …   …

Görünüşe göre, burada gerçekten bir şey yapan tek komut, _EOF işaretçimizi a 1. Programın sonunda çıktısı örtük ve EOF işaretleyici isteğe bağlıdır, bu sadece 1aldığımız çıktıları yazdırır .

Şimdi kaynak kodunu tersine çevirirsek, dolaylı yansıtma nedeniyle gerçek program şu şekilde olur:

_:-:-:_

Bu çok farklı bir şey yapar:

   _   :   -   :   -   :   _

-1   1   0   0   1  -1   0  -1
 0   0   1   1   0   0  -1  -1
 0   0   0   0   0   0   0   0
 …   …   …   …   …   …   …   …

İstifin alt Bu kez olduğu hala -1bu EOF markeri ve tek olarak hareket etmez, böylece -1bunun üzerine basılmış olur.

...

Şimdi tüm bunların söylediği gibi, Stack Cats'in tersine çevirme koduyla benzersiz bir ilişkisi olduğundan, kullanmanın -mbiraz aldatma olduğunu düşünüyorum. Normalde sadece kaynak kodun yedekli bölümünü atlayarak bayt tasarrufu anlamına gelir, ancak burada aslında mücadeleyi çok daha kolay ve hatta tam program daha da kısaltır. Bunun nedeni, tam bir programın tersine çevrilmesi, yalnızca herhangi bir içeriyorsa programı değiştirecektir <>[], bu da programın birden fazla yığın kullanmasıyla sona ereceği anlamına gelir (Yığın Kedileri aslında yalnızca bir tanesinin doldurulmuş olduğu bir yığın kasete sahiptir) sıfır ile). Dahası, onu tersine çevirmek sadece <>ve []çiftleri değiştirir, bu da yürütmeyi simetrik kılar. O simetriyi kırmak için tek yol kullanımı için Ihangi yapar -]veya-[veya yığının tepesine bağlı olarak hiçbir şey. Yani...


Stack Cats -n , 11 bayt

*|]I*:*I[|*

Çevrimiçi deneyin! Altbilgi yine aynı bayt sayısındaki diğer tüm alternatifleri içerir. Bu programlardan bazıları 1 / -1, bazıları ise 2 / -2 çıktısı her programdan sonra belirtildiği gibi. Bunu rastgele bir şekilde 2'yi çıkaranlardan biri olarak açıklamak için seçtim.

Tersini dene!

açıklama

Dediğim gibi, bu biraz daha uzun. Bunun için -mgösterimi kullanmış olsak bile , yukarıdaki 4 yerine 6 byte ağırlığında olacaktır.

Bu sefer kullanılan komutlar:

*   Toggle the least significant bit of the top of the stack.
|   Reverse the longest non-zero of prefix on this stack.
[]  Move one stack to the left/right and take the top of the current stack with you.
I   If the top of the stack is positive, -], if it's negative, -[, otherwise do nothing.
:   Swap the top two stack elements.

İlk program sadece iki yığın kullanır. ASCII sanatında yapmak biraz dağınık ama elimden gelenin en iyisini yapacağım. Köşeli parantezler, bant başlığının hangi yığının üzerinde olduğunu gösterir ve komutları her bir yığın durumu arasına koyacağım.

  [-1]
…   0   0   …
    0   0
    …   …

      *

  [-2]
…   0   0   …
    0   0
    …   …

      | (does nothing)
      ]

      [-2]
…   0   0   …
    0   0
    …   …

      I

   [2]
…   0   0   …
    0   0
    …   …

      *

   [3]
…   0   0   …
    0   0
    …   …

      :

   [0]
…   3   0   …
    0   0
    …   …

      *

   [1]
…   3   0   …
    0   0
    …   …

      I

      [-1]
…   3   0   …
    0   0
    …   …

      [

  [-1]
…   3   0   …
    0   0
    …   …

      |

  [ 3]
…  -1   0   …
    0   0
    …   …

      *

  [ 2]
…  -1   0   …
    0   0
    …   …

Şimdi -1bir EOF marker gibi davranır ve 2basılır.

Diğer programa kadar aynıdır [. Yine de ikinci olana kadar neredeyse tamamen aynı I. Teknik olarak farklı bir yığında olacağız, ancak bunlarda değerler olmadan hepsi ayırt edilemez. Ama sonra arasındaki fark önemli I[ve I]biter:

    *|[I*:*I

      [-1]
…   3   0   0   …
    0   0   0
    …   …   …

        ]

          [-1]
…   3   0   0   …
    0   0   0
    …   …   …

        | (does nothing)
        *

          [-2]
…   3   0   0   …
    0   0   0
    …   …   …

Ve bu sefer, bir EOF işaretçimiz yok, ancak program hala çıktı veriyor -2.


4

Zsh , 12 bayt

<<<2 # 2-<<<

Çevrimiçi deneyin!

Temel ileri, yorum, ters yöntem.


G / Ç daha az kısıtlayıcıysa, negatif dönüş kodlarını destekleyen Zsh sayesinde daha ilginç bir 11 baytlık çözüm mümkündür:

return -127

Ters çevrilmiş, 721- nruterkodla çıkar 127(komut bulunamadı). exit -127kullanılamaz, a u8. Çevrimiçi deneyin!


4

CJam , 3 bayt

W;1

Çevrimiçi deneyin!

Onlar nasıl çalışır

Normal sürüm:

W    e# Push -1
;    e# Delete
1    e# Push 1
     e# Implicit display

Tersine sürüm: fikri anladınız.


4

MATL , 3 bayt

Nqv

Çevrimiçi deneyin!

Onlar nasıl çalışır

Normal:

N   % Push number of elements in the stack: 0
q   % Subtract 1: gives -1
v   % Concatenate stack contents vertically: leaves -1 as is
    % Implicit display stack contents

ters:

v   % Concatenate stack contents vertically: gives the empty array, []
q   % Subtract 1: leaves [] as is
N   % Push number of elements in the stack: 1
    % Implicit display. [] is not displayed


4

Altıgen , 5 bayt

1!@!(

Çevrimiçi deneyin!

Herhangi bir geçerli program:

  • Bir sonlandırma komutu verin ( @veya :). Sonuncusu yalnızca bir öncekine bir bellek işaretçisi hareket komutu olduğunda farklıdır. Ayrıca bu komut ilk veya son baytta olmamalıdır.
  • Bir çıkış komutu verin. ( !, ;ayrıca mümkündür ama muhtemelen daha fazla bayt alacaktır)
  • Bir hafıza manipülasyon komutu var.

Bu nedenle 2 baytlık bir program kesinlikle mümkün değil. 3 baytlık bir program imkansızdır, çünkü ikinci bayt sonlandırma komutu olmalıdır ve ilk bayt bir ayna / IP manipülasyon komutu olmamalıdır, bu nedenle sadece 1 bayt çalıştırılabilir.

4 baytlık bir programın mümkün olmadığını düşünüyorum. Böyle bir program a@bcaltıgen ızgaralı forma sahip olmalıdır

 Forward:       | Backward:
                | 
  c b           |   a @
 @ a .          |  b c .
  . .           |   . .

Bu nedenle aIP yönlendirme komutu olmalıdır. Ancak sadece 1 bellek manipülasyon komutu ile hem pozitif hem de negatif sayı üretmek mümkün değildir.


Önemsiz bir cevabın iyiliğinin kanıtı için +1
Jo King



3

Java 5 veya 6, 127 67 bayt

enum A{A;{System.out.print(9);}}//}};)9-(tnirp.tuo.metsyS{;A{A mune

Çıkışlar 9/ -9.

Çevrimiçi derleyici yok, çünkü Java 5 veya 6 hiçbir yerde kullanılamıyor.

Bununla birlikte, bu 127 bayt Java 8 eşdeğerini deneyebilirsiniz :
Çevrimiçi deneyin ya da çevrimiçi ters deneyin .

Açıklama:

enum A{                              // Create an enum
 A;                                  //  With a mandatory value
 {                                   //  And in a separate instance code-block:
  System.out.print(9);}}             //   Print 9 to STDOUT
//}};)9-(tnirp.tuo.metsyS{;A{A mune  // Comment and thus a no-op

Java 5 ve 6'da, bir programın zorunlu ana yöntemini kaçırmamasına rağmen, enum içinde bir şey yapmak için kod bloğu oluşturmanıza izin veren bir hata vardı. Bu bir hataya neden olur:

java.lang.NoSuchMethodError: main
"main" dizisindeki özel durum

Ama yine de ilk önce STDOUT istediklerimizi çıktıracak, böylece bunu görmezden gelebiliriz .


3

Golang , 109 bayt

package main;import "fmt";func main(){fmt.Println(1)}//})1(nltnirP.tmf{)(niam cnuf;"tmf" tropmi;niam egakcap

Ve bunun tersi:

package main;import "fmt";func main(){fmt.Println(-1)}//})1(nltnirP.tmf{)(niam cnuf;"tmf" tropmi;niam egakcap

Çevrimiçi deneyin!


2
Git bilmiyorum, ama birkaç bayt kaldırabilirsin. PrintlnOlabilir Printve import "fmt";boşluk ihtiyacı yoktur: import"fmt";. :)
Kevin Cruijssen


3

Retina , 6 bayt

-`<
-

Yazdırır 1.

Çevrimiçi deneyin!



-
<`-

Yazdırır -1.

Çevrimiçi deneyin!

Açıklama: 1

-`<
-

Bu ... hiçbir şey yapmaz. Ötürü, `bu bir substitusyondur <için -(konfigürasyonu olan -hiçbir şey yapmaz), ancak çıkış sıra boş yani giriş boştur.


Ve bu ikinci aşama boş regex ile boş girişe eşleşir ve tam olarak 1 olan eşleşme sayısını sayar. Çıktı kapalıdır.

Açıklama: -1


-

Bu sefer boş regex ile değiştiririz -. Bu gerçekten boş girişi teke çevirir -.

<`-

Burada, yapılandırma aslında bir şey yapar: <aşamayı gerçekleştirmeden önce sahne girişini yazdırır, biz de basarız -. Sonra -tekrar 1 olan sahne girişindeki tireleri sayar. Örtük çıktı nedeniyle, bu bir 1sonraki basar -ve bize -1gerektiği şekilde verir.


3

TEX(MathJax), 4bytes

1%1-

CodeResultForward:1%1-1Backward:-1%11


3

brainfuck , 156 bayt

+++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++++++++++<+++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++

Çevrimiçi deneyin! / İleri / geri doğrulayıcı Bash

-1İleri ve \n1geri yazdırır .

Neredeyse önemsiz olmasına rağmen, bu belirli sabit çıktı için en uygun çözüm olduğuna inanıyorum.

Kanıt:

  • Programda olamaz [veya ].

    Bu nedenle programın formunda olması gerekir <A> . <B> . <C>.

  • Her biri ,, veya <sayısını artırmadan yeterli sayıda değiştirilebilir .+-

  • Her +biri yalnızca ileri veya geri programlarda kullanışlıdır, hiçbir zaman ikisini de yapmaz.

    İspat: +Kısmen A açıkça ileri programda faydalıdır ve +Kısmen C açıkça geri programda yararlıdır.

    Göstermek shift(P)= sayısı <P - sayısı >P program göz önünde içinde <B> = <D> + <E>, +ortasında, ileri programında yararlıdır shift(E) = 0, benzer şekilde geriye dönük programda kullanışlıdır shift(D) = 0. Bununla birlikte shift(D) = shift(E) = 0, program Bileri veya geri uygulanırsa, ikinci kez yazdırmadan önce geçerli hücreye sabit bir değer ekler, çünkü bu durum böyle olamaz ord('1') - ord('\n') != ord('1') - ord('-').

Bu nedenle program en az ord('-')+ord('1')+ord('\n')+ord('1') = 153 +s, 2 .s ve en az a < >veya ,çünkü gerekli shift(B) != 0.

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.