Jadikan bahasa Anda * sebagian besar * tidak dapat digunakan (utas Robber)


31

Terinspirasi oleh komentar ini ...

Terima kasih kepada pengguna, Step Hen , Wheat-Wizard , dan Dennis yang telah membantu saya memperkuat spesifikasi tantangan ini sebelum mempostingnya!

Ini adalah utas Perampok! Untuk utas Polisi, buka di sini


Dalam tantangan ini , Anda bertugas menjalankan beberapa kode yang membuatnya sehingga bahasa Anda tidak lagi memenuhi kriteria kami sebagai bahasa pemrograman. Dalam tantangan itu, itu berarti membuatnya agar bahasa tidak bisa lagi ...

  • Ambil input dan output numerik

  • Tambahkan dua angka bersamaan

  • Uji apakah angka tertentu prima atau tidak.

Ini adalah tantangan , di mana ada dua tantangan yang berbeda dengan dua tujuan yang berbeda: Polisi akan mencoba menulis beberapa kode yang membuat bahasa sebagian besar tidak dapat digunakan, dan para perampok akan mencoba menemukan solusi tersembunyi yang memungkinkan polisi untuk memulihkan bahasa mereka.

Polisi akan menulis dua potongan kode:

  1. Salah satu yang membuat bahasa mereka sebagian besar tidak dapat digunakan, misalnya dengan menghapus fungsi bawaan untuk mengambil operasi input / output dan numerik. Kode ini tidak diizinkan mogok atau keluar. Seharusnya mungkin untuk menambahkan kode ke akhir cuplikan ini, dan kode itu akan dievaluasi . Dan

  2. Potongan kode yang mengambil dua angka sebagai input, menambahkannya bersama-sama, dan mengeluarkan jumlah mereka. Cuplikan ini harus tetap berfungsi dengan benar bahkan setelah menjalankan cuplikan pertama. Saat kedua snippet digabungkan bersama, mereka harus membentuk program lengkap yang menambahkan dua angka, atau mendefinisikan fungsi yang menambahkan dua angka. Cuplikan ini mungkin akan bergantung pada perilaku yang tidak jelas, dan sulit ditemukan.

Polisi juga akan memilih metode input dan output standar apa pun . Namun, mereka harus mengungkapkan dengan tepat format (input dan output) yang mereka gunakan. Agar Anda dapat memecahkan jawaban mereka, Anda harus mengikuti format input / output yang sama, atau retak Anda tidak masuk hitungan.

Jawaban polisi akan selalu terungkap

  • The pertama potongan (jelas tidak yang kedua).

  • Bahasa (termasuk versi minor, karena sebagian besar pengiriman mungkin bergantung pada kasus tepi yang aneh)

  • Format IO, termasuk apakah itu fungsi atau program penuh. Perampok harus menggunakan format yang sama untuk menjadi celah yang valid.

  • Setiap kasus tepi aneh diperlukan untuk jawaban mereka untuk bekerja. Misalnya, hanya berjalan di linux , atau membutuhkan koneksi internet .

Sebagai seorang perampok, Anda harus melihat salah satu dari kiriman polisi, dan berupaya memecahkannya. Anda mungkin retak itu dengan menulis setiap potongan valid yang bisa bekerja sebagai potongan 2 (menambahkan dua angka bersama setelah bahasa dibuat sebagian besar tidak dapat digunakan). Ini tidak harus potongan yang sama dengan yang awalnya ditulis polisi. Setelah jawaban Anda retak, poskan kode Anda sebagai jawaban di utas ini, dan poskan tautan ke jawaban Anda sebagai komentar pada jawaban polisi. Kemudian, postingan itu akan diedit untuk mengindikasikan telah di-crack.

Ini sebuah contoh. Untuk cuplikan pertama, Anda mungkin melihat program python 3 berikut sebagai jawaban polisi:

Python 3

print=None

Mengambil input dari STDIN dan output ke STDOUT

Cuplikan kedua yang valid dapat berupa

import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)

Ini valid karena akan mengambil dua angka sebagai input, dan mengeluarkan jumlah mereka meskipun Anda menggabungkan kedua snippet bersama, misalnya

print=None
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)

Ini adalah celah yang valid untuk jawaban mereka.

Jika jawaban seorang polisi tetap tidak terpecahkan selama satu minggu penuh, mereka dapat mengedit dalam potongan kedua mereka, dan menunjukkan bahwa jawaban mereka sekarang aman . Setelah diedit agar aman, Anda mungkin tidak lagi mencoba untuk memecahkannya. Jika mereka tidak mengeditnya dengan aman, Anda dapat terus mencoba memecahkannya sampai selesai.

Pemenang utas perampok adalah pengguna yang telah memecahkan sebagian besar jawaban, dengan pemutus ikatan adalah saat mereka mencapai N celah. (jadi jika dua pengguna yang berbeda masing-masing memiliki 5 celah misalnya, pengguna yang memposting celah ke-5 mereka terlebih dahulu adalah pemenang). Setelah waktu yang cukup berlalu, saya akan menerima jawaban pemenang dengan suara terbanyak.

Selamat bersenang-senang!

Klarifikasi aturan

  • Cuplikan pertama harus berjalan dengan benar tanpa mengambil input apa pun . Ini dapat menampilkan apa pun yang Anda suka, dan output ini akan diabaikan. Selama setelah potongan selesai, potongan kedua berjalan dengan benar.

  • Cuplikan kedua harus benar-benar dieksekusi agar jawaban Anda valid. Ini berarti jawaban seperti

    import sys
    sys.exit()
    

    tidak valid karena tidak melanggar bahasa. Itu hanya berhenti.

  • Setelah aman, skor Anda adalah jumlah byte dari kedua cuplikan .

  • Ini kembali ke Harap mengungkapkan kasus tepi aneh yang diperlukan untuk jawaban Anda untuk bekerja ... Kiriman Anda harus berisi informasi yang cukup sebelum diturunkan untuk dapat direproduksi setelah diungkapkan. Ini berarti bahwa jika jawaban Anda menjadi aman, dan kemudian Anda edit di: Inilah jawaban saya. Oh ya, BTW ini hanya berfungsi jika Anda menjalankannya pada Solaris, bercanda pada Anda! jawaban Anda tidak valid dan akan dihapus dan tidak dianggap memenuhi syarat untuk menang.

  • Cuplikan kedua dibolehkan mogok setelah mengeluarkan jumlah. Selama output masih benar (misalnya, jika Anda memilih untuk output ke STDERR, dan kemudian Anda mendapatkan banyak informasi macet, ini tidak valid)

Papan peringkat

Berikut adalah daftar setiap pengguna dengan setidaknya satu celah, diurutkan berdasarkan skor dan kemudian nama (berdasarkan abjad). Jika Anda mengirimkan celah, perbarui skor Anda sesuai dengan itu.

#User                       #Score
Ilmari Karonen              8

Dennis                      5

Olivier Grégoire            4

Sisyphus                    3
Veedrac                     3

Arnold Palmer               2
Bruce Forte                 2
DJMcMayhem                  2
Dom Hastings                2
ppperry                     2

1bluston                    1
2012rcampion                1
Ben                         1
BlackCap                    1
Christian Sievers           1
Cody Gray                   1
HyperNeutrino               1
Joshua                      1
Kaz                         1
Mark                        1
Mayube                      1
Xnor                        1
zbw                         1

Jawaban:


3

Java 8 oleh Olivier Grégoire

class A {
  public A() {
    String[] args = System.lineSeparator().split(",");
    System.out.print(Integer.parseInt(args[0]) + Integer.parseInt(args[1]));
  }
}

Cobalah online!

