Baskıları geriye doğru yürütün


102

Göreviniz, bazılarının printsyürütüldüğü sırayı tersine çevirmektir .


Özellikler:
Kodunuz bu biçimde olacak:

//some lines of code
/*code*/ print "Line1" /*code*/
/*code*/ print "Line2" /*code*/
/*code*/ print "Line3" /*code*/
/*code*/ print "Line4" /*code*/
//some lines of code

Bu dizeleri dördüncüden birinciye kadarprint (veya echo, veya writeeşdeğer) kullanmanız gerekecektir.

  • Programınızın hangi satırlarının karakter printdizileri olması gerektiğine siz karar verin , ancak bitişik olmaları gerekir ;

  • Her satır yalnızca bir tane içerebilir printve uzunluğu 60 baytı aşamaz ;

  • Bu olduğu için yaratıcı olun ve sadece bir gotoveya basit yazmaktan kaçınınfor(i){if(i=4)print"Line1";if(i=3)...}

  • 2 hafta içinde en çok oy alan cevap bunu kazanıyor.

  • Çıktınız GEREKİR olmak Line4 Line3 Line2 Line1 YA Line4Line3Line2Line1 YA Line4\nLine3\nLine2\nLine1 ( \nbir satır olduğu) ve sadece o yürüterek oluşturulmalıdır printsgeriye.

Mutlu kodlama!

GÜNCELLEME: Yarışma bitti! Hepinize teşekkür ederim :)


15
Arapça sayılır mı?

Tabii ki özellikleri karşılayabiliyorsanız: P
Vereos

Bir kuralı hızlıca açıklığa kavuşturmak istediniz ... "Her biri tek bir baskı içerebilir" derken, kod dosyasındaki bir metin satırı mı yoksa bir LOC / deyim mi?
Ruslan,

Her kod satırı yalnızca bir baskı içerebilir
Vereos

kod incelemesi geçmek zorunda mı - üretim koduna uygun mu?
Lance,

Yanıtlar:


183

Commodore 64 TEMEL

40 print "Line 1"
30 print "Line 2"
20 print "Line 3"
10 print "Line 4"

83
Şimdiye kadar neden satır numaralarına ihtiyaç duyulduğunu asla bilemedim.
Şubat'ta ugoren

3
Karakter ROM'unu ($ D000) RAM’e (3000 $) kopyalayarak, "1" <-> "4" ve "2" <-> "3" karakter bitmaplerini değiştirmeyi ve ardından programı sırayla çalıştırmayı önerecektim. . Bu şirin.
Mark Lakata

Standart araçları kullanarak (kesinlikle Apple II'de kesinlikle yapamazsınız) gösterilen sıraya göre kodu gerçekten kaydedemez / yükleyemez veya başka bir şekilde listeleyemediğinizden eminim, tek yapabileceğiniz konsola bu satırları yazmak olacaktır. bu sırayla. Ve eğer bu izin verilemiyorsa, cevap vermek için herhangi bir sırayla ok tuşlarını kullanarak, sıralanan dillerden herhangi birine kod yazmak için örneğin C # SendKeys kütüphanesini kullanın.
Lance

108

PHP

Kötüye öncelik ... :-)

!print "Line1\n".
!print "Line2\n".
!print "Line3\n".
!print "Line4\n";

3
PHP'de, printdönüş değeri her zaman olduğu gibi, perl'de olduğu gibi bir ifade olarak kullanılabilir 1. !1döner bool(false)bir dize boş bir dize döndürür olarak yazdınız. PHP için daha uygun bir kısıtlama echoyerine print; Yukarıdaki gerçekten tek bir ifadedir.
primo

1
@ kuldeep.kamboj Sadece bu şekilde gruplandırılmış: print ("Line 1". !print ("Line2". !print ("Line 3". !print "Line4")));- Bir basılı ifadenin sağındaki her şey bunun bir parçası.
Bwoebi

4
Her sürüm 3v4l.org/dpSpK çok etkileyici görünüyor!
eisberg

3
Anlamak biraz zaman aldı (Bağlantı için teşekkürler @ eisberg!) Ama şimdi anlıyorum. Birincisi printilk aranırken, iç (alt) printler aranıp tam olarak değerlendirilinceye kadar yazdırması gerekenleri değerlendirmeyi bitirmez . Ve !s, aksi takdirde basacak olan 1'leri gizlemek içindir. Harika, @bwoebi!
sfarbota

