Kaynak kodu tersine çevirirseniz girişi olumsuzlarsınız!


36

Bir soygunun kesin soyulması . Git onları oyla!

Göreviniz kabul etmek istiyorsanız, tamsayı girişini / argümanını çıkaran / veren bir program / fonksiyon yazmaktır. İşin zor yanı, kaynak kodunuzu tersine çevirirsem çıktının olumsuzlanan tamsayı olması gerektiğidir.

Örnekler

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

Diyelim ki kaynak kodunuz ABCve girişi -2. Ben yazarsam CBAyerine ve çalıştırın, çıkış olmalıdır 2.

Bir girdi 0verebilir 0veya -0yine de, imzalanan desteği destekliyorsanız, -0vermeniz gerekir 0.


5
Neden aynı sorunun bir kopyasına ihtiyacımız var?
Christian

5
@Hristiyan Biri sabit bir sayı (ve olumsuzlama) çıkarırken, bunun girdi almak ve geri almak / olumsuzlamak zorunda kalması. Birçok dilde çok farklı bir iş.
Adem

5
Evet, şimdi farkı görüyorum. Bir çok dikkatlice okumalısınız
Christian

C # gibi yapısal bir dil kullanıyorsanız, satırları ters mi çeviriyorsunuz?
PerpetualJ

@PerpetualJ Hayır, bazıları satır sonları olan karakter listesi gibi kaynaklara bakın.
19:42

Yanıtlar:





11

x86 makine kodu, 3 bayt

C3 D8 F7

Yukarıdaki kod baytları, işlem yapılmayan bir işlevi tanımlar: yalnızca arayan kişiye kontrolü döndürür. Bu işlevi, bir dönüşün ardından geldiklerinden, yürütülmeyecek olan iki çöp baytı izler - “hiçbir erkeğin topraklarında” değildir. Assembler anımsatıcısında:

ret                     ; C3    
fdiv  st(0), st(7)      ; D8 F7

Tamam, şimdi bazı troller geliyor ve baytların sırasını tersine çeviriyor:

F7 D8 C3

Bu baytlar şimdi EAXkayıt defterinde bir tamsayı argümanı alan, onu olumsuzlayan ve kontrolü arayan kişiye geri döndüren bir işlev tanımlamaktadır . Assembler anımsatıcısında:

neg  eax     ; F7 D8
ret          ; C3

Yani… bu basitti. :-)

"Olumsuz" komutunu istediğimiz herhangi bir şey yapabiliriz , çünkü "ileri" yönelimde asla gerçekleştirilmez ve yalnızca "ters" yönelimde gerçekleştirilir. Bu nedenle, keyfi olarak daha karmaşık şeyler yapmak için aynı modeli izleyebiliriz. Örneğin, burada farklı bir sicilde bir tamsayı argümanını alıyoruz (örneğin, EDI* nix sistemlerinde yaygın olarak kullanılan System V çağrı kurallarına uymak için), reddetmek ve konvansiyonel olarak geri vermekEAX sicile :

C3      ret
D8 F7   fdiv  st(0), st(7)      ;  \ garbage bytes that
F8      clc                     ;  | never get executed,
89      .byte 0x89              ;  / so nobody cares

  ↓ ↓

89 F8   mov  eax, edi
F7 D8   neg  eax
C3      ret



6

Boşluk , 48 bayt

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

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

Whitespace cevabımın küçük modifikasyonu , kaynak kodunu tersine çevirdiğimde çıktıyı olumsuzlarsınız! meydan okumak .

Çevrimiçi deneyin ya da çevrimiçi ters deneyin (yalnızca boşluk, sekme ve yeni satırlarla).

Açıklama:

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

SSSN   # Push 0 to the stack
SNS    # Duplicate it
TNTT   # Read STDIN as integer, and store it at heap address 0
TTT    # Retrieve the input from heap address 0, and push it 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:

SSSN   # Push 0 to the stack
SNS    # Duplicate it
TNTT   # Read STDIN as integer, and store it at heap address 0
TTT    # Retrieve the input from heap address 0, and push it to the stack
SSTTN  # Push -1 to the stack
TSSN   # Multiply the top two values on the stack together
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. İçin 0biz açık bir ihtiyacım yok S=0bu yüzden sadece, SSSNya da SSTNyeterli.




5

Brain-Flak , 7 bayt

#)]}{[(

Çevrimiçi deneyin!