Karena Olivier secara eksplisit mengizinkan lewat input melalui properti yang ditetapkan menggunakan argumen VM, saya akan menentukan bahwa input harus diberikan dalam argumen VM -Dline.separator=X,Y, di mana Xdan Yadalah angka yang akan ditambahkan. Artinya, misalnya menambahkan angka 17 dan 25, program harus dipanggil sebagai:

java -Dline.separator=17,25 Main

Saya percaya ini harus bekerja pada sistem apa pun daripada yang dapat menjalankan program Java pada baris perintah. Bahkan pada sistem yang tidak memiliki baris perintah, mekanisme lain yang setara untuk mengatur properti sistem dapat digunakan untuk meneruskan input ke VM.


Ps. Inilah upaya cracking saya sebelumnya, yang dianggap tidak valid karena menggunakan fitur spesifik JVM:

class SecurityManager extends sun.awt.AWTSecurityManager {
  static {
    String[] args = System.getProperty("sun.java.command").split(" ");
    int a = Integer.parseInt(args[args.length-2]);
    int b = Integer.parseInt(args[args.length-1]);
    System.out.println(a+b);
  }
}

Cobalah online!

Ini ternyata jauh lebih sedikit verbose dari yang sebelumnya . Bagian yang sulit adalah menemukan subkelas SecurityManageryang tidak hidup di ruang nama yang dimulai dengan " java.". Saya menduga ini masih bukan solusi yang dimaksudkan, tetapi berhasil. *

*) Pada TIO, setidaknya; yang sun.awt.AWTSecurityManagerkelas dan sun.java.commandproperti tampaknya tidak secara resmi didokumentasikan, dan mungkin tidak tersedia pada semua JVMs.


Pekerjaan yang baik! Saya mencoba ini, tetapi tidak dapat menemukan SecurityManageryang ada dalam ruang lingkup ... Anda juga dapat membaca dari System.inpada titik ini, karena itu belum ditutup.
zbw

Maaf, ini adalah jawaban yang bergantung pada platform dalam dua hal: keduanya sun.awt.SecurityManagerdan "sun.awt.command"ini tergantung pada platform dan bukan bagian dari Java .
Olivier Grégoire

Yap, retak! :) Solusi yang dimaksud adalah melalui System.getProperties().get("blah")(karena saya hanya memblokir akses System.getProperty, bukan System.getProperties), tapi ini cukup bagus! Sudah selesai dilakukan dengan baik!
Olivier Grégoire

22

C (GCC / Linux) oleh Sisyphus

Cuplikan ini menutup fungsi yang disediakan dan memulai yang baru (injeksi kode klasik), yang dengan sendirinya mengubah closesehingga alih-alih menutup fd, jalankan kode yang kita inginkan.

}
int close(int x) {
  int a, b;
  scanf("%d %d", &a, &b);
  printf("%d\n", a + b);

  exit(0);

20

Python, solusi Wheat Wizard di sini

import sys
c="".join(open(__file__).read().split('\n')[4:])
if set(c)-set(' &)(,.:[]a`cdfijmonrt~')or"import"in c:sys.setrecursionlimit(1)
f=lambda\
:[]                                                      # my code starts here
sys.setrecursionlimit(1000)
print(int(input())+int(input()))

Maksudku, kamu bisa mengatur batas rekursi kembali, dan tidak ada hal buruk yang terjadi ...

Bekerja pada TIO

Catatan

Ini adalah pengiriman CnR pertama saya, jadi jika ini melanggar aturan, tolong beri tahu saya dan saya akan menghapus ini.


4
Saya bodoh karena melewatkan ini
Wheat Wizard

@WheatWizard :)
HyperNeutrino

@wheatwizard Jangan ungkapkan solusi yang Anda maksudkan. Aku looove melihat seorang polisi yang lebih baik dengan solusi asli Anda bahwa perbaikan masalah ini.
DJMcMayhem

@Djmcmayhem Saya mungkin akan memposting ulang dengan del sys.
Wheat Wizard

@WheatWizard Ingat os.sys, jika itu membuat perbedaan: P
HyperNeutrino

15

Haskell oleh Ben

import Prelude(getLine,print)
a=a
[]++s=s
(a:as)++s=a:(as++s)
r""=""
r(c:s)=(r s)++[c]
t(_:r)=r
ts l=l:ts(t l)
x[_](v:_)=v
x(_:r)(_:s)=x r s
d(a:_:_:_:_:_:_:_:_:_:r)=a:d r
(a:_)!!""=a
l!!(n:m)=d(x['0'..n](ts l))!!m
a+b=[[0..]!!a..]!!b
a-b=let n=[0..]!!a;m=[0..]!!b in
    case [n..m] of
      [] ->   x[m..n][0..]
      l  -> -(x l    [0..])
add('-':x)('-':y)= -(r x+r y)
add('-':x)y=r y-r x
add x('-':y)=r x-r y
add x y=x+y
main=do a<-getLine;b<-getLine;print(add a b)

Saya masih memiliki angka dan karakter literal (saya gunakan 0, '0'dan '-'), dan [a..]dan [a..b]yang sangat berguna. Dan saya punya unary -, tapi saya bisa melakukannya tanpa.

Saya membuat ulang ++untuk mengimplementasikan r( reverse) dan mendefinisikan tdan tsyang mana taildan tails. x a bmengembalikan nelemen th b, di mana npanjang aminus satu. xbiasanya dapat didefinisikan sebagai snd.last.zip. Fungsi dmengambil daftar dan mengembalikan daftar dengan elemen dari posisi yang merupakan kelipatan sepuluh. l!!smengembalikan nelemen th l, di mana srepresentasi string terbalik dari n. +mengembalikan sebagai bilangan bulat jumlah dua bilangan alami yang diberikan sebagai string terbalik, juga -untuk perbedaan. addmengembalikan sebagai bilangan bulat jumlah dari dua bilangan bulat negatif yang mungkin diberikan sebagai string.

Saya ingin tahu apakah ini agak mirip dengan apa yang ada dalam benak Ben.


Ya, ide yang hampir sama. Pencocokan pola dengan literal untuk mendapatkan tes kesetaraan dan percabangan, daftar sintaks enumerasi untuk mendapatkan bentuk kenaikan. Saya cukup terkejut menemukan :berada dalam ruang lingkup bahkan dengan NoImplicitPreludedan tanpa mengimpor apa pun.
Ben

7

C (gcc) oleh Conor O'Brien


void post_main() __attribute__ ((destructor));

void post_main()
{
    int a, b;
    char sum[11];
    void *stdin = fdopen(0, "r");

    fscanf(stdin, "%u %u", &a, &b);
    sprintf(sum, "%u", a + b);
    write(1, sum, strlen(sum));
}

Cobalah online!


ugggg Saya lupa melarang fscanf dan banyak fungsi lainnya>.> pekerjaan yang bagus
Conor O'Brien

7

Python 2 oleh Wheat Wizard (iterasi keempat)

import sys
if set("".join(open(__file__).read().split('\n')[4:]))-set(' &)(,.:[]a`cdfijmonrt~'):sys.setrecursionlimit(1)
for m in sys.modules:sys.modules[m]=None
del sys;f=lambda\
c,d:(`int([]in[])`[:[]in[]]).join([((c)and`dict([((int([]in[])),(int([]in[])))])`[(int([]in[[]])):][(int([]in[[]]))].join([`dict([((int([]in[])),(int([]in[])))])`[(int([]in[]))],`dict([((int([]in[])),c)])`[(int([]in[[]])):][(int([]in[[]])):][(int([]in[[]])):][(int([]in[[]])):]])or`int([]in[])`[:[]in[]]).format((int([]in[]))),((d)and`dict([((int([]in[])),(int([]in[])))])`[(int([]in[[]])):][(int([]in[[]]))].join([`dict([((int([]in[])),(int([]in[])))])`[(int([]in[]))],`dict([((int([]in[])),d)])`[(int([]in[[]])):][(int([]in[[]])):][(int([]in[[]])):][(int([]in[[]])):]])or`int([]in[])`[:[]in[]]).format((int([]in[]))),`(int([]in[]))`]).rfind(`(int([]in[]))`)