1
@sfarbota Okuma kuralları zor. Sabit. Thank you :-)
bwoebi

76

C

Tanımsız davranış en heyecan verici davranış türüdür!

f(){}
main()
{
   f(printf("Line 1\n"), 
     printf("Line 2\n"), 
     printf("Line 3\n"), 
     printf("Line 4\n"));
}

Gerçek çıktı derleyicinize, bağlayıcınıza, işletim sisteminize ve işlemcinize bağlı olarak değişebilir :)


22
Bunun gerçekten nasıl çalıştığı hakkında hiçbir fikrim yok, +1.
svick

7
@svick: varargs'ı desteklemek için, çoğu C derleyicisi yığında işlev argümanlarını ters sırada (yani yığındaki en üst öğe her zaman 1. argümandır) koyar, bu da argümanları aynı şekilde değerlendirecekleri anlamına gelir. Tabii ki, bu bağımsız değişkenler kabul edilir yeni derleyici daha az ve daha az durumda olur yığında geçti.
Guntram Blohm

@GuntramBlohm'un dediği gibi, temel fikir C fonksiyonu parametrelerinin sık sık (fakat her zaman değil) yığının üzerine sağdan sola doğru ilerlediğidir. Bunlar işlev çağrıları olduğundan, işlevler muhtemelen (ancak zorunlu değil) sağdan sola da çağrılır. Bunların hepsi C standardı tarafından tanımlanmamıştır, bu yüzden GCC 4'te doğru sonucu elde etmekle birlikte, gerçekte olan şey derleyiciye ve çağrı kurallarına bağlıdır.
Nick,

1
@fluffy: Ne yazık ki, başka bir yol: C etmez olup , dizi noktaları olarak Arglist virgül tedavi farklı diğer virgül.
Williham Totland,

6
@WillihamTotland o zaman gerçekten düzeltmem gereken bazı kodları biliyorum ... teşekkürler
kabarık

74

Java

Yansıma kullanma

public class ReversePrint {
    public static void main(String[]a) {
        System.out.println("Line1");
        System.out.println("Line2");
        System.out.println("Line3");
        System.out.println("Line4");
    }
    static {
        try{
            Field f=String.class.getDeclaredField("value");
            f.setAccessible(true);
            f.set("Line1","Line4".toCharArray());
            f.set("Line2","Line3".toCharArray());
            f.set("Line3","Line2 ".trim().toCharArray());
            f.set("Line4","Line1 ".trim().toCharArray());
        }catch(Exception e){}
    }
}

Çıktı:

Line4
Line3
Line2
Line1

Bu eserin neden burada bulunduğunun bir açıklaması .


61
Korkunç. Bunu sevdim.
Roger Lindsjö,

4
+1 İnsanlar her zaman java dizelerinin değişmez olduğunu söylüyor. Öyle olmadığını kanıtladın.
Victor Stafusa

16
Bu nefis derecede kötüdür, ancak ters yürütme gerekliliği karşılanmamıştır.
Thorbjørn Ravn Andersen

4
@ ThorbjørnRavnAndersen shhhh ... onlara bunu söylememelisin. : p
Danny,

5
@Victor Java'da, dizeleri vardır değişmez. Stackoverflow'un her yerinde, "İplerin değişmez olduğunu sandım" gibi sorular var. Yansımayı kullanırlar ve değişmez görünmelerini sağlar. Java'nın vaadi şudur: "Eğer şeylerimizi / sınıflarımızı istediğimiz şekilde kullanırsanız, iddialarımızın doğru olacağına söz veriyoruz." Yansıma, sınıfların kullanması amaçlanan yol değildir.
Justin,

70

C (ve Python tür)

Yeni sürüm, soru biçimine mükemmel bir şekilde uyması için bir makro kullanıyor. Quincunx'un yorumunu takiben returndaha güzel yapmak için ekledim .

Ayrıca Python'da da çalışır, ancak doğru sırada yazdırır.

#define print"\n",printf(
#define return"\n"))));}
#define def main(){0?

def main():
    print "Line 1"
    print "Line 2"
    print "Line 3"
    print "Line 4"
    return

main();

Orijinal versiyon - Makro ikame edildikten sonra ikisi pratik olarak aynıdır:

main(){
    printf("Line 1\n",
    printf("Line 2\n",
    printf("Line 3\n",
    printf("Line 4\n",
    0))));
}