ters:

([{}])#

Çevrimiçi deneyin!

Not: Yalnızca yorumları destekleyen tercümanlarda çalışır (örneğin, Rain-Flak'ta çalışır, ancak BrainHack'te olmaz)


Yalnızca byte'ları tersine çevirmek yerine açma / kapama braketlerini de değiştirirsek, bunu yorum kullanmadan 8 baytta yapabiliriz:

({}[{}])

Çevrimiçi deneyin!
Deneyin ters!


Bu tanımsız davranış kötüye kullanımı mı? Brain-Flak teknik özelliklerinin bu paranteze izin verdiğini sanmıyorum.
HighRadioactive

@TwilightSparkle #Bir yorum başlatır, böylece orijinal sürümdeki parantez yok sayılır.
Riley,

Oh evet unuttum! Ama o zaman sadece Rain-Flak'ta çalışıyor (Yine de resmi tercüman). Muhtemelen bundan bahsetmen gerekecek mi?
HighRadioactive

@TwilightSparkle açıklama için bir not ekledi. Teşekkürler.
Riley,

Eğlenceli küçük zorluk: Bunu sadece tersine çevirmek yerine açma / kapama braketlerini değiştirirseniz, yorum yapmadan yapabilir misiniz?
DJMcMayhem




4

R, , 23 bayt

Yorum numarası olmadan gitmeye karar verdim.

ileri

`+`=scan;""+-0;nacs=`+`

Çevrimiçi deneyin!

Ters

`+`=scan;0-+"";nacs=`+`

Çevrimiçi deneyin!

İleri sürümde +bir ikili operatör davranıyor ve -tek bir operatör.

Tersi durumda +, birleşme meydana gelir ve -ikilidir. Böylece tarama işlevi argümanları alır: file=""bu stdin vewhat=0 aynı zamanda varsayılandır. Ne zaman+ unary olduğunda ilk argüman sağda, ikili olduğunda ilk argüman soldadır.

;nacs=`+`

Kodun bir kısmı gerçekten işe yarar bir şey yapmaz, bu nedenle bir anlamda kodum yorum yorumunu kullanmaktan çok daha geçerli değildir.


1
Bu çok zekice (+1). R operatörlerini golf baytlarına sık sık yeniden tanımlıyoruz, ancak sanırım ilk defa +hem tekli hem de ikili olarak kullanılmak üzere yeniden tanımlandığını gördüm . Bunun nasıl çözümlendiğini anlamam bir dakika sürdü… Başka hiçbir operatör ismi işi yapmazdı.
Robin Ryder


4

Perl 5 ( -p), 7 6 bayt

-1 @primo sayesinde

$_*=$#

TIO

Bir yorum girişi değiştirmez

#1-=*_$

Girişi olumsuzla

$_*=-1#

TIO


-1: $_*=$# TIO . Not olduğunu #aksi takdirde değişken olarak yorumlanır, programın en son byte olmalıdır $#ziyade adı <boş> ile dizinin son endeksine göre,.
primo

1
ancak nasıl çalıştığını anlamıyorum çünkü yazdırmaya çalışmak $#bir hata (eğer # son karakter değilse) ya da hiçbir şey vermiyor
Nahuel Fouilleul

Sadece -pveya ile çalışmak gibi görünüyor -n. Kazan dairesinin bununla bir ilgisi olduğundan şüpheliyim ...
primo

2
@primo Çalışır, çünkü kodun arkasına bir satır -p/-nekler ;. Bu $#aslında olduğu anlamına gelir $#;: dizinin büyüklüğü @;. Büyüklük @;değişirse, sonuç artık doğru olmaz ( TIO ). Her neyse, bu süper zekice, aferin! :)
Dada

Bu açıklama ile görülebilir perl -MO=Deparse -p <(echo -n '$_*=$#'), çünkü perl -MO=Deparse -pe '$_*=$#'yeni bir
çizgi

4

Gaia , 2 bayt

_@

Çevrimiçi deneyin!

_	| implicit push input and negate
 @	| push next input OR push last input (when all inputs have been pushed)
	| implicit print TOS

ters:

@	| push input
 _	| negate
	| implicit print TOS

4

Backhand , 6 5 bayt

I@-Ov

Çevrimiçi deneyin! İki katına dene!