Cobalah online!

Tanpa eksploitasi, hanya fungsi untuk menambahkan hanya menggunakan karakter ' &)(,.:[]a`cdfijmonrt~', sebagaimana dimaksud (sebenarnya hanya '(),.:[]`acdfijmnort').

Saya tidak berusaha membuatnya pendek; Saya baru saja menulis subekspresi untuk nilai-nilai perantara seperti 0 dan string kosong dan string-substitusi pada.

def f(c,d):
	FALSE = []in[]
	TRUE = []in[[]]
	ZERO = int([]in[])
	ONE = int(TRUE)
	EMPTY = `int([]in[])`[:[]in[]]
	ZERO_STR = `ZERO`
	ONE_STR = `ONE`

	ZERO_DICT = dict([(ZERO,ZERO)])
	ZERO_DICT_STR = `ZERO_DICT`

	OPEN_BRACE = ZERO_DICT_STR[ZERO]
	COLON = ZERO_DICT_STR[ONE:][ONE]
	CLOSE_BRACE = ZERO_DICT_STR[ONE:][ONE:][ONE:][ONE:][ONE]

	C_STR = `c`
	D_STR = `d`

	FORMAT_STR_C = ''.join([OPEN_BRACE, ZERO_STR, COLON, C_STR, CLOSE_BRACE])
	FORMAT_STR_D = ''.join([OPEN_BRACE, ZERO_STR, COLON, D_STR, CLOSE_BRACE])

	LENGTH_C_STR = c and FORMAT_STR_C.format(ONE_STR) or EMPTY
	LENGTH_D_STR = d and FORMAT_STR_D.format(ONE_STR) or EMPTY

	TOTAL_STR = EMPTY.join([LENGTH_C_STR, LENGTH_D_STR, ZERO_STR])
	RESULT = TOTAL_STR.find(ZERO_STR)

	return RESULT

Cobalah online!

Gagasan intinya adalah bahwa format string '{0:5}'.format('1')memuat angka nol hingga panjang 5sejenisnya '1 '. Dengan menggabungkan dua string seperti menggunakan ''.join, jumlah panjangnya adalah jumlah angka input. Kemudian, kami menempelkan pada 0akhir dan memanggil .find()ke posisi akhir, yang jumlahnya.

String '{0:5}'ke format diproduksi dengan mengekstraksi {:}karakter dari string reprs kamus, dibuat dengan dict. String repr dari masing-masing puncak berturut-turut ditempatkan di mana 5 akan berada. Saya ingin menggunakan dict seperti {0:5}itu sendiri, tetapi repr nya mencakup ruang yang mengacaukannya.

Input 0 mengacaukan proses karena sub string memiliki panjang minimum 1. Kami memiliki mereka yang and/ormemberikan string kosong dalam kasus ini.


1
Ini sangat berbeda dari yang saya maksudkan, saya ingin sekali melihat penjelasan.
Wheat Wizard

Anda dapat melakukan semua golf Anda int([]in[])hanya int()karena keduanya akan menghasilkan 0.
Nilai Tinta


5

x86 Perakitan mode real 16-bit, oleh Joshua

    int  0x3                  ; <---  this is the "robber" portion

    ; -- begin code to print numbers in real-mode asm using ROM BIOS video interrupts --
    add  dx, cx               ; add input values together
    mov  ax, dx               ; move result into AX
    push WORD 0xB800
    pop  ds                   ; DS == starting address of text-mode video buffer
    xor  cx, cx               ; digit counter
    xor  di, di               ; position counter
    mov  bx, 0xA              ; divisor

    test ax, ax               ; is number negative?
    jns  .GetDigits
    neg  ax                   ; convert negative number to positive
    mov  WORD ds:[di], 0x4F2D ; output leading negative sign, in white-on-red
    add  di, 2                ; increment position counter

.GetDigits:
    xor  dx, dx
    div  bx                   ; divide DX:AX by 10 (AX == quotient, DX == remainder)
    push dx                   ; push digit onto stack
    inc  cx                   ; increment digit counter
    test ax, ax
    jnz  .GetDigits           ; keep looping until we've got 'em all

.PrintDigits:
    pop  dx                   ; get digit off of stack
    dec  cx                   ; decrement digit counter
    mov  dh, 0x4F             ; high byte: color attribute (white-on-red)
    add  dl, 0x30             ; low  byte: convert to ASCII
    mov  WORD ds:[di], dx     ; output digit
    add  di, 2                ; increment position counter
    test cx, cx
    jnz  .PrintDigits         ; keep looping until we've printed 'em all

    cli
    hlt

tangkapan layar dari dump kode Debug, bersama dengan output di sudut kiri atas

Penjelasan:

"Kerusakan" yang diperkenalkan oleh kode Joshua adalah pengaturan flag trap (TF), yang menempatkan CPU ke mode langkah tunggal. Ini berarti bahwa hanya satu instruksi yang akan dieksekusi pada satu waktu, sebelum CPU berhenti (jebakan) dengan interupsi tipe-1. Inilah yang memungkinkan para debugger untuk mengimplementasikan kode satu langkah — cukup praktis di sana, tetapi PITA yang nyata jika Anda ingin menjalankan kode di luar konteks debugger!

Ini adalah bagian kode berikut yang menyalakan bendera perangkap:

pushf               ; push the FLAGS register onto the top of the stack
mov bp, sp          ; load the pointer to the top of the stack into BP
or word [bp], 256   ; bitwise-OR the WORD at the top of the stack (the copy of FLAGS)
                    ;  with 0x100, which turns on bit 8 (TF)
popf                ; pop the modified flags back off the stack into FLAGS

Implementasi flag trap berarti kita mendapat kesempatan untuk mengeksekusi tepat satu instruksi sebelum CPU jebakan — itu adalah yang datang segera setelah perintah di POPFsini. Jadi, kita perlu menghitung ini.

Triknya adalah INT 3instruksi, yang memanggil interrupt number 3. Ada dua alasan mengapa ini berfungsi untuk "melepaskan" kode:

  1. Bendera perangkap dibersihkan dalam penangan interrupt. Ini hanya bagian dari desain Intel, tetapi mungkin dilakukan untuk alasan kewarasan dasar. Ingatlah bahwa implementasi flag trap adalah bahwa interupsi tipe-1 dipanggil setelah eksekusi setiap instruksi, jadi jika TF tidak dihapus, INT 1itu sendiri akan memicu interupsi — itu akan terganggu sepanjang jalan turun. Juga, memiliki interupsi TF yang jelas hanya membuatnya lebih mudah untuk men-debug kode, seperti IDE yang secara otomatis melangkahi panggilan ke fungsi perpustakaan.

  2. Cara memotong kerja pada dasarnya sama dengan jauh CALL. Mereka memanggil penangan interupsi yang alamatnya disimpan pada posisi yang sesuai dalam tabel vektor interupsi global. Karena tabel ini dimulai pada alamat 0x0000:0000, dan disimpan dalam format 4-byte segment:offset, menghitung alamat sesederhana mengalikan 4 dengan vektor interupsi / angka. Dalam hal ini, kita memanggil interupsi 3, sehingga akan menjadi 4 × 3 = 12.

    ... dan Anda akan melihat bahwa Yosua dengan serius mengatur ini untuk kita. Sebelum mengaktifkan bendera jebakan, ia memiliki kode berikut:

    mov  di, 12
    mov  [di], si
    mov  [di + 2], bp
    

    yang mengatur 0x0000:000C(pengendali interupsi untuk INT 3) ke BP:SI. Itu berarti setiap kali INT 3dipanggil, itu mendorong register FLAGS ke stack, diikuti oleh alamat kembali, dan kemudian cabang ke BP:SI, yang memungkinkan kita untuk mulai menjalankan kode lagi, dalam konteks di mana bendera perangkap dimatikan.

