Dilinizi * çoğunlukla * kullanılamaz hale getirin (Soyguncunun ipliği)


31

Bu yorumdan ilham alan ...

Kullanıcılara, adım önce göndermeden önce bu zorluğun özelliklerini sağlamlaştırmama yardımcı oldukları için Adım Tavuk , Buğday Sihirbazı ve Dennis'i sağlayın!

Bu Robber'ın ipliği! Polislerin parçacığı için buraya gidin


Gelen bu meydan , sen yapar bazı kodlar çalışan görevli o kadar dil artık tatmin bir programlama dili olma ölçütlerimize söyledi. Bu zorlukta, bu dilin artık yapamayacağı şekilde yapmak anlamına gelir ...

  • Sayısal giriş ve çıkış al

  • Birlikte iki sayı ekle

  • Belirli bir sayının asal olup olmadığını sınayın.

Bu, iki farklı hedefe yönelik iki farklı zorluğun olduğu bir mücadelesidir: Polisler , dili çoğunlukla kullanılmaz kılan bazı kodlar yazmaya çalışacak ve soyguncular , polislere izin veren gizli geçici çözümü bulmaya çalışacaktır. dillerini kurtarmak için.

Polisler iki kod parçası yazacak:

  1. Dilini çoğunlukla kullanılamaz hale getiren, örneğin giriş / çıkış ve sayısal işlemleri yapmak için yerleşik işlevleri silerek. Bu kod edilir değil çökmesine veya çıkış izin verdi. Bu snippet'in sonuna kod eklemek mümkün olmalı ve bu kod değerlendirilecektir . Ve

  2. Giriş olarak iki sayı alan, bunları bir araya getiren ve toplamlarının çıktısını alan bir kod pasajı. Bu pasajın, birinci pasajı çalıştırdıktan sonra bile hala doğru çalışması gerekir. İki snippet birlikte kullanıldığında, iki sayı ekleyen tam bir program oluşturmaları veya iki sayı ekleyen bir işlev tanımlamaları gerekir. Bu snippet muhtemelen belirsiz davranışlara dayanacak ve bulmak zor olacak.

Polisler ayrıca herhangi bir standart giriş ve çıkış yöntemini seçecektir . Ancak, tam olarak hangi formatı (girdi ve çıktı) kullandıklarını açıklamalıdırlar. Cevaplarını kırmanız için aynı giriş / çıkış biçimini izlemelisiniz, aksi halde çatlamanız sayılmaz.

Bir polis cevap her zaman ortaya çıkarır

  • Birinci kısmı (tabii ki ikinci değil).

  • Dil (küçük sürümler de dahil olmak üzere, çoğu başvuru muhtemelen garip kenar davalarına dayanacaktır)

  • Bir fonksiyon mu yoksa tam program mı olduğu dahil olmak üzere IO formatı. Soyguncuları gerekir geçerli bir çatlak olması aynı biçimi kullanın.

  • Cevaplarının işe yaraması için gereken garip kenar durumları. Örneğin, sadece Linux üzerinde çalışır veya bir İnternet bağlantısı gerektirir .

Bir soyguncu olarak, polislerin başvurularından birine bakmalı ve onu kırmaya çalışmalısınız. Snippet 2 olarak çalışabilecek herhangi bir geçerli snippet yazarak bunu çözebilirsiniz (dil çoğunlukla kullanılamaz hale getirildikten sonra iki sayı ekleyerek). Bu , polisin ilk yazdığı pasajla aynı olmak zorunda değildir . Yanıtınız çatladığında, kodunuzu bu konuya bir cevap olarak gönderin ve yanıtınıza bir link olarak polisin cevabını yorum olarak gönderin. Daha sonra, bu yayın çatlak olduğunu göstermek için düzenlenir.

İşte bir örnek. İlk pasaj için, aşağıdaki python 3 programını polislerin cevabı olarak görebilirsiniz:

Python 3

print=None

STDIN'den girdi alır ve STDOUT'dan çıktı alır

Geçerli bir ikinci snippet olabilir

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

Bu geçerlidir, çünkü giriş olarak iki sayı alacaktır ve iki parçacığı birleştirseniz bile toplamlarının çıktısını alacaktır, örn.

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

Bu onların cevabını geçerli bir çatlak.