Backhand'deki imlecin doğası nedeniyle biraz karmaşık bir hal aldı. Kısa haha almanın mümkün olduğunu sanmıyorum , yanıldığım ortaya çıktı. Bu hayır kopyalar talimatı ve iki program arasındaki hem girdi hem de çıktı komutlarını yeniden kullanır. Şimdi en iyisi olduğunu düşünüyorum, çünkü hepsine ihtiyacınız var.IO-@ çalışmak için komutlara ve 4 byte'lık bir programda bu komutların sadece ikisini çalıştırabilirsiniz.

Açıklama:

Backhand'deki işaretçi üç hücrede bir keneyi hareket ettirir ve hücrenin sınırlarını zıplar, yani genel mantık örtüşüyor demektir. Bununla birlikte, bu hızıv ve^ komutlarıyla değiştirebilirsiniz.

Orijinal program IO-@, sayı olarak girilen, sayı olarak çıkarılan, çıkartmak, sonlandırmak için verilen talimatları uygular . Açıkçası, çıkarma gereksiz. Kodda bunlar:

I@-Ov
^  ^    Reflect
  ^     Reflect again
 ^

Tersine çevrilmiş program yürütülür v-I-vO-@. vKeneler arasında işaretçi adımları ve azaltır -dolaylı sıfırdır istifin alt kısmından çıkarılır. Ekstra -komutlar hiçbir şey yapmaz. Program gibi yürütür

vO-@I
v       Reduce pointer speed to 2
  -     Subtract zero from zero
    I   Get input as number and reflect off boundary
  -     Subtract input from zero
v       Reduce pointer speed to 1
 O      Output as number
  -     Subtract zero from zero
   @    Terminate




3

Python 3 , 22 14 bayt

int#__bus__. 0

Çevrimiçi deneyin!

Kullanımları intsınıfının yapıcısı ve yerleşik bir sözde özel yöntem.


Huh. Niçin nitelikten önceki boşluk zorunludur?
Jo King

2
@JoKing 0.bir sembol tarafından takip edilen bir dizi olarak yorumlanır
attinat

2

05AB1E , 2 bayt