1
Makro için +1. Belki bir tane daha ekleyin; gibi bir şey #define } 0))));(Makroların C de tam olarak nasıl çalıştığını bilmiyorum). Bu şekilde print cümlelerini ana yöntemde elde edebilirsiniz, başka bir şey yok.
Justin,

@ Quincunx, tanımlayamazsınız }, ama returnşimdi yaptığım şeyi tanımlayabilirsiniz . Neredeyse bir poliglot şimdi - printsözdizimi birkaç script dilinde çalışır #define, genellikle bir yorumdur, ancak main(){..}bulabildiğim herhangi bir dilde çalışmaz.
ugoren

1
@ Quincunx, ve şimdi gerçekten çokgenli.
Şubat'ta ugoren

İlk iki tanım boşluksuz işi nasıl yapar? Bunu yapmak istiyorsunuz printoyuna dahil olacak "\n",printf(?
phuclv

@ LưuVĩnhPhúc - Boşluk isteğe bağlıdır. Söylediğin gibi değiştiriyor.
ugoren

61

ES6 (geri modunu kullanarak;)

Vay canına, ECMAScript tasarımcılarının teknik özelliklerin geriye doğru modda yapılmasında inanılmaz bir öngörü olduğunu düşünüyorlar :

// activate backwards mode:
'use backwardsˈ; \* mode backwards in now *\
code of lines some \
\*code*\ "Line1" print \*code*\
\*code*\ "Line2" print \*code*\
\*code*\ "Line3" print \*code*\
\*code*\ "Line4" print \*code*\
code of lines some \
⁏ˈforwards useˈ // back to ˈnormal'.

// So simple! No need to do anything this complicated:
split('"').reduce((L,o,l)=>(l%2?o:'')+L,'')

Çıktı (değerlendirme, gerçekten):

"Line4Line3Line2Line1"

Öyle unutmayın tam olarak uyacak şekilde sadece hafif backwardification ile istenen formun modunun sözdizimi . Bu mod yalnızca Firefox'un yeni sürümlerinde desteklenir da unutmayın anda .

Son not: Aslında geri mod yok. Ancak bu, Firefox'ta çalışan geçerli bir komut dosyasıdır (her şeyi kopyalayın). : D


ES6 "gevşek modu"

BONUS : İşte geriye dönük modu kullanmayan, ancak yeni tanımlanmış "lax modunu" kullanan, JS motorunun kodun ne yapması gerektiğini, sadece herhangi bir JS sözdizimine uymadan bağımsız olarak çalışmayı deneyeceği bir sürüm. temel olarak katı kip antitezi):

// activate "lax" mode:
`use laxˋ; // also works: ˋuse relaxˋ, ˋuse guessingˋ, ˋuse whatevsˋ, etc.
//some lines of code
/*code*/ print "Line1" /*code*/
/*code*/ print "Line2" /*code*/
/*code*/ print "Line3" /*code*/
/*code*/ print "Line4" /*code*/
//some lines of code
ˋuse normalˋ; // same as ˋuse default`.

// Again, compare to inferior, illegible "traditional" ES6:
split('"').reduce((L,o,l)=>(l%2?o:'')+L,'')

Lütfen " lax modunun " şu anda yalnızca Firefox> = 34’de kullanılabildiğini unutmayın; P


7
Gönderdiğiniz 3 bağlantının tamamı 404'e gidiyor. Bu şaka mı?
Manatwork

8
Ah. Şimdi görüyorum. Sözdizimi fosforlu kalem, burada sizin suç ortağınızdı.
Manatwork

12
Bu bir açılan popülerlik yarışması ve kod trolling , hayır mı? :) Onu seviyorum.
Charles,

8
Bu, Javascript’in olağanüstü bir suistimalidir. Bunu sevdim.
Seiyria

2
Sinsi. Soooo sinsi ....
David Conrad

59

C

main()
{
  int i = 0;
  for(; i == 0; printf("Line 1\n"))
    for(; i == 0; printf("Line 2\n"))
      for(; i == 0; printf("Line 3\n"))
        for(; i == 0; printf("Line 4\n"))
          i = 1;
}

56

Yakut

print 'Line1' unless
print 'Line2' unless
print 'Line3' unless
print 'Line4'

Düzenleme: Alternatif olarak,

def method_missing(meth,*)
  puts meth.to_s.sub('print'){}
end

printLine1(
printLine2(
printLine3(
printLine4)))