Bir polisin cevabı bütün bir hafta boyunca takip edilmeden kalırsa, ikinci snippet'lerinde düzenlenebilir ve yanıtlarının artık güvenli olduğunu belirtebilirler . Güvenli olacak şekilde düzenlendiğinde, artık kırmaya çalışamazsınız. Güvenli olarak düzenlemezlerse, yapılana kadar kırmaya çalışabilirsiniz.

Soyguncunun ipliğinin kazananı, en fazla yanıtı kırmış olan kullanıcıdır, tie-breaker, N çatlaklarına ulaştığı zamandır . (iki farklı kullanıcının örneğin 5 çatlağı varsa, ilk önce 5. çatlağını yazan kullanıcı kazanır.) Yeterli zaman geçtikten sonra kazananın cevabını en çok oyu ile kabul edeceğim.

İyi eğlenceler!

Kural açıklamaları

  • İlk pasaj, herhangi bir giriş yapmadan düzgün şekilde çalışmalıdır . İstediğiniz şekilde çıktı verebilir ve bu çıktı dikkate alınmaz. Snippet yapıldıktan sonra, ikinci snippet düzgün çalışır.

  • Cevabınızın geçerli olması için ikinci pasajın gerçekten yürütülmesi gerekiyor. Bu gibi bir cevap anlamına gelir

    import sys
    sys.exit()
    

    geçerli değil çünkü dili bozmuyor. Bu sadece sonlandırılıyor.

  • Güvende olduktan sonra, puanınız her iki snippet'in bayt sayısıdır .

  • Bu kadar uzanır işe Cevabınız için gerekli her türlü garip sınır durumları açığa Lütfen ... Gönderdiğiniz yeterli bilgi içermesi gerekir önce varlık tekrarlanabilir olduğu ortaya sonra gün ışığına çıkarılıyor. Bunun anlamı, cevabınız güvende olursa ve sonra da düzenlerseniz: İşte cevabım. Oh, BTW bu sadece Solaris'te çalışırsanız çalışır, size şaka yapar! Cevabınız geçersiz ve silinecek ve kazanmaya uygun kabul edilmeyecektir.

  • İkinci snippet toplamı çıkardıktan sonra çökmesine izin verilir. Çıkış hala doğru olduğu sürece (örneğin, STDERR'ye çıkış yapmayı seçerseniz ve daha sonra bir sürü kilitlenme bilgisi alırsanız, bu geçersizdir)

Liderler Sıralaması

En az bir çatlağa sahip, skor ve sonra ad ile sıralanan (alfabetik) her kullanıcının bir listesi. Bir çatlak gönderirseniz, lütfen puanınızı uygun şekilde güncelleyin.

#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

Yanıtlar:


3

Java 8, Olivier Grégoire tarafından

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

Çevrimiçi deneyin!

Olivier açıkça VM argümanları kullanılarak ayarlanan özellikler üzerinden girdilerin geçmesine izin verdiği için, girdilerin eklenecek sayıların -Dline.separator=X,Ynerede Xve Yne olduğu VM argümanında verilmesi gerektiğini belirteceğim . Yani, örneğin 17 ve 25 sayılarını eklemek için program şu şekilde çağrılmalıdır:

java -Dline.separator=17,25 Main

Bunun, Java programlarını komut satırında çalıştırabilen herhangi bir sistemde çalışması gerektiğine inanıyorum. Komut satırı olmayan sistemlerde bile, girişi VM'ye iletmek için sistem özelliklerini ayarlamak için başka herhangi bir eşdeğer mekanizma kullanılabilir.


Ps. JVM'ye özgü özelliklerin kullanılması nedeniyle geçersiz sayılan önceki çatlama girişim:

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);
  }
}

Çevrimiçi deneyin!

Bu daha az ayrıntılı bir sürü çıktı öncekine . Zor kısım, SecurityManager" java." ile başlayan bir alt alanda yaşamayan bir alt sınıf bulmaktı . Bunun hala amaçlanan çözüm olmadığını düşünüyorum, fakat işe yarıyor *

*) TIO’da en azından; sun.awt.AWTSecurityManagersınıf ve sun.java.commandmülkiyet resmen belgelendirilmesi görünmüyor ve tüm JVMs geçerli olmayabilir.


İyi iş! Bunu denedim, ancak SecurityManagerkapsamı dışında bir şey bulamadım ... System.inYine de bu noktada okuyabilirsiniz , çünkü henüz kapalı değil.
zbw