(I

Çevrimiçi deneyin!

ters

(    negates nothing
  I  pushes input

I    pushes input
  (  negates input

Girdiyi yalnızca bir yönde olumsuz etkilemesi, diğerinde olduğu gibi bırakması beklenir. Açıkçası, 1 karakterli çözüm geçerli olamaz.
Adám

Kötü, ben yanlış
anladım


2

APL (Dyalog Unicode) , 13 3 bayt

-∘0

Çevrimiçi deneyin!

Önemsiz cevap. İadeargVeya¯arg .

Aptal olmamakla 10 bayt kurtarıldı (Adám teşekkürler).

Elde edilen 3-bayt daha uygun bir fonksiyonla değiştirildi.


Whoa, bu önemsizce üç baytta yapılabilir!
Adám

İlginçtir ki, zaten bunun bir alt çerçevesi olarak gömülü 3 baytlık bir cevabınız var.
Adem

@ Adám evet, orada bir yerde basit bir cevap olduğunu biliyordum. Teşekkürler.
J. Sallé

2

Turing Machine Language , 39 bayt

Olumlu

1 r - _ 0
0 l * * 0
0 - _ l 0
0 _ _ r 0

Olumsuz

0 r _ _ 0
0 l _ - 0
0 * * l 0
0 _ - r 1

Bu, düşündüğümden biraz daha zordu, çünkü çoğunlukla 'derleme' hatalarıyla çalışan kodlara sahip olma önyargılarımı geçmek zorunda kaldım.


2

> <> , 5 4 bayt

n-r0

-vseçeneği ile yığın başlatma özelliğini kullanır , giriş değişkeninizi oraya koyun.

Çevrimiçi deneyin!

Veya tersini dene

açıklama

n       Prints whatever is on the stack as a number
 -      Subtract the top 2 elements on the stack.
        There aren't 2 elements, so it crashes.
  r0    Never gets executed

or reversed:

0       Push a 0 onto the stack
 r      reverse the stack (now 0, -v)
  -     Subtract top 2 elements and push result (0-v, ie negated)
   n    Print as number
        The code wraps around and executes again. 
        It crashes on the - as there is only one
        item on the stack: 0.

2

Kediler -mn , 2 bayt yığını

-X

Çevrimiçi deneyin!

Tersini dene!

açıklama

Bunun aslında Stack Cats'teki önceki yarışmadan çok daha kolay olduğu ortaya çıktı. Tam program (uygulandıktan sonra -m) burada -X-. XTeyp başının sağındaki ve sağındaki yığınları değiştirmek için kullanılır, yani ilk yığını hiç etkilemez, bu nedenle onu görmezden gelebiliriz. Ama o zaman program etkili.-- (yığının en üstünü iki kere olumsuzlayın), hiçbir şey yapmaz.

Ters program için, uygulama -mverir X-X. Yine, Xhiçbir şey yapmaz, bu yüzden program etkili, sadece -yığının tepesini olumsuzlar.

Diğer 2 baytlık çözüm -=, ancak hemen hemen aynı. Tek fark bu= tüm bacaları değil, sadece bitişik bacaların üstlerini değiştirmektir.

Fakat yine de kullanmak -mbiraz hile yapmak gibi geliyor, bu yüzden aşağıda tamamen yansıtılmış bir program kullanan bir çözüm var.


Yığın Kediler -n , 7 bayt

:I<->I:

Çevrimiçi deneyin!

Tersini dene!

açıklama

Önceki cevabın düşünceleri hala geçerlidir : herhangi bir geçerli çözüm eşleştirilmiş karakterleri kullanmalı ve I. Altı olası çözüm (TIO bağlantısına dahil edilmiş) hepsi aynıdır. -ve _bu programa eşdeğerdir ve :ile ikame edilmiş olabilir |ya da T(sıfır girişler için tesadüfi olarak iş sıfır olmayan girişleri için aynı şeyi hangi). Bunu açıklamak için seçtim çünkü en kolayı.

Bu nedenle, başlangıç ​​yığınının girişini -1(sonsuz sayıda sıfırın üstünde) tutarken, bant boyunca diğer tüm yığınların yalnızca sıfırları tuttuğunu unutmayın. Stack Cats, herhangi bir uzunluğa sahip programın hiçbir şey yapmadığı özelliğine de sahiptir (sonlandırması koşuluyla, ancak bu zorluk için yine de döngüler kullanamayız). Aynı şey orta karakterli hiçbir şey yapmayan herhangi bir tuhaf uzunluktaki program için de geçerlidir ... Bakalım:

:    Swap the input with the -1 below.
I    Move the -1 one stack to the left and turn it into +1.
<    Move another stack left (without taking the value).
-    Negate the zero on top of that stack (i.e. do nothing).

Bu nedenle, programın ikinci yarısı ilk yarısını tam olarak çözer ve -1tekrar bir girdiyle sonuçlanır .

Ters program :I>-<I:. Bunun bir şeyleri nasıl değiştirdiğini görelim:

:    Swap the input with the -1 below.
I    Move the -1 one stack to the left and turn it into +1.
>    Move one stack right, i.e. back onto the initial stack which still holds the input.
-    Negate the input.
<    Move back to the left where we've parked the 1.
I    Move that 1 back onto the initial stack and turn it back into a -1.
:    Swap the -1 below the negated input to act as an EOF marker.

2

Toplu iş, 34 bayt

@ECHO.%1 2>MER@
@REM>2 1%=-aa/TES@

Echoes ( ECHO.) girişi ( %1). İlk satırın geri kalanı teknik olarak STDERRadlandırılan bir dosyaya teknik olarak yönlendirilir MER@, ancak bu etkileyici değildir.
İkinci satır yorumlandı ( REM...).

ters

@SET/aa-=%1 2>MER@
@REM>2 1%.OHCE@

Set komutunun ( SET /a) aritmetik modunu, ( -=) girişine ( %1) aeşdeğer tanımsız bir değişkenden ( ) çıkarmak için kullanır 0 - input. Yine, ilk satırın geri kalanı teknik olarak STDERRadlandırılan bir dosyaya teknik olarak yönlendirilir MER@, ancak bu etkileyici değildir.
İkinci satır yorumlandı ( REM...).


Bu ilginç görünüyor. Açıklamak ister misin?
Eylül’de

@ Adám Bir açıklama ekledi ve ayrıca programları tersine çevirdiğimi de farkettim.
Büyük

2

Brachylog , 2 bayt

&ṅ

Brachylog dolaylı olarak soldan ve sağdan çıkar.
&her şeyi sola yoksayar ve girişi fonksiyona doğru iletir.
Her iki tarafının da birbirlerinin ihmal edilmesini engeller.

Çevrimiçi deneyin


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.