Semuanya menurun setelah itu INT 3. Yang perlu kita lakukan adalah menambahkan dua angka bersamaan dan mencetak hasilnya. Kecuali bahwa ini tidak sesederhana dalam bahasa rakitan seperti di bahasa lain, jadi ini adalah tempat sebagian besar kode dihabiskan.

Joshua mengizinkan perampok untuk menentukan mekanisme I / O yang dia inginkan , jadi saya mengambil pendekatan sederhana dengan mengasumsikan bahwa nilai-nilai dilewatkan dalam DXdan CXmendaftar. Itu masuk akal, karena ini tidak musnah oleh kode "prolog" -nya.

Output kemudian dilakukan dengan menyimpan byte ASCII langsung ke memori video. Buffer video dimulai pada 0xB800:0000mode teks CGA, EGA, dan / atau VGA, jadi kami mulai mencetak di sana. Formatnya adalah: karakter dalam byte rendah, dan atribut warna dalam byte tinggi. Itu artinya setiap karakter menggunakan offset 2-byte. Kami hanya mengulangi masing-masing digit dalam angka (basis-10), mengubahnya menjadi ASCII dan mencetaknya satu per satu ke layar. Ya, ini banyak kode. Tidak ada fungsi perpustakaan untuk membantu kami dalam bahasa assembly. Ini hampir pasti dapat dioptimalkan lebih lanjut, tetapi saya bosan mengerjakannya ...

Setelah output ditampilkan, kode dibiarkan macet atau melakukan apa pun, jadi kami hanya menghapus interupsi dan menghentikan CPU.


Saya bingung; Saya tidak tahu bagaimana ini bisa melewati instruksi hlt di BP: SP + 1.
Joshua

@ Joshua Hmm, itu poin yang bagus. Aku bahkan tidak memikirkan itu. Melangkah melalui kode di Debug, saya menjalankan INT 3dan berakhir segera kembali pada instruksi yang mengikutinya, jadi saya hanya pergi dengannya. Mungkin ada hubungannya dengan lingkungan pengujian saya? CLIhanya akan menonaktifkan interupsi perangkat keras, tetapi bahkan jika sudah melewati HLT, Anda akan berpikir itu akan gagal dan mengeksekusi kode lsegera setelahnya.
Cody Grey

Oh, kau loncatan tunggal. Ya itu akan melakukannya. Saya akan mengecek tapi saya pikir saya mengunggah kode memukul.
Joshua

Saya juga diuji tanpa loncatan tunggal. Tidak ada perbedaan. Ini adalah FreeDOS terbaru di VM Virtualbox. Saya memiliki perangkat keras nyata yang tersedia, tetapi tidak merasa seperti menyalakannya. @ Yosua
Cody Grey

Nah, Anda jelas-jelas telah memecahkannya. Mungkin Anda menemukan cara untuk meningkatkan NMI itu.
Joshua


4

Python 3 , ppperry 's 2 Tantangan

Wow, ini menyenangkan! Saya menikmati pemecahan ini.

Sunting: Oke, saya memperbaikinya. Sepertinya kelas-kelas berada pada indeks yang berbeda dalam daftar subclass di TIO daripada di komputer saya, jadi saya membuatnya bekerja untuk keduanya, dan menambahkan TIO.

import sys
for mod in sys.modules.values():mod.__dict__.clear()
1+1

# My code begins here
str = "Hello!".__class__
int = (37).__class__
object = str.__base__

def find_subclass(superclass, name):
	for cls in superclass.__subclasses__():
		if cls.__name__ == name:
			return cls

_io_IOBase      = find_subclass(object, '_IOBase')        # <class '_io._IOBase'>
_io_RawIOBase   = find_subclass(_io_IOBase, '_RawIOBase') # <class '_io._RawIOBase'>
_ioFileIO       = find_subclass(_io_RawIOBase, 'FileIO')  # <class '_io.FileIO'>
stdout = _ioFileIO('stdout', mode='w', opener=lambda name,flags: 1) # FD for stdout is 1
stdin  = _ioFileIO('stdin',  mode='r', opener=lambda name,flags: 0) # FD for stdin is 0
nums = str(stdin.read(), encoding='utf-8').split()
stdout.write(str(int(nums[0]) + int(nums[1])).encode('utf-8') + b'\n')
stdout.flush()

Cobalah online!


Saya mendapatkan kesalahan. sys.excepthook is missing?
R

Hmm ... bekerja untukku. Apa kesalahan sebenarnya yang Anda dapatkan? (Itu terjadi karena kode ppperry menghancurkan hampir semua, termasuk mengetahui cara menunjukkan pengecualian, jadi itulah sys.excepthook, tetapi akan ada penyebab nyata yang tercantum di suatu tempat di sana.)
zbw

Tidak masalah, kesalahan sebenarnya adalah IndexError('list index out of range',). Ini sesuai dengan definisi _io_RawIOBase.
Rɪᴋᴇʀ

Masalahnya adalah bahwa urutan subclass tidak diperbaiki. _io_IOBase = [cls for cls in object.__subclasses__() if cls.__name__ == '_IOBase'][0]harus bekerja di mana-mana.
Dennis

@ Dennis Yap, saya menyadarinya dan baru saja memperbaikinya. Ini berfungsi di TIO sekarang!
zbw

4

Haskell oleh zbw