Maalesef bu iki açısından bir platform bağımlı cevap: Her iki sun.awt.SecurityManagerve "sun.awt.command"platformu bağımlıdır ve olmayan Java parçası .
Olivier Grégoire

Evet, çatladı! :) Amaçlanan çözüm, üzerinden geçmek oldu System.getProperties().get("blah")(çünkü erişimi engellediğimden beri System.getPropertydeğil System.getProperties), ama bu yeterince iyi! Aferin!
Olivier Grégoire

22

C (GCC / Linux) Sisyphus tarafından

Bu kod parçacığı sağlanan işlevi kapatır ve kendini tanımlayan yeni bir tane başlatır (klasik kod enjeksiyonu) close.

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

  exit(0);

20

Python, Buğday Sihirbazı'nın çözümü burada

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()))

Yani, özyineleme sınırını yeniden ayarlayabilirsin, ve kötü bir şey olmaz ...

TIO'da Çalışıyor

Not

Bu benim ilk CnR gönderim, bu yüzden eğer herhangi bir kuralı ihlal ederse, lütfen bana söyle ve bunu sileyim.


4
Bunu kaçırdığım için aptalım
Buğday Sihirbazı

@WheatWizard :)
HyperNeutrino

@wheatwizard Amaçlanan çözümü henüz açıklamayın. Ben ediyorum looove düzeltmeleri sizin kendi çözümü bu sorun daha iyi bir polis görmek için.
DJMcMayhem

@Djmcmayhem Muhtemelen bir del sys ile repost yapacağım.
Buğday Sihirbazı

@WheatWizard Unutmayın os.sys, bu bir fark
yaratırsa

15

Ben tarafından Haskell

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)

Hala edebi numaraları ve karakter (ı kullanmasını sağlamak 0, '0've '-') ve [a..]ve [a..b]hangi çok yararlıdır. Ve ben tekdüze var -ama onsuz yapabilirim.

Ben yeniden ++uygulamak için r( reverse) ve tanımlamak tve tski bunlar tailve tails. x a bdöner ninci elemanı b, nuzunluğu aeksi on. xgenellikle olarak tanımlanabilir snd.last.zip. İşlev dbir liste alır ve bu konumların öğelerinin on katları olan bir listesini döndürür. l!!sdöndürür ninci elemanı l, sbir ters dize temsilidir n. +Tamsayı olarak, döndürülen dizeler olarak verilen iki doğal sayının toplamını döndürür -. addtamsayı olarak döndürür, karakter dizileri olarak verilen iki negatif tamsayının toplamını döndürür.

Bunun, Ben'in aklındakilerle aynı olup olmadığını merak ediyorum.


Evet, hemen hemen aynı fikirler. Eşitlik testleri ve dallanma elde etmek için değişmezlere karşı örüntü eşleme, bir çeşit artış elde etmek için numaralandırma sözdizimini listeler. Hiçbir şey almadan ve hiçbir şey almadan :bile kapsam dahilinde olduğum için oldukça şaşırdım NoImplicitPrelude.
Ben,


7

