Kaynağı iki katına çıkardım, çıktısını iki katına çıkar!


127

Göreviniz kabul etmek istiyorsanız, pozitif bir tamsayı çıkaran bir program yazmaktır (0'dan yüksek). İşin zor yanı, kaynak kodunuzu kopyalarsam, çıktının orijinal tamsayının iki katı olması gerektiğidir.

kurallar

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

  • İlk kaynak en az 1 bayt uzunluğunda olmalıdır.

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

  • Programınız giriş yapmamalı (veya kullanılmamış, boş bir giriş yapmalıdır ).

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

  • Kaynağınızın kopyaları arasında yeni bir satır alamazsınız.

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

  • Varsayılan Loopholes uygulanır.

Örnek

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

Liderler Sıralaması

Bu, @ manatwork'ın düzenini kullanır .


2
@ Mr.Xcoder O zaman sadece bir tane kendi kaynağıma dahil etmek zorunda kalacağım.
steenbergh

3
@ Mr.Xcoder Kendi kaynak kodunuzu okumayı engellemeniz gerektiğini düşünüyorum.
caird coinheringaahing

1
Sadece bir kez iki katına çıktığında çalışması gerekir ? Pek çok şüpheye n destek vermemize gerek yok mu?
Cody Gray,

6
@Daniel Diyelim ki kaynağınız `` (boş program) ve üretiyor 5. Eğer ikiye katlarsanız, kaynağınız `` (boş program) 'dır ve 5ne yaparsanız yapın, o da üretir . Bununla birlikte, kopyalanan boş bir program hala boş programdır ve boş programın yine de geçerli olamayacak başka bir şey (örneğin, rasgele bir sayı üreteci) anlamına gelmesi haricinde, her zaman aynı çıktıyı üretir.
Bay Xcoder

1
Bu, program sonlandırıldığında yığının tepesini otomatik olarak boşaltan eşyalar için zor olmamalıdır.
MD XF

Yanıtlar:


152

Python 2,33 bayt

print len(open(__file__).read())#

Çevrimiçi deneyin!

İki kat dene

Python 3 , 28 bayt

print(len(*open(__file__)))#

Çevrimiçi deneyin!

İki kat dene

açıklama

Bu, başlangıç kaynak kodu açılır open(__file__)kullanarak uzunluğunu alır okunmaya karşı önleyen herhangi bir ek kod. Kaynak iki katına çıktığında uzunluk da aynıdır.len#


28
Vay canına, hayrete düşmüştüm ... Bu çok zekice!
Bay Xcoder,

2
32 bayt . Geçerli konumu dosyanın sonuna ayarlayarak ekleme modunu kullanarak çalışır. tell()dosyadaki geçerli konumu döndürür
Halvard Hummel

@HalvardHummel Güzel. Ancak bu cevabı güncelleme niyetim yok. Kendi başınıza göndermek istiyorsanız, bence büyük ölçüde farklı.
Sriotchilism O'Zaic,

@WheatWizard Bu anlaşılabilir bir şey, ayrı bir cevap
Halvard Hummel

96

Jöle , 1 bayt

Çevrimiçi deneyin!

veya iki kez deneyin!

Bunun nasıl çalıştığını bilmiyorum, ama görünüşe göre çalışıyor.


55
Ne yazdığın hakkında hiçbir fikrin yokken ...
Bay Xcoder

2
Kahretsin, bu 8 dakikayı çok geç düşündüm.
HyperNeutrino

17
Tüm linklerin tartışması gerekir. Zincirin ilk elemanı bir nilad ise, sonuç argüman olur ve link monadik olarak yürütülür. Baştaki nilad yoksa, bunun yerine 0 kullanılır.
Dennis,

65

Google Sayfaları, 11 5 Bayt

Girdi almayan ve formülü tutan hücreye çıkış yapan anonim çalışma sayfası formülü

=4/(2

Tek bir formül olarak bu, biraz benzeyen bir çağrı yığınını değerlendirir

=4/(2
=4/(2)
=4/2
=2
2

Ancak, bu çalışma sayfası formülü iki katına çıktığında, bu çağrı yığını

=4/(2=4/(2
=4/(2=4/(2)
=4/(2=4/(2))
=4/(2=2)
=4/(True)
=4/True
=4/1
=4
4

Kuşkusuz, bu yöntemi kullanmanın bir anlamı, bu sorunun bir defadan fazla tekrarlanması, sorunun üçüncü ve tüm tekrarlamalarında, çağrı yığınının ulaşması =4/(2=4)ve böylece =4/0bir #DIV/0!hatayı değerlendirmesi ve atmasıdır.

-6 bayt =DIVIDE(4,2formülünden uzağa cebire geçiş yaparak


18
Google Sheets’ın kod golf alanında kullanılmasını beklemiyordum. Zeki çözüm
hucancode

11
@hucancode bununla ilgili gerçekten ilginç olan şey, izleyenleri dışlarsanız Excel'in bir hata atmasıdır, çünkü )bu cevabı Excel'in cevabına çevirmeyen, gördüğüm tek Google Sayfasının cevabıdır
Taylor Scott

45

05AB1E , 2 bayt

orijinal

XO

Çevrimiçi deneyin!

Doubled

XOXO

Çevrimiçi deneyin!

açıklama

X 1'i yığına iter .
O yığını toplar.


48
XOXO, güzel bir çözüm.
Bay Xcoder,

4
Bunu bilerek yaptın, ayrıca kullanabileceğini de biliyordun 1O!
Outgolfer Erik,

12
Bu saçma dilleri nerede buluyorsunuz?
DavidB,

7
@DavidB Genellikle bunları yazarlar.
Federico Poloni

3
@DavidB Evet, insanlar codegolf dillerini icat yoktur ve evet, onlar son derece düşük puanlar alabilirsiniz, ama izin verilmeyen 1 byte içinde bunu çözmek için mücadeleden sonra bir dil icat gibi aptalca şeyler yapıyor ve bu dillerde programlama genellikle uzak mesafede kolay.
Esolanging Fruit

43

C (gcc), 37 bayt

i;main(){putchar(i+49);}/*
i=1;//*///

Dosya sonunda yeni bir satır içermiyor.

Çift sürüm, sözdizimi vurgulaması için:

i;main(){putchar(i+49);}/*
i=1;//*///i;main(){putchar(i+49);}/*
i=1;//*///

TIO bağlantıları: tek , çift .


3
Bunun nasıl çalıştığını açıklayabilir misiniz? yorum neden hiç yorumlanmamış?
phil294,

10
Kaynak kodu iki katına çıkardığınızda /*, yorum tarafından yorumlanır //, yani aşağıdaki yorumlanmaz i=1. Bu, kodun iki katına çıkmış versiyonunu bir sözdizimi vurgulayıcısına koyup koymadığınızı görmek daha kolaydır
musicman523

1
Whoa, geçici bir tanım numarası. Güzel.
aschepler

39

Altıgen , 7 bayt

/)!@.).

Düzenli olarak 1 yazdırır, ardından 2 ikiye katlanır.

Çevrimiçi deneyin! veya Çevrimiçi olarak iki katına çıkmayı deneyin!

Genişletilmiş sürümler:

Düzenli:

 / )
! @ .
 ) .

Doubled:

  / ) !
 @ . ) .
/ ) ! @ .
 ) . . .
  . . .

Düzenli program yolu takip eder: /)!.@bu bir hafıza kenarını arttırır (tümü sıfır olarak başlatılır) ve sonra sayısal değerini yazdırır. İki katına /.)/)!@çıkmış program şu şekildedir: Bu, yazdırmadan önce kenarı iki kez artıran şeydir.


6
Vay güzel iş. Sanırım bunu elle buldunuz? 6 bayt kaba kuvvet aralığında olduğundan, onu bir yere vereceğimi düşündüm ve aslında 4 baytlık bir çözüm var: [@!)(ve bazı 570 5 baytlık çözümler). Aslında elle bir çözüm bulma zorluğuna girdiğiniz için, 4 baytlık çözümü gönderdiğiniz için çok mutluyum.
Martin Ender,

1
Eğer ilgileniyorsanız, burada basılan numarayı içeren tam liste: pastebin.com/TtRujjA4
Martin Ender


36

Braingolf , 1 bayt

+

Çevrimiçi deneyin!

Şimdi konuşuyoruz!

Çıktılar 20veya 40kaynak iki katına çıktığında.

açıklama

+ Elbette, "toplam", "add" veya "plus" operatörüdür, Braingolf'ta, ancak ikili, monadik ve niladik fonksiyonlara sahiptir.

Yığın üzerinde en az 2 öğe olduğunda, ikilidir ve yığının ilk 2 öğesini toplar.

Yığında yalnızca 1 öğe olduğunda, monadiktir ve öğeyi ikiye katlar.

Yığında hiçbir öğe olmadığında, niladik ve 20 iter!

Neden 20'ye basıyor? Boş Braingolf programı basitçe bir yeni satır yazdırır ve bir yeni satır ASCII değeri 10 Eh, çünkü, bu yüzden ben farketmiş giriş parametresiz +itme 20 aslında en olmasa da örtülü satır (üzerinde monadic davranıyor gibi pek öyle herşey)

Bu nedenle:

+   No input
+   Niladic sum, Push 20
    Implicit output

Ve iki katına çıktığında:

++  No input
+   Niladic sum, Push 20
 +  Monadic sum, Double top of stack
    Implicit output

28

Haskell , 26 18 bayt

main=print$0
 +1--

Çevrimiçi deneyin!

Doubled:

main=print$0
 +1--main=print$0
 +1--

Çevrimiçi deneyin!

Bu sürümü , mücadelenin üçlü versiyonuna cevap verirken buldum .


Yorum kötüye kullanımı olmadan 26 bayt sürümü:

main|n<-1,nmain<-2=print n

Çevrimiçi deneyin! Yazdırır 1.

Deseninde tanımlayıcı korumak niçin ayarlanır 1ve nmainiçin 2, sonra da print nbaskılar 1.

Çift program:

main|n<-1,nmain<-2=print nmain|n<-1,nmain<-2=print n

Çevrimiçi deneyin! Yazdırır 2.

İlk model bekçi olarak yeniden nayarlandığında 1ve nmainhiç 2ancak baskı deyimi haline gelmiştir print nmainyüzden 2basılır. Bir örüntü muhafazasındaki tanımlayıcı bildirimler doğru olarak değerlendirildiğinden, ikinci örüntü korumasına asla ulaşılamaz.


23

Mathematica, 5 bayt

(1+1)

2 çıkışı ve (1 + 1) (1 + 1) 4 çıkışı

ve tabii ki (çoğunuz istedi)

Mathematica, 3 bayt

(2)

1
Çalışıyor (2)mu
geokavel

9
@geokavel 2ve bir alan işe yarayacaktı, +1ama bunların hepsinin Mathematica'nın not defteri ortamını varsaydığı belirtilmelidir
Martin Ender

1
Eğer opencloud Mathematica Sandbox içinde çalıştırmak varsa, tek bir boşluk olur x, öyle ki 2 çıkışlar 2ve 2 2 olur 2x2 baskılar 4. alternatif bir çözüm olarak ekleyebilirsiniz söyledi.
Bay Xcoder

2
(2)de çalışır.
Bay Xcoder

6
2 de çalışır.
alephalpha

17

Beyin Flak , 6 bayt

({}())

Çevrimiçi deneyin!

açıklama

Bunun ne olduğu oldukça açık olmalı. {}başlangıçtan tamamen sıfır olan yığından bir değer alır ve buna bir değer ()ekler (...). İkinci çalıştırmada, yığında 1 zaten olduğundan, bu sadece iki tane yapmak için 1 ekler. Aslında kod nzamanlarını kopyalarsanız her zaman çıktılar n.


17

> <> , 7 6 bayt

Teal pelikan sayesinde -1 bayt

\ln;
0

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

açıklama

Bir kullandım 0ama aynı zamanda kullanabilirdim 1- 9, a- fçünkü hepsi yığına tek bir değer atarlar.

İki katına değil:

\ redirects execution down
0 pushes zero onto stack; STACK: [0]
  (IP wraps around the bottom)
\ redirects execution right
l pushes stack length (1) onto stack; STACK: [0, 1]
n pops off the top value (1) and prints it; STACK: [0]
; end of execution

Doubled:

\ redirects execution down
0 pushes zero onto stack; STACK: [0]
0 pushes zero onto stack; STACK: [0, 0]
  (IP wraps around the bottom)
\ redirects execution right
l pushes stack length (2) onto stack; STACK: [0, 0, 2]
n pops off the top value (2) and prints it; STACK: [0, 0]
; end of execution

5
PPCG'ye Hoşgeldiniz! Bu çok iyi düşünülmüş bir açıklama ve iyi bir kod ile harika bir ilk cevaptır. Oyumu kazandın!
Bay Xcoder

1
Ben sadece bu cevabı gördüm ve bu harika! Çifte çok iyi gelişme> <> cevaplar (benimki dahil!) - Buradaki TIO bağlantısına bir göz atın; tio.run/##S8sszvj/PyYnz5rLAEL@/w8A - Yaptığım tek şey 0'ı boşluğa taşımak ve 1 bayt kazandırıyor. :)
Teal pelikan

1
@Tealpelican Teşekkürler! Bu kadar basit bir gelişmeyi kaçırdığıma inanamıyorum. (Aslında yapabilirim, çok fazla kullanmıyorum>>> ve golf oynamak için yeniyim!) Dürüst olmak gerekirse, diğer çözümlere ayrıntılı olarak bakmadım, göreceli olarak büyük olduklarını ve karar verdiklerini gördüm. Sorunla golf oynamayı deneyin çünkü rekabet etmek daha kolay olurdu.
Borka223

1
Güzel cevap! Sadece bunun Klein cevabımla aynı yöntemi kullandığını belirtmek istedim . (Beni kopyalamakla suçlamadım Eğer biri sadece iki benzer cevabı işaret ediyorsa,).
Sriotchilism O'Zaic

14

Retina , 3 bayt


1

Çevrimiçi deneyin!

Yazdırır 2. Katlamak yazdırır 4.

1Başka oldukça çok şey değiştirilebilir.

açıklama


1

Boş girişi ile değiştirir 1.


1İki olan boş eşleşmelerin sayısını sayar ( 1ondan önce ve sonra bir tane).

Programı ikiye katlarsak, birincisi gibi ek bir aşama alırız. Bu sefer ilk öncekinden 1önce ve sonra ekler 111. Şimdi boş regex'in kibrit sayısını saydığımızda dördü alıyoruz.



12

Neim , 1 bayt

>

Basitçe yığının tepesini arttırır.

Yığın, başlamak için sonsuz miktarda sıfır olarak düşünülebilir, bu yüzden bir tane almak için sıfırı yükseltir ve iki kez almak için tekrar ikiye katlar.

Çevrimiçi deneyin!

Alternatif bir çözüm:

1 yerine 2 ekler.



12

Java8, 135 118 110 bayt

Tek , 8 yazdırır

interface T{static void main(String[]a){System.out.print(Byte.SIZE);}}/*
class Byte{static int SIZE=16;}/**///

İki katına , 16 yazdırır

interface T{static void main(String[]a){System.out.print(Byte.SIZE);}}/*
class Byte{static int SIZE=16;}/**///interface T{static void main(String[]a){System.out.print(Byte.SIZE);}}/*
class Byte{static int SIZE=16;}/**///

Önizleme yanıtı, 118 bayt

Tek , yazdırır 1

interface T{static void main(String[]a){System.out.print(T.class.getResource("B.class")==null?1:2);}}/*
enum B{}/**///

Doubled , 2 yazdırır

interface T{static void main(String[]a){System.out.print(T.class.getResource("B.class")==null?1:2);}}/*
enum B{}/**///interface T{static void main(String[]a){System.out.print(T.class.getResource("B.class")==null?1:2);}}/*
enum B{}/**///

Bu nasıl çalışır

Java-compiler kaynak dosyadaki her sınıf için tek bir dosya oluşturur. Bu nedenle, B.class adında bir kaynağın var olup olmadığını kontrol edebilirim.


Orjinal Cevap, 135 bayt

Tek , yazdırır 1

interface T{static void main(String[]a){int i=1;try{Class.forName("B");i=2;}catch(Exception e){}System.out.print(i);}}/*
enum B{}/**///

Doubled , 2 yazdırır

interface T{static void main(String[]a){int i=1;try{Class.forName("B");i=2;}catch(Exception e){}System.out.print(i);}}/*
enum B{}/**///interface T{static void main(String[]a){int i=1;try{Class.forName("B");i=2;}catch(Exception e){}System.out.print(i);}}/*
enum B{}/**///

Yorum ile yaptığın şey gerçekten harika. Fakat yeni hatta gerçekten ihtiyacınız var mı?
vikarjramun

Oh nvm, ikinci satırdaki tek satırlı yorumu fark etmedi
vikarjramun

11

Python 2,32 bayt

print open(__file__,"a").tell()#

Çevrimiçi deneyin!

Çift kaynak kodu

açıklama

Bu kaynak kod dosyasını ekleme modunda açar.

open(__file__,"a")

Daha sonra dosyadaki mevcut pozisyonu buluruz, bu dosya ekleme sonunda açılma nedeniyle olacaktır.

open(__file__,"a").tell()

Bu uzunluğu yazdırıyoruz

print open(__file__,"a").tell()

Ve bir yorum ekleyin, böylece kaynak kodu iki katına çıkarmak daha fazla kod çalıştırmaz.

print open(__file__,"a").tell()#

9

Excel VBA, 12 Bayt

Adından giriş alan ve aralıktan çıkan anonim VBE anlık pencere işlevi [A1]. Aralığın varsayılan değer [A1]olan ""(boş dize) ve bir yürütme sonrasında üzere setleri bu takip 1ile ve artışlarla 1sonraki tüm infaz.

[A1]=[A1+1]:

Giriş çıkış

Tek sürüm

[A1]=[A1+1]:
?[A1]    ''# display the value of [A1] to the VBE immediate window
 1

İkili Sürüm

[A1]=[A1+1]:[A1]=[A1+1]:
?[A1]    ''# display the value of [A1] to the VBE immediate window
 2


8

Kabuğu , 3 bayt

|1"

Çevrimiçi deneyin!

Diğer cevaplarda gördüklerim için özgün bir fikir.

açıklama

|Husk'ta, "ardışık" olursa ikinci argümanını, aksi halde ilk argümanı döndüren bir "veya" operatörüdür. Farklı türlerin argümanlarına uygulandığında, öncelikle hepsini sayılara dönüştürür: dizelerin dönüşümü (ve genel olarak listeler) uzunlukları hesaplanarak yapılır.

Orijinal programda |1'e ve 0'a dönüştürülen boş bir dizeye uygulanıruz : sonuç 1'dir.

İkili programda |1 ve 2'ye dönüştürülen "| 1" dizgesine başvuruyoruz : sonuç 2.



7

CJam, 3 bayt

5],

Çevrimiçi Deneyin

5 dizisine alın. Dizinin dönüş uzunluğu. Kodu kopyaladığınızda, daha önce döndürülen uzunluk olan 1, zaten yığındadır, bu nedenle uzunluk 2'yi döndüren [1,5] dizisini alırsınız.



7

Wumpus , 4 bayt

" O@

Çevrimiçi deneyin!

" O@" O@

Çevrimiçi deneyin!

Normal kod yazdırılır 32ve iki kat yazdırılır 64.

açıklama

"diğer birçok Fungeoids'de olduğu gibi çalışır: her bir karakter kodunun komutu çalıştırmak yerine yığına basıldığı string modunu değiştirir. Bununla birlikte, diğer birçok Mantarın tersine, Wumpus'un oyun alanı etrafı sarılmaz, bu nedenle IP bunun yerine yansır ve kod boyunca ileri geri sıçrar.

Bu nedenle, tek bir program için aşağıdaki kod aslında çalıştırılır:

" O@O " O@

Dize iter 32, 79, 64, 79, 32. Sonra alan hiçbir şey yapmaz, Oyazdırır 32ve @programı sonlandırır.

İkili program için, dize IP geri dönmeden önce sonlandırılır, bu nedenle kod yalnızca bir kez geçer:

" O@" O@

Bu kez, dize iter 32, 79, 64, Oyazdırır 64ve @programı sonlandırır.

Bu sadece 4 baytlık bir çözüm gibi görünüyor.


6

,,,, 2 bayt

1∑

açıklama

1∑

1   push 1
 ∑  pop everything and push the sum of the stack

Bir şey mi kaçırıyorum yoksa ikiye katlanmış bir kaynak kod için 3 olamaz mı?
Taylor Scott

@TaylorScott Üzgünüm, yığındaki tüm öğeleri çıkardığına dikkat etmeliydim .
totallyhuman

1
Bu çok daha mantıklı - açıklama için teşekkürler
Taylor Scott

Sigma iki bayttır, değil mi?
nishantjr

1
@nishantjr ,,, başlığa bağlı olan kendi kod sayfasını kullanır.
totallyhuman

6

Toplu, 13 bayt

@echo %~z0
:

Açıklama: %~z0kaynak dosyanın uzunluğuna genişler, bu nedenle dosyayı ikiye katlamak sadece uzunluğu iki katına çıkarır. İkinci satır hiçbir şey yapmayan boş bir etiket tanımlar. Dosya iki katına çıktığında, @echo %~z0üçüncü satır başka bir boş etiket iken, bunun yerine adında bir etiket olur .


6

QBasic,  44  28 bayt

Orada hiçbir sonunda yeni satır. İkili 4olduğunda, tek 8çıktığında çıkar.

4
READ x,y
?x+y
END
DATA 4,0

açıklama

Tek versiyon için:

  • 4 bir satır numarasıdır.
  • READ x,yilk iki değeri alır DATAaçıklamada ve onları saklar xve y. Böylece xalır 4ve yalır 0.
  • ?x+y iki sayıyı ekler ve yazdırır.
  • END programdan çıkar.

İkili sürümde DATAifade DATA 4,04, 4her ikisine de atanan xve yböylece bunun yerine x+yeşit yapan hale gelir 8.


6

Befunge-98 , 5 bayt

90g.@

Çevrimiçi deneyin!

gFunge-Space'de koordinattaki (9, 0) karakter değerini alır; .bir tamsayı olarak yazdırır ve @programı durdurur. İki katına çıkmamış sürümde, (9, 0) programın sınırları dışındadır ve programın dışındaki Funge-Space bir alanın varsayılan değerine başlatılır, bu nedenle 32 sayısını yazdırırız. 0) @karakter, 64 yazdık.


Bu, en yaratıcı Befunge-98 cevabının beklediğim gibi değildi ... gerçekten yaratıcı bir cevap!
MildlyMilquetoast


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.