38
Bunu tercih ediyorum çünkü met
Ray

2
İki çözümün olsaydı normalde iki cevap göndermez miydin?
Yapıcı

3
Bu daha fazla rubygörünmez miydi? pastebin.com/LDWpxKx8
manatwork

2
@PacMani bu parenler beyaz boşluk kullanmazlar, beyaz boşluk kullanırlar.
corsiKa

@ manatwork güzel bir! Bence method_missinggüzel Ruby-ish'in kendisi olduğunu düşünüyorum .
Histocrat

49

PHP

Biliyorum, bu delilik.

goto d;
a: print "Line1\n"; goto end;
b: print "Line2\n"; goto a;
c: print "Line3\n"; goto b;
d: print "Line4\n"; goto c;
end: exit;

66
Duyduğun ses Dijkstra'nın mezarında dönmesi. :-)
Gareth

24
Birinin "yaratıcı ol ve sadece yazmaktan kaçının goto"
dediğini sanıyordum

22
@ TheConstructor Yaratıcı kısmı PHP'de goto kullanıyor ;)
NikiC

1
Yani kazanma dolu.
Nick T,

41

Haskell

Bu neredeyse deyimsel Haskell, çünkü program sağdan sola bir fonksiyon kompozisyonuna benziyor. İşlev yazdırılmadıysa ancak (yararlı) bir değer döndüren bir şey operatörün bildirgesine gerek duymaz ve kod kütüphanelerde göreceğiniz bir şey olur.

a << b = (const a =<< b)

main = putStrLn "Line1"
    << putStrLn "Line2"
    << putStrLn "Line3"
    << putStrLn "Line4"

5
ipucu:(<<) = flip (>>)
Bergi

@Bergi Bu yazmanın başka bir yolu, sanırım biraz daha zarif. Aslında o şeyin başlangıçta (ya da Control.Monad) tanımlanmadığını görünce biraz şaşırmıştım
shiona

@ shiona: Evet, kaçırması şaşırtıcı bir şey. Ne mutlu ki, biz Applicatives hem operatörler vardır: <*ve *>.
Tikhon Jelvis

Aslında @TikhonJelvis <*uygulamalı operatör bundan daha farklıdır <<: a <* beşdeğerdir do x<-a;b;return xçalıştırır yani ailk 'ın etkisi
gururlu haskeller

40

Perl

use threads;

$a=threads->create(sub {sleep(5); print("Line1\n");});
$b=threads->create(sub {sleep(4); print("Line2\n");});
$c=threads->create(sub {sleep(3); print("Line3\n");});
$d=threads->create(sub {sleep(2); print("Line4\n");});

$a->join();
$b->join();
$c->join();
$d->join();

22
Bunun teorik olarak tam tersi sırayla basılması garanti edilmez.
Cruncher

4
@Cruncher Biliyorum, ancak 1 saniye boşluk bırakıldığında, ters sıradan başka bir şeyde baskı yapma ihtimali oldukça zayıf.
Gareth,

3
@ Gareth Bu yüzden teorik olarak italik yaptım :)
Cruncher

3
@Cruncher Bu kadar eğlenceli kılan şey bu değil mi?
Pierre Arlaud

@Cruncher teorik olarak atomlarımın bir duvardan geçebileceği şekilde mi?
cdeange

37

HTML + CSS

<p>Line 1</p>
<p>Line 2</p>
<p>Line 3</p>
<p>Line 4</p>

CSS:

body {margin-top:7em}
p + p {margin-top:-4em}

JsFiddle'a bakınız .

Düzenleme:
Kurallara daha iyi uymak için, işte XML kullanan, gerçekte kullanan bir değişken print.

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="style.css"?>
<root>
  <print>Line 1</print>
  <print>Line 2</print>
  <print>Line 3</print>
  <print>Line 4</print>
</root>

style.css nerede olmalı

* {display:block; margin-top:3em}
print + print {margin-top:-3em}

CSS'siz HTML

Ve bunun için, CSS'siz bir tane.

<table>
<tfoot><tr><td><table><tfoot><tr><td>Line 1</tr></tfoot>
<tbody><tr><td>                      Line 2</table></tfoot>
<tbody><tr><td><table><tfoot><tr><td>Line 3</tr></tfoot>
<tbody><tr><td>                      Line 4</table></tbody>
</table>

Keman .