Buğday Sihirbazı tarafından Python 2 (dördüncü yineleme)

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[]))`)

Çevrimiçi deneyin!

Hiçbir istismar yok, sadece sadece karakterleri kullanarak ekleyeceğiniz bir fonksiyon ' &)(,.:[]a`cdfijmonrt~', tasarlandığı gibi (aslında sadece '(),.:[]`acdfijmnort').

Kısa yapmak için hiçbir girişimde bulunmadım; Sadece 0 gibi ara değerler için alt ifadeler ve içindeki boş string ve string yerine geçenleri yazdım.

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

Çevrimiçi deneyin!

Temel fikir, dizge biçiminin '{0:5}'.format('1')sıfır sayısını 5benzer bir uzunlukta yastığıdır '1 '. Bu iki dizgiyi kullanarak birleştirerek ''.join, uzunluklarının toplamı giriş sayılarının toplamıdır. Daha sonra, 0sonuna kadar atak tutarız .find()ve toplam olan son pozisyonu çağırırız .

'{0:5}'Biçimlendirilecek dize , {:}karakterleri, ile oluşturulan sözlüklerin dize sayılarına ayıklayarak üretilir dict. Ardışık her summand'ın dizgisi, 5'in olduğu yere yerleştirilir. {0:5}Kendisine benzer bir dit kullanmak istedim , ancak repr onu bozan bir alan içeriyor.

0'ın girişleri, alt dizgenin minimum 1 uzunluğuna sahip olması nedeniyle süreci karıştırır and/or.


1
Bu istediğimden oldukça farklı, bir açıklama görmeyi çok isterim.
Buğday Sihirbazı

Hepiniz golf can int([]in[])basitçe int()hem irade çıktı olarak 0.
Değer Mürekkep


5

x86 16-bit gerçek modlu derleme, Joshua tarafından

    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

Debug kod dökümü ve sol üst köşedeki çıktının ekran görüntüsü

Açıklama:

Joshua'nın kodunun getirdiği "kırılma", CPU'yu tek adımlı moda sokan tuzak bayrağının (TF) ayarlanmasıdır. Bu, bir seferde sadece bir komutun işlem yapması anlamına gelir, işlemcinin tip-1 kesilmesiyle durması (tuzakları) öncesinde. Bu, hata ayıklayıcıların tek adımlı kod oluşturmalarını sağlar - orada oldukça kullanışlı, ancak kodu bir hata ayıklayıcısının bağlamı dışında çalıştırmak istiyorsanız gerçek bir PITA!

Tuzak bayrağını açan aşağıdaki kod bölümüdür:

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

Tuzak bayrağının uygulanması, CPU tuzaklarından önce tam olarak tek bir talimatı uygulama şansımız olduğu anlamına gelir; bu, POPFburadan hemen sonra gelen kuraldır. Bu yüzden bunu saymamız gerekiyor.

İşin püf noktası, INT 33 numaralı kesinti çağrısı yapan komuttur. Bunun kodun "kodunu kaldırma" için çalışmasının iki nedeni vardır:

  1. Tuzak bayrağı, kesme işleyicilerinde temizlenir. Bu, Intel'in tasarımının sadece bir parçası, ancak muhtemelen temel akıl sağlığı nedenleriyle yapıldı. Tuzak bayrağı uygulanması tip-1 kesme TF eğer öyleyse, her komutun çalışmasından sonra çağrılan olmasıdır unutmayın değildi , temizlenmiş INT 1olur kendisi bir kesme-it tetiklemek tüm yol aşağı kesmeler olurdu. Ayrıca, kesin TF'yi kesmek, kodun hata ayıklamasını kolaylaştırır, tıpkı kitaplık işlevlerine yapılan çağrıları otomatik olarak yapan bir IDE'ye benzer.

  2. Çalışmayı kesintiye uğratma şekli, esasen aynı CALL. Genel kesme vektör tablosunda adresi karşılık gelen konumda saklanan kesme işlemcisini çağırırlar. Bu tablo adreste başladığından 0x0000:0000ve 4 bayt segment:offsetformatta saklandığından , adresi hesaplamak, kesme vektörü / sayısı ile 4'ü çarpmak kadar basit. Bu durumda, kesme 3'ü çağırırız, böylece 4 × 3 = 12 olur.

    … Ve Joshua'nın bunu bizim için özenle kurduğunu farkedeceksin. Tuzak bayrağını etkinleştirmeden önce, aşağıdaki koda sahiptir:

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

    0x0000:000C(kesme işleyicisi için INT 3) için ayarlar BP:SI. Bu, ne zaman INT 3çağrıldığında, FLAGS kaydını yığının üzerine, ardından geri dönüş adresinin arkasına iter, ve sonra BP:SIda tuzak bayrağının kapatıldığı bir bağlamda kodu tekrar çalıştırmamıza izin veren dallara gelir .

Hepsi sonra yokuş aşağı INT 3. Tek yapmamız gereken birlikte iki sayı eklemek ve sonucu yazdırmak. Bu, assembly dilinde, diğer dillerde olduğu kadar basit olmadığı dışında, kodun büyük bir kısmının harcandığı yer burasıdır.

Joshua soyguncu istediği herhangi G / Ç mekanizmasını (ler) belirtmek için izin veriyor ben değerleri geçirilen olduğunu varsayarak basit bir yaklaşım alıyorum bu yüzden, DXve CXkayıtlar. Bu makul, çünkü bunlar "prolog" kodu ile hiçbir yerde engellenmiyor.

Daha sonra çıkış, ASCII baytları doğrudan video belleğine depolayarak yapılır. Video arabelleği 0xB800:0000CGA, EGA ve / veya VGA metin modunda başlar , bu yüzden orada yazdırmaya başlarız. Biçim: düşük bayttaki karakter ve yüksek bayttaki renk özelliği. Bu, her karakterin 2 baytlık bir kayma üzerinde olduğu anlamına gelir. Sayıdaki (basamak-10) sayıların her birini yineleyerek, ASCII'ye dönüştürüp, ekrana birer birer basıyoruz. Evet, bu çok fazla kod. Assembly dilinde bize yardımcı olacak hiçbir kütüphane işlevi yoktur. Bu neredeyse kesinlikle daha da iyileştirilebilir, ancak üzerinde çalışmaktan yoruldum ...

Çıktı görüntülendikten sonra, kodun çökmesine ya da ne yapmasına izin verilir, bu yüzden sadece kesinti ve CPU'yu durdururuz.


Şaşırdım; Bunun BP: SP + 1'deki dersten nasıl geçtiğini çözemiyorum.
Joshua,

@Joshua Hmm, bu iyi bir nokta. Bunun hakkında düşünmedim bile. Hata ayıklama kodundaki adım adım ilerliyor, INT 3onu izleyen komutta derhal çalışıyorum ve bitirdim. Belki test ortamımla bir ilgisi vardır? CLIsadece donanım kesintilerini devre dışı bırakacaktı, ancak geçmişte kalsa bile HLT, lhemen geçeceğini ve kodu hemen uygulayacağını düşünürdünüz .
Cody Gray,

Oh, tek adım atıyordun. Evet bu işe yarar. Çifte kontrole gidiyorum ama sanırım hatalı kod yükledim.
Joshua,

Ben de tek adım atmadan test ettim. Fark yok. Bu, en son VM Virtualbox'taki FreeDOS'ta. Kullanılabilir gerçek bir donanıma sahibim, ancak onu güçlendirmek istemedim. @Joshua
Cody Gray,

O zaman açıkça kırdın. Belki o NMI'yi yükseltmenin bir yolunu buldun.
Joshua,


4

Python 3 , ppperry 's 2 Meydan

Vay, bu eğlenceliydi! Bunu çözmekten zevk aldım.

Düzenleme: Tamam, ben düzelttim. Sınıflar TIO'daki alt sınıf listesinde bilgisayarımdan farklı bir indekse benziyordu, ben de ikisini birden çalıştırdım ve bir TIO ekledim.

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()

Çevrimiçi deneyin!


Bir hata alıyorum. sys.excepthook is missing?
Rɪᴋᴇʀ

Hmm ... benim için çalışıyor. Aldığınız asıl hata ne? (Bu oluyor çünkü ppperry'nin kodu istisnaların nasıl gösterileceğini bilmek de dahil olmak üzere hemen hemen her şeyi imha etti, işte bu sys.excepthook, ama orada bir yerde listelenen gerçek bir sebep olacak.)
zbw

Boş ver, asıl hata IndexError('list index out of range',). Tanımı ile aynı çizgide _io_RawIOBase.
Rɪᴋᴇʀ

Sorun, alt sınıfların düzeninin sabit olmamasıdır. _io_IOBase = [cls for cls in object.__subclasses__() if cls.__name__ == '_IOBase'][0]her yerde çalışmalı.
Dennis,

@Dennis Yep, bunu farkettim ve düzelttim. Şimdi TIO üzerinde çalışıyor!
zbw

4

Zbw tarafından Haskell

{-#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 )

Çalışma zamanında kod çalıştıramıyor mu? Derleme zamanında çalıştırın!

Bu çok eğlenceli oldu, bu meydan okumadan önce şablon haskell bilmiyordum.



3

Buğday Sihirbazı tarafından Python 2

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

Çevrimiçi deneyin!


Bu düşündüğümden daha zor olduğu ortaya çıkıyor.
Buğday Sihirbazı

3

LordFarquaad tarafından Java

Kaynak seviyesindeki nesnelere erişimi engellemek gerçekten akıllıydı (ve test ederken can sıkıcıydı), aferin!

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 {}
}

Güzel! Ya ClassLoadergölgelenmişse?
Jakob

1
@ JakobCornell "".getClass().getClassLoader(). Gölgeleme genellikle sadece bir kez düşünmeniz gereken bir problemdir ve sonra sorun değil. Gölge bile olabilir Object, hala bunu çözebilirim. Tamam, beni 1 kb çözümüne zorlayabilirsin, ama mümkün.
Olivier Grégoire


3

Bilgilendirme 7, Ilmari Karonen

Belirsiz isimlerin açık bir şekilde kötüye kullanılması ... Kodum ile başlar factory is a room. Önceki satır polisin kodu. Tip add 1 and 1örneğin, 2 alır.

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");
    }
}

İlk değerlerine geri döner stdoutve ayarlar stderr.

İçe aktarma yerine tam adı kullanabileceğime inanıyorum, yanılıyorsam lütfen beni düzeltin (buradaki ilk gönderim) Bu muhtemelen yansıma kullanarak da yapılabilir.

Düzenleme: İşte sadece kullanarak yansıtıcı bir çözüm 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) {
        }
    }
}

Evet, stdin, stdoutve stderrbaşka yerlerde saklanır! Hatta kullanımına gerek yoktur setOutve setErrsadece kullanabilirsiniz olarak PrintStreamdoğrudan.
Olivier Grégoire

Bu başlangıçta beklenen buydu hissetmek yanı sıra yansıtıcı bir çözüm eklendi
Moira

2

JavaScript tarafından Daniel Franklin

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

Bu biraz aldatıcı bir çözüm olarak görülebilir, ancak şunu da söylesem bile, Chromium 59 / Linux'ta benim için çalışıyor:

Gelecek sürümler, içeriğe göre başlatılan üst çerçeve gezintilerini verilere: URL'lere engeller. Daha fazla bilgi için, bkz. Https://goo.gl/BaZAea .

Ps. İşte bu sefer uyarmadan başka bir çatlak daha var:

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

prompt()- -prompt()İki bayt kurtardığını düşünüyorum
Marie

2

Java 8, Olivier Grégoire tarafından

Oldukça ayrıntılı bir mücadele için oldukça ayrıntılı bir çatlak. :) Adlandırma yapılamayan sınıflarla dolaylı olarak çalışmanın acısı aşikardır.

    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;

Çevrimiçi deneyin!

Ps. İşte Olivier benim girişimin komut satırı argümanları üzerinden alınmak zorunda olduğunu açıklığa kavuşturmadan önceki yazılı girişim. Yukarıdaki çatlaktan farklı olarak, bu Linux'a özgü değildir.

    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;

Çevrimiçi deneyin!


Eğer buna hazırsanız, işte yeni mücadelem .
Olivier Grégoire

Sadece buraya yazmak uğruna: “Gotcha! Sadece bir sistemde çalışıyor” deme hakkım olmadığından, bu cevap sadece Linux'ta çalıştığı için mücadeleyi tamamen çözemez.
Olivier Grégoire

@ OlivierGrégoire: FWIW, String[] args = ((String) system.getMethod("getProperty", String.class).invoke(null, "sun.java.command")).split(" ");Linux'a özgü olmayan alternatif bir çözüm buldum , ancak bazı JVM'ler tarafından belirlenen belgelenmemiş bir özellik olarak görünen şeyi kullandım.
Ilmari Karonen

Hala taşınabilir değil. Örneğin, IBM Java ile çalışmaz. Ancak, güzel bir fikir! :)
Olivier Grégoire

2

Raznagul tarafından C # (.NET Core)

Bunun amaçlanan çözüm olmadığını varsayıyorum.

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());
}
}

/dev/std*Orada güzel numara . Başlangıçta benzer bir yaklaşımı hedefledim, ancak System.Console'a erişmeden stdin / out akışlarını açmanın kolay bir yolunu bulamadım, bu yüzden bunun yerine yansıma tercih ettim. Elbette, çözümünüz muhtemelen yalnızca uygun /devgirdilerle Linux ve diğer Unixish sistemlerinde çalışır , ancak raznagul açıkça Windows üzerinde çalışması gerektiğini söylemedi . Ve TIO üzerinde çalışıyor.
Ilmari Karonen

@IlmariKaronen: Gerçekten de; ve eğer Windows olsaydı benim planım TIO'da başarısız olurdu.
Joshua,

1

Java, racer290 tarafından

Bu, staticbaşlatıcıların mainyöntemden önce çağrıldığı temel bir bakış açısıydı . Güzel bir deneyimdi: throw new Error()ilk başta tarafından dehşete kapıldım , ama sonunda yolu buldum;)

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!");İki tamsayı eklemez mi? .. " 2. İki sayıyı giriş olarak alan, bir araya getiren ve toplamlarını veren bir kod pasajı. Bu pasaj, ilk pasajı çalıştırdıktan sonra bile yine de doğru şekilde çalışmalıdır. Birlikte bir araya geldiklerinde, iki sayı ekleyen tam bir program oluşturmaları ya da iki sayı ekleyen bir işlev tanımlamaları gerekir. Bu pasaj, muhtemelen belirsiz davranışlara dayanacak ve bulmak zor olacak.
Kevin Cruijssen

@KevinCruijssen Ne diyebilirim? Polisler işlerini yapmıyorsa neden onların işini yapmalıyım? : P
Olivier Grégoire

1
@KevinCruijssen Oraya bir ekledim.
Olivier Grégoire

@ OlivierGrégoire'nin amacı, giriş, ekleme veya çıkma olanağını kaldırarak sayı eklemeyi önlemektir.
Stephen

@StepHen Evet, daha sonra biraz daha anladım. Sonunda anladığımı görmek için diğer 3 çatlağı da kontrol et;)
Olivier Grégoire

1

Java ile Kevin Cruijssen

İyi inşa. Herhangi birisinin bu zorluğun nasıl çözüleceğini düzgün şekilde düşünmesini sağlamak için bir çok kod Sanırım "sonradan kodunu koy" çok büyük bir ipucuydu.

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) {}
}

Burada dene.


Bu hızlıydı ... Gerçekten de tam olarak benim amacım olan çözümdü! Aferin. :) EDIT: Sakıncası yoksa TIO bağlantısını ekleme özgürlüğünü aldı.
Kevin Cruijssen,

Aslında, bu fikre, sizinkini gönderirken, yarışçı 290'ın mücadelesiyle çalışıyordum. Ve hayır, umrumda değil.
Olivier Grégoire


1

cQuents , Adım Tavuk , 3 bayt

+BC

Çevrimiçi deneyin!

Garip dilin nasıl çalıştığını anlamak için Hen Hen'le çok fazla konuştum.

Onun kodu öyleydi #|1,1:A. #|1,1Varsayılan giriş, yani programa verilen herhangi bir girişe 2 1 eklenir. (IE, 47 ve 53'ü geçerseniz girişiniz olur [47, 53, 1, 1].

:basitçe neğer nayarlanmışsa dizideki öğeyi çıkaran kipi ayarlar, aksi halde tüm diziyi çıkar

Sonunda Ailk girişi alır.

4 girişimiz olduğundan, sonuna [47, 53, 1, 1]ekleme BC, 2. ve 3. girişleri de alır ve 4. giriş ise tam olarak olur n.

Çünkü bizim ABCdizimiz, cebirsel olarak ayrıştırıldı, yani hale geldi A*B*C. Bunu istemiyoruz, ancak +A ile B arasına bir satır eklersek, girdilerimiz A+B*Cnerede Ave olur Bve C1 olur.


how the hell his weird language worksbelki bir kez bitirdiğimde biraz daha mantıklı gelebilir
Stephen

@StepHen beni yanlış anlamıyor, temiz bir dil, ama cehennem kadar garip
Skidsdev

1

Raznagul tarafından C # (.NET Core)

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});

Çevrimiçi deneyin!

Gerçekten herhangi bir C # biliyor olsaydım bu muhtemelen daha az zaman alacaktı. Bununla birlikte, bazı dokümantasyonlara göz attığım ve Jon Skeet’ten biraz yardım alarak , çalışan bir şeyi bir araya getirmeyi başardım.


1

@DJMcMayhem tarafından Vim mücadelesi

Vim'den çıkamadığımdan beri bir süre oldu , işte çözümüm (bunun 23bayttan çok daha fazla olduğuna dikkat edin - bu nedenle muhtemelen amaçlanan çözüm değildir):

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

Çevrimiçi deneyin!

Fikir basit boruya iki tamsayı olduğu awkaracılığı bashberi =ve +engelli küçük bir iş çevresinde kullanmak zorunda idi. awkÇizgi genişler:

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

Düzenleme : Asıl amaç, girişin zaten arabellekte olmasıydı, ancak bu daha zor olmazdı - asıl zorluk, ek çalışmayı sağlamaktı.

İşte @DJMcMayhem tarafından önerilen düzeltme: Çevrimiçi deneyin!


[insert your number here]Ekleme modunda yapabileceğini sanmıyorum . Bunun yerine, zaten arabellekte zaten var. Ama bununla başa çıkabildin Oecho "<esc>Go"|awk..., sanırım bu önemli. Güzel bitti! Bu aklımdaki çatlak değil (saf vim cevabı umuyordum) bu yüzden muhtemelen harici komutları yayan ve yeni bir cevap göndereceğim !.
DJMcMayhem

1
İşte girişi doğru şekilde alan bir örnek: Çevrimiçi deneyin!
DJMcMayhem

Evet, girdiden emin değildim. Ancak geçici çözüm gerçekten kolay olurdu. Resmi şekilde düzenleyeceğim .
1917

BTW, yamalı yaklaşımım burada: codegolf.stackexchange.com/a/133441/31716
DJMcMayhem

1

Java 7 Poke tarafından

  }
  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) {

Çevrimiçi deneyin!

Linux'a özgü numaralara gerek yok, sadece kalifiye olmayan Stringve Systemsınıf isimlerinin basit maskelenmesi . Bu muhtemelen amaçlanan çözüm değil, işe yarıyor.



1

RProgN2, @ATaco tarafından

"+-/*÷^"{²[[\=};
{"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|}"+"=

Çevrimiçi deneyin!

Bu şu ana kadar verebileceğim en iyi cevap değil, ancak tekrar birlikte rakamlar eklemenize izin veriyor. Gerçekten geçtiysem ve istiflememi düzgün bir şekilde halletseydim, muhtemelen biraz golf oynayabilirdim, ama şu anda cevaptan memnunum.

ATaco'nun orijinal görevinde, bütün ana aritmetik operatörlerini girdilerini yok etmeleri için yeni atadı. Bu sorunu çözmek için, ikili işlemler açısından hangi eklemenin olduğunu yeniden tanımladım, bu bir acıydı çünkü RProgN2'nin ikili bir olumsuzlama işleci ya da xor'u yoktu.

Not: Girdiyi test etmek istiyorsanız, birden fazla rakamı olan sayılar "XX..." ngerçek sayıya dönüştürülecek formda olmalıdır, çünkü RProgN2 her karakteri bir kavram veya karakter dizisi olmadığı gibi alır. Düzenleme: @ATaco, multidigit bir numaradan önce '$' eklenmesinin aynı şeyi yapacağını belirtti.

EDIT: İşte benim çözüm mantığı. Gördüğünüz gibi, kesinlikle en rafine kod değil ama işe yarıyor.

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

Örneğin, bir numara olarak da sayılar gruplar bunu bir acı önce $ sağlanması 56$46$125, 6, 46 ve 12. sayıları itecektir benim gerçek çözüm ve artık yarın göndeririz
Ataco

Bunu bilmiyordum. Bazı şeylerin ne olduğunu bulmak için callables'larına baktım.
Arnold Palmer

Bu zorluk nedeniyle aslında bazı belgeler yazabilirim.
ATaco,

Bu harika olurdu. RProgN için bir komut listesi bulmayı başardım, ama kaybettim ... Ve sadece fonksiyonların hepsi farklı olduğu için çok yardımcı oldu. İşlevlerinizi eski RProgN eğitim sayfanız ve çağrılabilir sınıflarınız aracılığıyla öğrenmek zorunda kaldım. Her şeyin nasıl çalıştığını hemen belli olmasa bile etrafta oynamak eğlenceliydi.
Arnold Palmer

1

JavaScript (Node.js) , jrich , 298 bayt tarafından

Bunun amaçlanan çözüm olmadığını hissediyorum, ancak iyi iş çıkarsa, bildirilen işlevin adını nasıl öğreneceğimi bulmaya çalışırken biraz zaman harcadım! :)

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])));

Çevrimiçi deneyin!


1
Amaçlanan çözüm değil, çok akıllıca! Nice crack +1
jrich

@jrich Evet, düşündüm de, yama yapmaktan çekinmeyin, amaçlanan çözüme bir kez daha gideceğimden emin olacağım!
Dom Hastings

boğmaca ... çok geç! Yine de çözümünüzün yaratıcılığından memnun kaldım!
Jrich,
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.