{-#OPTIONS_GHC -fth -w#-}
module M where

import Language.Haskell.TH.Syntax
import System.IO.Unsafe

a = $( runIO $ TupE[] <$
              do x <- readLn :: IO Integer
                 y <- readLn
                 print $ x + y )

Tidak dapat menjalankan kode saat run-time? Jalankan saat kompilasi!

Ini sangat menyenangkan, saya tidak tahu template haskell sebelum tantangan ini.



3

Python 2 oleh Wheat Wizard

import sys
c="".join(open(__file__).read().split('\n')[4:])
if set(c)-set(' &)(,.:[]a`cdfijmonrt~')or"import"in c:sys.setrecursionlimit(1)
sys.modules['sys'],sys.modules['os']=None,None;del sys;f=lambda\
a,b:a+b
__import__('sysconfig').__dict__['os'].__dict__['sys'].setrecursionlimit(1000)
print(f(1,2))

Cobalah online!


Ini ternyata lebih sulit daripada yang saya kira.
Wheat Wizard

3

Java oleh LordFarquaad

Memblokir akses ke objek di tingkat sumber benar-benar pintar (dan mengganggu saat pengujian), bagus sekali!

public class java {
  public static void main(String[] s) {
    //there is no executable code in snippet one.
    //your code here.
    try {
      ClassLoader cl = ClassLoader.getSystemClassLoader();
      Object in = cl.loadClass("java.lang.System").getDeclaredField("in").get(null);
      Object out = cl.loadClass("java.lang.System").getDeclaredField("out").get(null);
      Object scanner = cl.loadClass("java.util.Scanner").getConstructor(cl.loadClass("java.io.InputStream")).newInstance(in);
      int i = (Integer)cl.loadClass("java.util.Scanner").getMethod("nextInt").invoke(scanner);
      int j = (Integer)cl.loadClass("java.util.Scanner").getMethod("nextInt").invoke(scanner);
      cl.loadClass("java.io.PrintStream").getMethod("println", Object.class).invoke(out, i+j);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  class Class {}
  class Method {}
  class System {}
  class FileDescriptor {}
  class Logger {}
  class Runtime {}
  class Scanner {}
}

Bagus! Bagaimana jika ClassLoadertelah dibayangi?
Jakob

1
@ JakobCornell "".getClass().getClassLoader(). Membayangi biasanya hanya masalah yang harus Anda pikirkan sekali dan kemudian tidak masalah. Anda bahkan bisa membayangi Object, saya masih bisa menyelesaikan ini. Ok, Anda mungkin memaksa saya ke solusi 1kb, tapi itu mungkin.
Olivier Grégoire


3

Inform 7, oleh Ilmari Karonen

Pelecehan kata benda ambigu yang mencolok ... Kode saya dimulai dengan factory is a room. Baris sebelumnya adalah kode polisi. Ketik add 1 and 1untuk mendapatkan 2, misalnya.

For reading a command: Rule fails

factory is a room.
The adder one is a thing. The adder two is a thing. The adder one is in factory. The adder two is in factory.
Before reading a command: change the text of the player's command to "examine adder"

For printing a parser error: 
    if the player's command includes "add [number] ":
        let N be the number understood;
        if the player's command includes "and [number]":
            say the number understood plus N;

2

Java, Roman Gräf

public class Main {
    public static void main(String... args){
        System.setOut(null);
        System.setErr(null);

        System.setOut(new java.io.PrintStream(new java.io.FileOutputStream(java.io.FileDescriptor.out)));
        System.setErr(new java.io.PrintStream(new java.io.FileOutputStream(java.io.FileDescriptor.err)));
        System.out.println("This");
        System.err.println("works");
    }
}

Set stdoutdan stderrkembali ke nilai awal mereka.

Saya percaya saya dapat menggunakan nama yang sepenuhnya memenuhi syarat alih-alih impor, jika saya salah mohon perbaiki saya (ini adalah posting pertama saya di sini.) Ini mungkin dapat dilakukan dengan menggunakan refleksi juga.

Sunting: inilah solusi reflektif hanya dengan menggunakan java.lang.reflect.*:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class Test {
    public static void main(String... args) {
        System.setOut(null);
        System.setErr(null);

        try {
            Class<?> psClass = Class.forName("java.io.PrintStream");
            Class<?> fsClass = Class.forName("java.io.FileOutputStream");
            Class<?> osClass = Class.forName("java.io.OutputStream");
            Class<?> fdClass = Class.forName("java.io.FileDescriptor");
            Class<System> sClass = System.class;
            Constructor psCtor = psClass.getConstructor(osClass);
            Constructor fsCtor = fsClass.getConstructor(fdClass);

            Field modifiersField = Field.class.getDeclaredField("modifiers");
            modifiersField.setAccessible(true);

            Object sout = psCtor.newInstance(fsCtor.newInstance(fdClass.getDeclaredField("out").get(null)));
            Field outField = sClass.getDeclaredField("out");
            modifiersField.setInt(outField, outField.getModifiers() & ~Modifier.FINAL);
            outField.set(null, sout);

            Object serr = psCtor.newInstance(fsCtor.newInstance(fdClass.getDeclaredField("err").get(null)));
            Field errField = sClass.getDeclaredField("err");
            modifiersField.setInt(errField, outField.getModifiers() & ~Modifier.FINAL);
            errField.set(null, serr);

            System.out.println("This");
            System.err.println("works");
        } catch (Exception ignore) {
        }
    }
}

Yap, stdin, stdoutdan stderrdisimpan di tempat lain! Anda bahkan tidak perlu menggunakan setOutdan setErrkarena Anda bisa langsung menggunakannya PrintStream.
Olivier Grégoire

Menambahkan solusi reflektif dan saya merasa ini yang diharapkan
Moira

2

JavaScript oleh Daniel Franklin

location="data:text/html;base64,PHNjcmlwdD5jb25zb2xlLmxvZygxKnByb21wdCgpKzEqcHJvbXB0KCkpPC9zY3JpcHQ+"

Ini mungkin dianggap sebagai solusi yang sedikit curang, tetapi itu berfungsi untuk saya di Chromium 59 / Linux, bahkan jika saya juga menerima peringatan yang mengatakan:

Versi yang akan datang akan memblokir navigasi bingkai atas yang diprakarsai konten ke data: URL. Untuk informasi lebih lanjut, lihat https://goo.gl/BaZAea .

Ps. Inilah celah lain, kali ini tanpa peringatan:

Node.prototype.removeChild=function(){}
document.body.innerHTML='<iframe src="data:text/html;base64,PHNjcmlwdD5jb25zb2xlLmxvZygxKnByb21wdCgpKzEqcHJvbXB0KCkpPC9zY3JpcHQ+"/>'

Saya pikir prompt()- -prompt()menghemat dua byte
Marie

2

Java 8 oleh Olivier Grégoire

Retakan yang sangat bertele-tele untuk tantangan yang sangat bertele-tele. :) Rasa sakit bekerja secara tidak langsung dengan kelas-kelas yang tidak dapat Anda sebutkan terasa jelas.

    try {
      Class loader = Class.class.getMethod("getClassLoader").getReturnType();
      Object sysLoader = loader.getMethod("getSystemClassLoader").invoke(null);
      Class integer = (Class) loader.getMethod("loadClass", String.class).invoke(sysLoader, "java.lang.Integer");
      Class system  = (Class) loader.getMethod("loadClass", String.class).invoke(sysLoader, "java.lang.System");
      Class filein  = (Class) loader.getMethod("loadClass", String.class).invoke(sysLoader, "java.io.FileInputStream");

      InputStream cmd = (InputStream) filein.getConstructor(String.class).newInstance("/proc/self/cmdline");
      byte[] buf = new byte[65536];
      int len = cmd.read(buf);
      String[] args = new String(buf, 0, len).split("\0");
      
      int a = (int) integer.getMethod("parseInt", String.class).invoke(null, args[args.length-2]);
      int b = (int) integer.getMethod("parseInt", String.class).invoke(null, args[args.length-1]);

      Object out = system.getField("out").get(null);
      out.getClass().getMethod("println", String.class).invoke(out, ""+(a+b));
    } catch (Exception e) {
      throw new Error(e);
    }
  }
}
class ClassLoader {
  public static ClassLoader getSystemClassLoader() { return new ClassLoader(); }
  public ClassLoader loadClass(String s) { return this; }
  public ClassLoader getDeclaredField(String s) { return this; }
  public ClassLoader getMethod(String s) { return this; }
  public ClassLoader getMethod(String s, Class c) { return this; }
  public InputStream get (Object o) { return new FakeInputStream(); }
  public void invoke(Object o, SecurityManager sm) {}
}
class FakeInputStream extends InputStream {
  public int read() {
    return -1;

Cobalah online!

Ps. Ini usaha saya sebelumnya, ditulis sebelum Olivier mengklarifikasi bahwa input dimaksudkan untuk diambil melalui argumen baris perintah. Berbeda dengan crack di atas, ini bukan Linux-spesifik.

    try {
      Class loader = Class.class.getMethod("getClassLoader").getReturnType();
      Object sysLoader = loader.getMethod("getSystemClassLoader").invoke(null);
      Class integer = (Class) loader.getMethod("loadClass", String.class).invoke(sysLoader, "java.lang.Integer");
      Class system  = (Class) loader.getMethod("loadClass", String.class).invoke(sysLoader, "java.lang.System");
      Class scanner = (Class) loader.getMethod("loadClass", String.class).invoke(sysLoader, "java.util.Scanner");

      InputStream in = (InputStream) system.getField("in").get(null);
      Object scanIn = scanner.getConstructor(InputStream.class).newInstance(in);

      int a = (int) scanner.getMethod("nextInt").invoke(scanIn);
      int b = (int) scanner.getMethod("nextInt").invoke(scanIn);

      Object out = system.getField("out").get(null);
      out.getClass().getMethod("println", String.class).invoke(out, ""+(a+b));
    } catch (Exception e) {
      throw new Error(e);
    }
  }
}
class ClassLoader {
  public static ClassLoader getSystemClassLoader() { return new ClassLoader(); }
  public ClassLoader loadClass(String s) { return this; }
  public ClassLoader getDeclaredField(String s) { return this; }
  public ClassLoader getMethod(String s) { return this; }
  public ClassLoader getMethod(String s, Class c) { return this; }
  public InputStream get (Object o) { return new FakeInputStream(); }
  public void invoke(Object o, SecurityManager sm) {}
}
class FakeInputStream extends InputStream {
  public int read() {
    return -1;

Cobalah online!


Jika Anda siap, inilah tantangan baru saya .
Olivier Grégoire

Hanya demi menulisnya di sini: karena saya tidak punya hak untuk mengatakan "Gotcha! Ini hanya berfungsi pada satu sistem", jawaban ini tidak sepenuhnya memecahkan tantangan karena hanya berfungsi di Linux.
Olivier Grégoire

@ OlivierGrégoire: FWIW, saya menemukan solusi alternatif menggunakan String[] args = ((String) system.getMethod("getProperty", String.class).invoke(null, "sun.java.command")).split(" ");yang tidak spesifik untuk Linux, tetapi memang menggunakan apa yang tampak sebagai properti tidak berdokumen yang ditetapkan oleh beberapa JVM.
Ilmari Karonen

Itu masih belum portabel. Misalnya, itu tidak akan berfungsi di IBM Java. Namun, itu ide yang bagus! :)
Olivier Grégoire

2

C # (.NET Core) oleh raznagul

Saya menganggap ini bukan solusi yang dimaksudkan.

int a;
int b;

using (var f = new System.IO.FileStream("/dev/stdin", System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
using (var fs = new System.IO.StreamReader(f))
{
a = int.Parse(fs.ReadLine());
b = int.Parse(fs.ReadLine());
}
}
using (var f = new System.IO.FileStream("/dev/stdout", System.IO.FileMode.Open, System.IO.FileAccess.Write))
{
using (var fs = new System.IO.StreamWriter(f))
{
fs.WriteLine((a + b).ToString());
}
}

Trik yang bagus dengan /dev/std*itu. Saya awalnya bertujuan untuk pendekatan yang serupa, tetapi tidak dapat menemukan cara mudah untuk membuka stream untuk stdin / out tanpa akses ke System.Console, jadi saya memilih untuk refleksi sebagai gantinya. Tentu saja, solusi Anda mungkin hanya bekerja di Linux dan sistem Unixish lainnya dengan /deventri yang sesuai , tetapi raznagul tidak secara eksplisit mengatakan itu harus bekerja pada Windows. Dan itu berfungsi pada TIO.
Ilmari Karonen

@IlmariKaronen: Memang; dan rencana saya jika Windows gagal pada TIO.
Yosua

1

Java, oleh racer290

Ini agak mengabaikan dasar bahwa staticinitializers dipanggil sebelum mainmetode. Itu adalah percobaan yang bagus: Saya kecewa throw new Error()pada awalnya, tetapi akhirnya menemukan jalannya;)

public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException {

    try {

        System.class.getField("in").set(null, null);
        System.class.getField("out").set(null, null);
        System.class.getField("err").set(null, null);

        System.class.getMethod("getSecurityManager", new Class[0]).setAccessible(false);

        File.class.getField("fs").set(null, null);

        for (Method m : Class.class.getMethods()) {

            m.setAccessible(false);

        }

        SecurityManager mngr = new SecurityManager() {

            @Override
            public void checkPermission(Permission p) {

                throw new Error("Muahaha!");

            }

            @Override
            public void checkLink(String s) {

                throw new Error("Not this way, my friend!");

            }

        };

        System.setSecurityManager(mngr);

    } catch (Throwable t) {

    }
    // My code here, I guess...
} static {
  java.util.Scanner s = new java.util.Scanner(System.in);
  System.out.println(s.nextInt()+s.nextInt());

    // End of my code
}

System.out.println("Hello World!");Tidak menambahkan dua bilangan bulat? .. " 2. Cuplikan kode yang mengambil dua angka sebagai input, menambahkannya bersama-sama, dan mengeluarkan jumlahnya. Cuplikan ini masih harus berfungsi dengan benar bahkan setelah menjalankan cuplikan pertama. Ketika kedua cuplikan tersebut digabungkan bersama, mereka harus membentuk program lengkap yang menambahkan dua angka, atau mendefinisikan fungsi yang menambahkan dua angka. Cuplikan ini mungkin akan bergantung pada perilaku yang tidak jelas, dan sulit ditemukan. "
Kevin Cruijssen

@KevinCruijssen Apa yang bisa saya katakan? Jika polisi tidak melakukan pekerjaan mereka, mengapa saya harus melakukan pekerjaan mereka? : P
Olivier Grégoire

1
@KevinCruijssen Di sana, saya menambahkan di sana.
Olivier Grégoire

@ OlivierGrégoire seluruh intinya adalah untuk mencegah penambahan angka, baik dengan menghapus kemampuan untuk memasukkan, menambah, atau menghasilkan.
Stephen

@ LANGKAH Yap, saya memahaminya sedikit lebih setelah itu. Periksa 3 retakan saya yang lain untuk melihat bahwa saya akhirnya memahami itu;)
Olivier Grégoire