2
Olumsuz oyu açıklayan var mı? Bu yazdırırken işe yarıyor, biliyorsunuz.
Bay Lister,

Ayrıca sadece yapabilirsinizp {float:right;}
Noyo

Ama o zaman sonuçların hepsi bir satırda olacak!
Bay Lister,

... ve buna izin var. :]
Noyo

1
... ve bu izin verilmez. : D Ayrıca bir div içine sarabilir ve CSS kuralını ekleyebilirsiniz div {float:left}.
Noyo

23

C ++

#include <iostream>
#define Q(x,y) x ## y
#define P(x,y) Q(x, y)
#define print S P(s, __LINE__) =
struct S { const char *s; S(const char *s): s(s) {} ~S() { std::cout << s << std::endl; } };
int main() {
    print "Line1";
    print "Line2";
    print "Line3";
    print "Line4";
}

(Yerel değişkenler ters bildirim sırasına göre imha edilir.)

C ++ 11

#include <iostream>
int main() {
    struct S { void (*f)(); S(void (*f)()): f(f) {} ~S() { f(); } } s[] = {
        {[](){ std::cout << "Line1" << std::endl; }},
        {[](){ std::cout << "Line2" << std::endl; }},
        {[](){ std::cout << "Line3" << std::endl; }},
        {[](){ std::cout << "Line4" << std::endl; }},
    };
}

(Çok aynı, ancak lambda ve bunun yerine bir dizi veri üyesi kullanıyor.)


Kullanarak bir çözüm std::functionyolladım ve ondan kurtulmaya çalışıyordum. Şimdi ihtiyacım yok çünkü anladın!
sergiol

21

Haskell

main = sequence_ $ reverse [
    putStr "Line1",
    putStr "Line2",
    putStr "Line3",
    putStr "Line4"]

21

JavaScript

setTimeout(function(){console.log("Line 1");},900);
setTimeout(function(){console.log("Line 2");},800);
setTimeout(function(){console.log("Line 3");},700);
setTimeout(function(){console.log("Line 4");},600);

1,2,3,4Zaman aşımı olarak kullanmak da benim için çalışıyor. (Ancak, bu davranışın ECMAScript'te standartlaştırılıp standartlaştırılmadığını bilmiyorum.)
ComFreek

1
@ComFreek: setTimeoutES'de değil, HTML5 / zamanlayıcılarda standardize edilmiştir. Ayrıca, minimum 4ms :-) zaman aşımı süresi belirler
Bergi

1
@ Bergi Yep, haklısınız elbette! HTML Standardı - Zamanlayıcılar - eğer ilgilenen varsa.
ComFreek

1
Bunu yeterince yavaş bir makinede çalıştırın (örneğin, birkaç başka uygulamayı çalıştıran bir 8086 mı?) Ve başarısız olur. (Başarısızlık durumunda, siparişin tersine çevrilmeyeceğini söylüyorum, çünkü her bir ifadeyi uygulamak> = 100ms alacaktır.
Jeff Davis,

1
@ lastr2d2 Yavaş bir bilgisayarı döngülerle simüle etmek oldukça özneldir, ancak bunun daha çok olacağını düşünüyorum: jsfiddle.net/7zbKw/1 . Whatwg.org/specs/web-apps/current-work/multipage/… adresinden not edin. "Bu API, zamanlayıcıların tam olarak programa göre çalışacağını garanti etmez. CPU yükü, diğer işler vb. Nedeniyle gecikmeler beklenmelidir."
Jeff Davis,

20

C

Söz konusu ipuçlarına karşı çıkmayı mümkün olduğunca yaratıcı kılmaya çalışmak:

#include <stdio.h>
#define print if (i == __LINE__) puts
static unsigned i;
int main(void) {
  while (--i) {
    print("Line 1");
    print("Line 2");
    print("Line 3");
    print("Line 4");
  }
  return 0;
}

3

15

BF

Hücre sarımını varsayar.

++++[->+
----[> (line 1) .[-]<]++++
---[> (line 2) .[-]<]+++
--[> (line 3) .[-]<]++
-[> (line 4) .[-]<]+
<]

Neden çalışıyor

İlk ve son satırlar dört kez tekrar eden bir döngüden oluşur (counter = cell0).

Döngünün içinde cell1her çalıştırmada artan bir sayaç değişkeni ( ) vardır.

Her satır dört, üç, iki veya bir azalmanın sıfıra eşit olup olmadığını kontrol eder. Bu nedenle, ilk çalıştırmada, sayaç birdir ve son satır çalıştırılır, ikinci çalıştırmada üçüncü satır çalıştırılır vb.

(line 1)Eğer basılı metni yapmalıdır gösterilmektedir. Döngülerdeki oklar cell2bu amaç için tahsis edilir . Kullandıktan sonra [-]temizler cell2.


14

darbe

Saygı anısına SleepSort ve SleepAdd , sana ... takdim SleepReverse :

#!/bin/bash

function print(){(sleep $((4-$1));echo "Line $1";)&}

print 1
print 2
print 3
print 4

Özellikleri gibi görünmesi için, şunu kullanın $1ve $2: function print(){(sleep $((4-$2));echo "$1 $2";)&}; print Line 1
ThinkChaos

13

Java

import java.io.PrintStream;
import java.util.concurrent.FutureTask;

public class Print {
  public static void main(String[] args) {
    new FutureTask<PrintStream>(new Runnable() {
      public void run() {
        new FutureTask<PrintStream>(new Runnable() {
          public void run() {
            new FutureTask<PrintStream>(new Runnable() {
              public void run() {
                System.out.append("Line1"); }
            }, System.out.append("Line2")).run(); }
        }, System.out.append("Line3")).run(); }
    }, System.out.append("Line4")).run();
  }
}

Hepsi doğru zamanlamada ... ;-)


Satırların bitişik olması gerekir.
Timtech

Örneğin kodgolf.stackexchange.com/a/20660/16293 ile daha az bitişik değiller, hiç kimse aynı görünmeleri gerektiğini söylemedi. Bazı yeni satır karakterlerini kaldıracak ;-)
TheConstructor

Tamam, harika :-)
Timtech

12

Python 3

import atexit

atexit.register(print,"Line1")
atexit.register(print,"Line2")
atexit.register(print,"Line3")
atexit.register(print,"Line4")

12

darbe

İşte çift yüzlü senaryo geliyor:

#!/bin/bash
s=1
if [ $s -ne 0 ]; then tac $0 | bash; exit; fi
s=0
echo "Line1"
echo "Line2"
echo "Line3"
echo "Line4"

2
tacVar olduğunu bile bilmiyordum ! Haha teşekkürler.
Noyo

11

Ortak Lisp № 1

ngorpFormlarını ters sırada uygulayan bir makro yazmak kolaydır :

(macrolet ((ngorp (&body ydob) `(progn ,@(reverse ydob))))
  (ngorp
   (write-line "Line 1")
   (write-line "Line 2")
   (write-line "Line 3")
   (write-line "Line 4")))
Line 4
Line 3
Line 2
Line 1

Ortak Lisp № 2

İşte problemi tam anlamıyla alan bir tane; sorudan çıkan kod programda değişiklik yapmadan görünür:

(macrolet ((execute-prints-backwards (&body body)
             `(progn 
                ,@(nreverse (mapcar (lambda (string)
                                      (list 'write-line string))
                                    (remove-if-not 'stringp body))))))
  (execute-prints-backwards

//some lines of code
/*code*/ print "Line1" /*code*/
/*code*/ print "Line2" /*code*/
/*code*/ print "Line3" /*code*/
/*code*/ print "Line4" /*code*/
//some lines of code

  ))
Line4
Line3
Line2
Line1

10

PHP

Başka bir evaldeğişken:

$lines=array_slice(file(__FILE__),-4); // get last 4 lines of current file
eval(implode('',array_reverse($lines)));exit; // eval lines reversed and exit
print "Line1\n";
print "Line2\n";
print "Line3\n";
print "Line4\n";

1
Kaygan! Bununla birlikte, bunun gerçekten kötü bir fikir olduğunu belirtmek zorunda kaldığımı hissediyorum.
David Kryzaniak

9

F #

let inline (?) f g x = g x; f x

(printfn "Line1%s") ?
 (printfn "Line2%s") ?
  (printfn "Line3%s") ?
   (printfn "Line4%s") ""

Az önce fonksiyonları ters sırayla yürüten özel bir operatör yarattı.


3
Oldukça eminim (?) F (g (x)) = g (x); f (x) matematiktir ve programlama değildir.
Jeff Davis,

2
@JeffDavis: Oldukça emin (?) f g xolarak kabaca okur (?)(f, g, x), değilf(g(x))
Eric

9

Git (Golang)

package main

import "fmt"

func main() {
    defer fmt.Println("Line 1")
    defer fmt.Println("Line 2")
    defer fmt.Println("Line 3")
    defer fmt.Println("Line 4")
}

Deneyin: http://play.golang.org/p/fjsJLwOFn2


Aynı kodu göndermek istedim. Kelimenin tam anlamıyla, bayt bayt tam olarak aynı.
Sanat

@Art, harika! Code Golf'te daha çok Go olduğunu görmeyi umuyorum.
cory.todd

Muhtemelen olmayacak. Git sıkıştırılmış olmak gerçekten iyi değil, tuhaf yapıları kasten sınırlandırır, böylece okunamayan bir karmaşa yaratamazsınız. Ancak bu durumda (ve belki de diğer popülerlik yarışmalarında) bir şansı var.
Sanat

8

Python3

print("Line1",
print("Line2",
print("Line3",
print("Line4") or '') or '') or '')

Son satırdaki tüm boşlukları kaldırarak 6 bayt daha kısa olabilir.


7

JavaScript

[
  "console.log('Line1')",
  "console.log('Line2')",
  "console.log('Line3')",
  "console.log('Line4')"
].reverse().forEach(function(e){eval(e)})

C ++ 11

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<std::function<void()>> functors;
    functors.push_back([] { std::cout << "Line1"; });
    functors.push_back([] { std::cout << "Line2"; });
    functors.push_back([] { std::cout << "Line3"; });
    functors.push_back([] { std::cout << "Line4"; });
    std::reverse(functors.begin(),functors.end());
    std::for_each (functors.begin(), functors.end(), [](std::function<void()> f) {f();});
    return 0;
}

Yerine std::reverseve std::for_eachsadece kullanmakwhile (! functors.empty()) { functors.back()(); functors.pop_back(); }
David Hammen

7

Grup, yığın, parça, bir defada alınan miktar

echo off

call :revers ^
echo.line1 ^
echo.line2 ^
echo.line3 ^
echo.line4

:revers
if not "%2"=="" call :revers %2 %3 %4 %5 %6 %7 %8 %9
%1

Codegolf'a hoş geldiniz! Güzel mesaj.
Cruncher

7

C #

Doğrudan Run yöntemini çağırmak yerine, yük dizesi opcode işlenenlerinin değiştirilmesi dışında, Run'ın IL bayt kodunun bir kopyasını içeren dinamik bir yöntem oluşturuyorum. Bu, yeni yöntemin dizeleri ters sırada göstermesine neden olur.

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Emit;

namespace TestApp
{
    class Program
    {
        public static void Run()
        {
            Console.WriteLine("Line 1");
            Console.WriteLine("Line 2");
            Console.WriteLine("Line 3");
            Console.WriteLine("Line 4");
        }


        static void Main(string[] args)
        {
            var method = typeof(Program).GetMethod("Run");
            var il = method.GetMethodBody().GetILAsByteArray();
            var loadStringOperands = new Stack<int>();
            for (int i = 0; i < il.Length; i++)
            {
                if (il[i] == OpCodes.Ldstr.Value)
                {
                    loadStringOperands.Push(BitConverter.ToInt32(il, i + 1));
                    i += 4;
                }
            }

            var run = new DynamicMethod("Run", typeof(void), null);
            var gen = run.GetILGenerator(il.Length);
            for (int i = 0; i < il.Length; i++)
            {
                if (il[i] == OpCodes.Ldstr.Value)
                {
                    var str = method.Module.ResolveString(loadStringOperands.Pop());
                    gen.Emit(OpCodes.Ldstr, str);
                    i += 4;
                }
                else if (il[i] == OpCodes.Call.Value)
                {
                    var mInfo = method.Module.ResolveMethod(BitConverter.ToInt32(il, i + 1)) as MethodInfo;
                    gen.Emit(OpCodes.Call, mInfo);
                    i += 4;
                }
                else if (il[i] == OpCodes.Ret.Value)
                {
                    gen.Emit(OpCodes.Ret);
                }
            }

            run.Invoke(null, null);
        }
    }
}

6

piton

kullanarak başka bir çözüm eval()

a = [
"print('Line1')",
"print('Line2')",
"print('Line3')",
"print('Line4')"]

for line in reversed(a):
    eval(line)

çok karmaşık değil, anlaşılması kolay.


2
anladığım tek kod: D
moldovean
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.