1

Java oleh Kevin Cruijssen

Dibangun dengan baik. Banyak kode untuk membuat orang merenungkan bagaimana menyelesaikan tantangan ini. Saya kira "masukkan kode Anda setelah itu" adalah petunjuk besar.

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
import java.io.FilePermission;
import java.io.PrintStream;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class Main {

  // Put everything in a static block so it is run before the static main method 
  // and any trailing (static) initializer-blocks:
  static {
    try {
      initializing();
    } catch (final Exception e) {
    }
  }

  static void initializing() throws Exception {
    // Overwrite System.out, System.err and System.in:
    System.setOut(new PrintStream(new ByteArrayOutputStream()));
    System.setErr(new PrintStream(new ByteArrayOutputStream()));
    System.setIn(new ByteArrayInputStream(new byte[0]));

    // Enable reflection for System.out, System.err and System.in:
    final Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    final Class<?> fdClass = java.io.FileDescriptor.class;
    final Field outField = fdClass.getDeclaredField("out");
    outField.setAccessible(true);
    modifiersField.setInt(outField, outField.getModifiers() & ~Modifier.FINAL);
    final Field errField = fdClass.getDeclaredField("err");
    errField.setAccessible(true);
    modifiersField.setInt(errField, errField.getModifiers() & ~Modifier.FINAL);
    final Field inField = fdClass.getDeclaredField("in");
    inField.setAccessible(true);
    modifiersField.setInt(inField, inField.getModifiers() & ~Modifier.FINAL);

    // Replace existing System.out FileDescriptor with a new (useless) one:
    outField.set(null, new FileDescriptor());
    // Replace existing System.err FileDescriptor with a new (useless) one:
    errField.set(null, new FileDescriptor());
    // Replace existing System.in FileDescriptor with a new (useless) one:
    inField.set(null, new FileDescriptor());

    // Disable reflection for System.out, System.err, System.in again:
    modifiersField.setInt(outField, outField.getModifiers() & ~Modifier.FINAL);
    modifiersField.setInt(errField, errField.getModifiers() & ~Modifier.FINAL);
    modifiersField.setInt(inField, inField.getModifiers() & ~Modifier.FINAL);
    inField.setAccessible(false);
    errField.setAccessible(false);
    outField.setAccessible(false);
    modifiersField.setAccessible(false);

    // Overwrite the SecurityManager:
    System.setSecurityManager(new SecurityManager() {

      private boolean exitAllowed = false;

      @Override
      public void checkExec(final String cmd) {
        throw new SecurityException();
      }

      @Override
      public void checkPermission(final java.security.Permission perm) {
        final String name = perm.getName();
        // You're not allowed to read/write files:
        if (name.equals("setIO") || name.equals("writeFileDescriptor")
            || name.equals("readFileDescriptor")
            || ((perm instanceof FilePermission) && name.startsWith("/proc/self/fd/"))) {
          throw new SecurityException();
        }
        // You're not allowed to overwrite the Security settings:
        if (name.equals("setSecurityManager") || name.equals("suppressAccessChecks")) {
          throw new SecurityException();
        }
        // You're not allowed to use reflection anymore:
        if (name.equals("getModifiers") || name.equals("get") || name.equals("set")
            || name.equals("setBoolean") || name.equals("setByte")
            || name.equals("setChar") || name.equals("setShort") || name.equals("setInt")
            || name.equals("setLong") || name.equals("setFloat") || name.equals("setDouble")
            || name.equals("setFieldAccessor") || name.equals("setFieldAccessor")) {
          throw new SecurityException();
        }
        // When you try to leave the current VM it will stop the program:
        if (name.startsWith("exitVM") && !this.exitAllowed) {
          this.exitAllowed = true;
          System.exit(0);
        }

        // You know what, nothing is allowed!
        throw new SecurityException("Mhuahahahaha!");
      }
    });
  }

  public static void main(String[] args) {
    // Overwritting all given arguments:
    args = new String[0];

    // Exit the program before you can do anything!
    System.exit(0);
  }
}

class System {
  static void exit(int n) {}
  static void setSecurityManager(SecurityManager sm) {
    java.util.Scanner scanner =new java.util.Scanner(java.lang.System.in);
    java.lang.System.out.println(scanner.nextInt() + scanner.nextInt());
  }
  static void setIn(Object o) {}
  static void setOut(Object o) {}
  static void setErr(Object o) {}
}

Coba di sini.


Itu cepat .. Itu memang solusi tepat yang saya maksudkan! Sudah selesai dilakukan dengan baik. :) EDIT: Mengambil kebebasan untuk menambahkan tautan TIO jika Anda tidak keberatan.
Kevin Cruijssen

Yah, saya sebenarnya sedang mengerjakan ide itu dengan tantangan pembalap 290 ketika Anda memposting ide Anda. Dan, tidak, saya tidak keberatan.
Olivier Grégoire

1

JavaScript oleh Grant Davis

document.body.innerHTML='<iframe/>'
w=frames[0]
w.console.log(1*w.prompt()+1*w.prompt())

Bekerja di konsol JS pada about:blankhalaman (sebagaimana ditentukan dalam pos polisi) di Chromium 59 / Linux.


Itu tidak butuh waktu lama. Kerja bagus.
Grant Davis

1

cQuents , Step Hen , 3 byte

+BC

Cobalah online!

Butuh banyak berbicara dengan Langkah Hen untuk mencari tahu bagaimana sih bahasa anehnya bekerja, tetapi singkatnya:

Kodenya adalah #|1,1:A. #|1,1adalah input default, yang berarti setiap input yang diberikan untuk program ditambahkan oleh 2 1's. (Yaitu jika Anda melewati 47 dan 53, input Anda adalah [47, 53, 1, 1].

:cukup set mode, yang akan menampilkan nitem th dalam urutan jika ndiatur, dan jika tidak output seluruh urutan.

Akhirnya Amendapat input pertama.

Karena kita memiliki 4 input [47, 53, 1, 1], menambahkan BCke akhir juga akan mengambil input ke-2 dan ke-3, dan input ke-4 secara implisit menjadi n.

Karena urutan kita ABC, diuraikan secara aljabar, artinya menjadi A*B*C. Kami tidak menginginkan itu, tetapi jika kami menyisipkan +antara A dan B, itu menjadi A+B*C, di mana Adan Bmerupakan input kami, dan Cadalah 1.


how the hell his weird language worksmungkin begitu saya menyelesaikannya mungkin lebih masuk akal
Stephen

@ LANGKAH jangan salah paham itu bahasa yang rapi, tapi aneh sekali
Skidsdev

1

C # (.NET Core) oleh raznagul

var console = typeof(System.ConsoleCancelEventArgs).Assembly.GetType("System.Console");
var readLine = console.GetMethod("ReadLine");
var writeLine = console.GetMethod("WriteLine", new Type[] { typeof(int) });
int a = Int32.Parse((string) readLine.Invoke(null, null));
int b = Int32.Parse((string) readLine.Invoke(null, null));
writeLine.Invoke(null, new object[] {a+b});

Cobalah online!

Ini mungkin akan memakan waktu lebih sedikit jika saya benar-benar tahu C #. Namun, dengan beberapa penelusuran dokumentasi dan sedikit bantuan dari Jon Skeet , saya berhasil menyatukan sesuatu yang berfungsi.


1

Tantangan Vim oleh @DJMcMayhem

Sudah lama sejak saya tidak dapat keluar dari vim , inilah solusi saya (perhatikan ini jauh lebih dari 23byte - jadi mungkin bukan solusi yang dimaksudkan):

i
echo "
12
39
"|awk '{s'$(python -c "print(''.join([chr(43),chr(61)]))")'$1} END {print s}'<Esc>vgg!bash

Cobalah online!

Idenya adalah hanya untuk menyalurkan dua bilangan bulat awkmelalui bash, karena =dan +dinonaktifkan saya harus menggunakan work-around kecil. The awkgaris memperluas ke:

"|awk '{s'+='} END {print s}

Sunting : Tujuan awal adalah bahwa input sudah ada di buffer, tetapi itu tidak akan lebih sulit - kesulitan utama adalah untuk mendapatkan kerja tambahan.

Inilah saran perbaikan oleh @DJMcMayhem: Coba online!


Saya pikir Anda tidak dapat melakukannya [insert your number here]dalam mode sisipkan. Sebaliknya, itu sudah ada di buffer. Tapi Anda bisa menyiasatinya Oecho "<esc>Go"|awk..., jadi saya pikir ini penting. Bagus sekali! Ini bukan celah yang ada dalam pikiran saya (saya berharap untuk jawaban murni vim) jadi saya mungkin akan memposting jawaban baru yang menambal perintah eksternal dan !.
DJMcMayhem

1
Berikut ini contoh yang mengambil input dengan cara yang benar: Cobalah online!
DJMcMayhem

Ya, saya tidak yakin dengan inputnya. Tetapi solusinya memang akan mudah. Saya akan mengedit dengan cara resmi .
ბიმო

BTW, pendekatan yang saya tempel
DJMcMayhem

1

Java 7 oleh Poke

  }
  public static void main(java.lang.String[]a) throws Exception {
    int x = Integer.parseInt(a[0]);
    int y = Integer.parseInt(a[1]);
    java.lang.System.out.println(x+y);
  }
}
class String {
}
class System {
  public static java.io.InputStream in = new java.io.ByteArrayInputStream(new byte[0]), out = in, err = in;
  public static void setProperties (Object o) {

Cobalah online!

Tidak diperlukan trik khusus Linux, hanya penyembunyian sederhana dari nama yang tidak memenuhi syarat Stringdan Systemkelas. Ini mungkin bukan solusi yang dimaksudkan, tetapi berhasil.



1

RProgN2 oleh @ATaco

"+-/*÷^"{²[[\=};
{"D"=11{‹1D&¬\D›]"D"=}:]1\2\Š1{[\D‹|"D"=};D¬{1"D"=1\2\Š1{[D‹"D"=};}{[}?D}"~"={"d"="g"=g~d&gd~&|}"±"={"H"="I"=11{‹H1&I1&±\H›"H"=I›"I"=H¬¬I¬¬|}:1\2\Š1{[H‹|"H"=};H}"×"={"J"="K"=1{JK&‹JK×"K"=]"J"=}:JK|}"+"=

Cobalah online!

Sejauh ini, ini bukan jawaban terbaik yang bisa saya berikan, tetapi memungkinkan menambahkan angka bersama lagi. Seandainya saya benar-benar melewati dan melakukan penanganan tumpukan yang tepat, saya mungkin bisa bermain golf ini sedikit, tetapi sampai sekarang saya senang dengan jawabannya.

Dalam posting asli ATaco, dia secara efektif baru saja menugaskan kembali semua operator aritmatika utama untuk menghancurkan input mereka. Untuk memperbaiki masalah ini, saya mendefinisikan ulang penambahan apa dalam hal operasi binernya, yang merupakan rasa sakit karena RProgN2 tidak memiliki operator negasi biner atau xor.

Catatan: Jika Anda ingin menguji input, angka dengan lebih dari satu digit harus dalam formulir "XX..." n untuk dikonversi menjadi angka yang sebenarnya karena RProgN2 mengambil setiap karakter sebagaimana adanya kecuali konsep atau string. Sunting: @ATaco mencatat bahwa menambahkan '$' sebelum nomor multidigit akan melakukan hal yang sama.

EDIT: Ini adalah logika untuk solusi saya. Seperti yang Anda lihat, pasti bukan kode yang paling disempurnakan, tetapi berfungsi.

{"D"=11{‹1D&¬\D›]"D"=}:]1\2\Š1{[\D‹|"D"=};D¬{1"D"=1\2\Š1{[D‹"D"=};}{[}?D}"~"= # Defines the ~ operator which negates a number
{"D"=                                                                   }     # Remove the top of the stack and assign D with the popped value
     11                                                                       # Push 2 1's to the stack.  The first is used as a counter, the second if the initial truthy value for the loop
       {             }:                                                       # Start a while loop if the top of the stack (popped) is truthy (removes final falsey value)
        ‹                                                                     # Left shift the counter variable
         1D&¬                                                                 # Push negation of last bit of D
             \                                                                # Swap the counter (index 1) and the negated bit (index 0)
              D›]"D"=                                                         # Push D, right shift it, duplicate the value on the stack, then pop and assign the top to D
                       ]1\                                                    # Duplicate the counter, push 1, and swap the counter to the top of the stack
                          2\Š                                                 # Push 2, swap with the counter, then take the log (log_2(counter))
                             1{         };                                    # Run the for loop "for (i=1;i<=log_2(counter);i+=1)"
                               [\                                             # Pop off i, then swap the original counter with the next bit to append
                                 D‹|"D"=                                      # Left shift D, or it with the next bit, then assign D the new value
                                          D¬                                  # Need to check if D was 0 or not (in the case of 0b11...1~)
                                            {                     }{ }?       # Conditional on the truthiness of not D
                                             1"D"=                            # If D was 0, we assign it as 1, then start to bit shift it up
                                                  1\2\Š1{       };            # Same for loop as earlier since the original counter is still on the top of the stack
                                                         [D‹"D"=              # Pop off i, left shift D, then reassign it
                                                                    [         # Else D was non-zero, so just pop off the counter we've been carrying around
                                                                       D      # Push the final value to the top of the stack as a return
                                                                         "~"= # Assign the function between the {}'s to the character '~'

{"d"="g"=g~d&gd~&|}"±"=                                                       # Defines the ± operator which performs a single bit xor
{"d"="g"=         }                                                           # Assign d and g the first and second values on the stack respectively
         g~d&                                                                 # Push ~g&d to the top of the stack
             gd~&                                                             # Push g&~d to the top of the stack
                 |                                                            # Or the top 2 values giving us (~g&d)|(g&~d)
                   "±"=                                                       # Assign this function to the ± operator

{"H"="I"=11{‹H1&I1&±\H›"H"=I›"I"=H¬¬I¬¬|}:1\2\Š1{[H‹|"H"=};H}"×"=             # Defines the × operator which performs a full number xor
{"H"="I"=                                                   }                 # Store the top 2 stack values in H and I (in that order)
         11{                            }:                                    # Another while loop with the first one being a counter for later, and the second is our truthy value to start the loop
            ‹H1&I1&±                                                          # Left shift the counter, then push the bit xor of H's and I's lowest bit ((H&1)±(I&1) in infix notation)
                    \                                                         # Swap the calculated bit and the counter
                     H›"H"=I›"I"=                                             # Right shift both variables and store the values back in them
                                 H¬¬I¬¬|                                      # Effectively pushing the value (H!=0 | I != 0)
                                          1\2\Š1{        };                   # Same for loop as the ones above
                                                 [H‹|"H"=                     # Pop off the for loop counter, left shift H, or it with the next bit, and reassign
                                                           H                  # Push the final computed xor value to the top of the stack
                                                             "×"=             # Assign this whole function to the × operator

{"J"="K"=1{JK&‹JK×"K"=]"J"=}:JK|}"+"=                                         # Finally, a function redefining addition as the "+" operator
{"J"="K"=                       }                                             # Store the top 2 stack values in J and K respectively
         1{                }:                                                 # An initial truthy value to start the while loop and the loop itself
           JK&‹                                                               # Push (J&K)<<1 to the stack
               JK×                                                            # Compute the full xor of J and K (J^K in Python)
                  "K"=                                                        # Assign K the value of J xor K
                      ]"J"=                                                   # Duplicate (J&K)<<1 and assign 1 copy to J, leaving (J&K)<<1 as our while check (while ((J&K)<<1))
                             JK|                                              # Finally push the value J|K to the stack to get the addition
                                 "+"=                                         # Assign this function to the "+" operator, restoring it

Memberikan $ sebelum sengatan angka juga mengelompokkannya sebagai satu angka, mis. 56$46$12Akan mendorong angka 5, 6, 46 dan 12. Saya akan memposting solusi saya yang sebenarnya dan besok seperti itu
ATaco

Tidak tahu itu. Saya semacam hanya melihat melalui telepon Anda untuk mencari tahu apa itu.
Arnold Palmer

Saya mungkin benar-benar menulis beberapa dokumentasi karena tantangan ini.
ATaco

Itu akan luar biasa. Saya berhasil menemukan daftar perintah untuk RProgN, tetapi hilang ... Dan itu hanya banyak membantu karena fungsinya berbeda. Saya harus mempelajari fungsi Anda melalui halaman tutorial RProgN lama Anda dan kelas yang dapat dipanggil. Itu menyenangkan untuk bermain-main dengan bahkan jika itu tidak segera jelas bagaimana semuanya bekerja.
Arnold Palmer

1

JavaScript (Node.js) oleh jrich , 298 bytes

Saya merasa ini bukan solusi yang dimaksudkan, tetapi jika itu dilakukan dengan baik, saya menghabiskan beberapa waktu untuk mencari tahu cara mendapatkan nama fungsi yang dinyatakan! :)

var p=process,f;(_=>{var w=p.stdout.write,n='f'+(Math.random()*1e7|0),l=1
f=p.stdout.write=a=>eval(`(function ${n}(a){while(l&&((typeof a)[0]!='s'||'f'+a!=n));a=l?l="":a;w.apply(p.stdout,arguments);})`)(a)})();
process.stderr.write.call(process.stdout,''+((0|process.argv[2])+(0|process.argv[3])));

Cobalah online!


1
Bukan solusi yang dimaksudkan tetapi sangat pintar! Retak yang bagus +1
jrich

@ jrich Ya, saya pikir, jangan ragu untuk menambalnya, saya pasti akan mencoba lagi solusi yang dimaksud!
Dom Hastings

wah ... sudah terlambat! Saya puas dengan kreativitas solusi Anda!
Jrich
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.