Figurka i Ziemia


32

figura i ziemia
Źródło: Wikipedia

Do tego wyzwania należy napisać dwa programy, które przypominają rysunek i podstawę powyższego obrazu, tak aby jeden z nich drukował, figurea drugi drukował ground. Konkretnie:

  1. Napisz program, który nie pobiera danych wejściowych i drukuje ciąg figure. Jedynymi dozwolonymi znakami spacji w twoim programie są spacje (punkt kodowy 0x20) i znaki nowej linii (znaki powrotu karetki, 0x0D, znaki końca linii, 0x0A lub ich kombinacja).
  2. Ignorując znaki nowego wiersza, liczba znaków spacji (punkt kodowy 0x20) i znaków spacji musi być taka sama. Na przykład byłby to prawidłowy program (w hipotetycznym języku):

    ab c 
       d
    e f
    

    Zauważ, że w pierwszym wierszu znajduje się spacja.

  3. Jeśli zamienić n th znak spacji z n -tego znaku bez spacji, program powinien wydrukować groundzamiast. W powyższym przykładzie program wygląda następująco:

      a b
    cde 
     f 
    

    Zauważ, że w drugim i trzecim wierszu są spacje końcowe.

Zarówno postać i naziemne rozwiązania powinny być pełne programy w tym samym języku, który drukuje na standardowe wyjście. W obu przypadkach możesz wydrukować jeden opcjonalny końcowy znak nowej linii. Możesz wypisać wszystko, co chcesz STDERR, o ile STDOUT jest poprawny.

Możesz używać dowolnego języka programowania , ale pamiętaj, że te luki są domyślnie zabronione.

To jest , więc wygrywa najkrótsza ważna odpowiedź - mierzona w bajtach .

Skrypt pomocniczy

Możesz użyć tego skryptu CJam do konwersji między programem figurowym a naziemnym . Wystarczy wkleić jeden z dwóch w polu Input i uruchomić program. Informuje również, czy liczba spacji i spacji nie jest zgodna.

Tabela liderów

Odpowiedzi:


20

Galaretka , 20 bajtów

Postać

“¦ĠȮ“©ụd» Ṃ         

Dziewięć końcowych spacji. Wypróbuj online!

Ziemia

         “ ¦ĠȮ“©ụd»Ṃ

Brak spacji końcowych. Wypróbuj online!

Jak to działa

Po pierwsze, zwróć uwagę, że spacje nie są atomami, więc znaki spacji poza literałami ciągu nie wpływają w żaden sposób na program.

Literały łańcuchowe wykorzystują wbudowaną słownikową kompresję łańcuchową Jelly do tworzenia pożądanych słów. Skompresowany literał ciągów zaczyna się od , kończy na »i używa wewnętrznie do utworzenia tablicy ciągów.

Na figurze programu “¦ĠȮ“©ụd»otrzymuje się ciąg par ( „postać”, „podłoże”) , i atom wybiera leksykograficznego minimalnego, to znaczy, „rysunek” .

W programie naziemnym “ ¦ĠȮ“©ụd»zwraca zamiast tego parę łańcuchów („logicallyAbacs”, „ground”) . Minimum leksykograficzne to teraz „grunt” , który należy sumiennie dobierać.

W obu przypadkach interpreter automatycznie drukuje ostatnią wartość zwracaną - tj. Wybrane minimum - do STDOUT.


14

Python 2, 53 bajty

Zastąp ·spacją w obu odpowiedziach:

····················
print'······figureground'[6:12]#

Wydruki figure.

print'figureground'[
······6:12]#····················

Wydruki ground.


14

05AB1E , 15 14 bajtów

Postać

 'ŠÂ,'í¶      

Wypróbuj online!

Ziemia

'       ŠÂ,'í¶

Wypróbuj online!

Wykorzystuje kodowanie CP-1252 . Zwróć uwagę na spacje końcowe. W programie Figure jest to normalny program bez błędów. Dekompresuje następujące słowa:

'ŠÂ  ->  figure
'í¶  ->  ground

Przecinek drukuje wyskakuje i drukuje figuresłowo z nową linią. Ponieważ coś zostało wydrukowane, górna część stosu nie jest już drukowana.

W programie Ground występują pewne błędy, które są wygodne w tym przypadku. Następująca część:

'<space>

wypycha znak spacji na stos. ŠObraca stos, który ma liczbę operandów 3 . Na stosie jest tylko jeden element i brak danych wejściowych, więc daje to wyjątek, usuwając stos. ÂRozwidla wierzch stosu, ale ma tę samą historię jako operator obrócić. Zasadniczo więc ,polecenie nic nie drukuje.

Oznacza to, że program nadal wyświetli górną część stosu 'í¶. Wynikające z ground.


9

Retina , 31 bajtów

Postać:

|       
postać
 | ziemia
      

Ziemia:

 | figura

|       
ziemia

Figurka i Ziemia . Oba programy wymagają pozostawienia STDIN pustego, aby były prawidłowe programy figurowe lub naziemne.


9

Pyth, 30 bajtów

Postać

"figure" "ground              

14 końcowych spacji.

Test

Ziemia

Brak spacji końcowych

        "       figure""ground

Test

Jak to działa

Raczej pomocne, spacja tłumi drukowanie w Pyth, podczas gdy literały łańcuchowe bez zamykania " są domyślnie zamknięte.

Pierwszy program składa się zatem z dwóch ciągów "figure"i "ground ". Pierwszy ciąg jest domyślnie drukowany, a drukowanie drugiego jest pomijane, co oznacza, że ​​właśnie figurejest drukowany.

Drugi program składa się z dwóch ciągów " figure"i "ground". Drukowanie pierwszego jest pomijane, a drugie jest domyślnie drukowane, co oznacza, że ​​właśnie groundjest drukowane.


6

MATL , 37 bajtów

Pierwszy program

'figure'         
%x'ground'         

Każda linia ma 9 końcowych spacji.

Wypróbuj online!

Drugi program

    'figure'%
      x'ground'

Nie ma tu żadnych miejsc śledzenia.

Wypróbuj online!

Wyjaśnienie

Nic nadzwyczajnego ...

  • Spacje i znaki nowej linii między instrukcjami są ignorowane przez MATL.
  • % to symbol komentarza, który ignoruje resztę wiersza.
  • x usuwa górę stosu.
  • Stos jest domyślnie drukowany na końcu programu.

6

Java, 180 bajtów

Zastąp .spacją.

Drukuje „figurę”:

class
A{public
static
void
main(String[]a){System.out.println(
//"ground"
//
.....
........
......
....
...................................
..
........
..........
....
"figure");}}

Drukuje „szlifowane”:

.....
........
......
....
...................................
..........
..
class
A{public
static
void
main(String[]a){System.out.println(
//
"ground"
//"figure"
);}}
............

5

Befunge, 54 bajty

Rysunek ( Wypróbuj online! )

#v „erugif” v>
      : #, _ @>         
„dnuorg”

Dziesięć końcowych spacji w drugiej linii.

Ground ( wypróbuj online! )

  # v „erugif” v 
>: #, _ @> „dnuorg”
        

Jedna spacja w pierwszej linii i osiem spacji w trzeciej linii.


4

Mathematica, 50 34 bajtów

Korzysta ze środowiska REPL. (Dodanie Print[]opakowania z równą liczbą spacji zwiększyłoby liczbę bajtów o 14.) Oba programy to

01figure+0 1ground                

(z 16 końcowymi spacjami) i

          0       1figure+01ground

Kluczem tutaj jest to, że Mathematica traktuje konkatentację cyfr bez spacji jako pojedynczą liczbę, ale spacje pośrednie są interpretowane jako mnożenie sąsiednie, podobnie jak konkatenacja liczb i dowolnych nazw zmiennych. Zatem pierwsze wyrażenie ocenia na 1*figure+0*1*ground, co oznacza figure; drugie wyrażenie ocenia na 0*1*figure+1*ground, co oznacza ground.


4

PHP, 44 42 bajty

rysunek: (16 końcowych spacji, 5 spacji między rysunkiem i;)

echo''?ground:figure     ;                 

ziemia: (20 wiodących miejsc)

                     echo' '?ground:figure;

Całkiem proste, naprawdę działa, ponieważ ''jest falsey i' ' jest zgodne z prawdą. Użyj jak:

php -r "echo''?ground:figure     ;                "
php -r "                    echo' '?ground:figure;"

edycja: zapisane 2 retrospektywnie bajty dzięki Martinowi Enderowi


3

Haskell, 96 94 88 82 77 bajtów

Pierwszy program, drukuje "figure":

main              =          putStr$idid"ground"
idid    _          ="figure"

Drugi program drukuje "ground":

    main=putStr$id id"ground"                   
    idid _="figure"         

Wywołuje jedną z dwóch funkcji stałych o różnych nazwach


3

Haskell, 88 65 bajtów

main=putStr
...........--
.."figure"..........
--"ground"........

i

...........
main=putStr..
--........"figure"--
.........."ground"

.wskazuje spację. Po prostu --żonglerka komentarzem liniowym (-> ).


3

Python 2, 52 bajty

........................
print"figure"
an
d
"ground"

.s oznaczają spacje. Ostatnie trzy wiersze są podzielone na błędy bez znakuSyntaxError który uniemożliwiłby uruchomienie kodu w pierwszej kolejności.

Wersja naziemna używa tylko anddo wydrukowania drugiego ciągu.


Alternatywne (dłuższe) próby:

.......
print(#"ground")#
"figure")...................


print"figure"""and"ground"
.............
.............

3

JavaScript (ES6), 56 bajtów

alert('figure'
                //&&'ground'
           )
              
alert('figure'//            
&&'ground') 

Postać nie ma spacji końcowych.


Liczę 56 bajtów dla każdego programu, chyba że nowe wiersze się nie liczą. Wątpię, żeby się to skróciło.
ETHprodukcje

@ETHproductions Ugh, tak się dzieje, gdy ręcznie liczysz bajty :-(
Neil

2

Szyna , 56 bajtów

Postać

$'main'
 -[figure]o                
-          [ground]o

W drugiej linii znajduje się 16 końcowych spacji. Program kończy się z błędem.

Wypróbuj online!

Ziemia

       
$ 'main' - [rysunek] o
 - [ziemia] o         

W pierwszym wierszu znajduje się 7 spacji i 9 ostatnich spacji. Program kończy się również z błędem.

Wypróbuj online!

Wyjaśnienie

Rail szuka linii rozpoczynającej się od (notacja regularna), \$.*'main'aby znaleźć punkt wejścia. Pociąg (wskaźnik instrukcji) rozpoczyna się następnie w $ruchu na południowy wschód. Rzeczy, do których pociąg nie jest osiągalny, można całkowicie zignorować w programie. Obejmuje to wszystko w tej samej linii co punkt wejścia. Ponieważ w -południowo-wschodniej części $pociągu natychmiast skręca pociąg na wschód, oba programy ograniczają się do:

 -[figure]o
 -[ground]o

[...]oznacza literał ciąg i odrukuje go. Zwykle musisz #zakończyć szynę, ale jeśli ją pominiesz, program i tak się kończy (ale narzeka na STDERR, że pociąg się rozbił).


2

> <> , 39 bajtów

Używanie ·do reprezentowania spacji.

Postać

v·
"·dnuo
e·
r·
u·
g··
i··
f···
"·
>·o·

Wypróbuj online!

Ziemia

·v
·"····
·d
·n
·u
·oe
·ru
·gif
·"
·>·o

Wypróbuj online!

Oba programy kończą się z błędem.

Wyjaśnienie

Pisząc kod w pionie, udało mi się ponownie wykorzystać g, a rmiędzy obu rozwiązań, a także cytaty i >i odla pętli wyjściowej.

W obu przypadkach jedynym bitem, który zostanie wykonany, jest kolumna poniżej v, która wypycha litery wymaganego słowa na stos w odwrotnej kolejności. Następnie >przekierowuje wskaźnik instrukcji w prawo, gdzie przechodzi przez o, drukując znaki, aż stos będzie pusty.


Właśnie zacząłem pracować nad własną wersją> <>, potem natknąłem się na twoją. Naprawdę podoba mi się twój pomysł pracy w pionie (mój jest bardzo „normalny”).
Teal pelikan

@Tealpelican Nie wpadłem na to, dopóki nie wypracowałem odpowiedzi na temat rozszczepienia. Wcześniej moim najlepszym> <> rozwiązaniem było 42 bajty: !__|"druong">o<"figure"(gdzie _są spacje, a pozostałe spacje po prostu idą na końcu linii).
Martin Ender

Moja najkrótsza aktualna wersja to: ## "de nr uu og ri GF"> o! ~ ~! <## Co zabawne, ma również 42 bajty! Moje poprzednie wersje zawierały sprawdzanie błędów, ale mogły zmniejszać się do 53 bajtów.
Teal pelikan

2

Rozszczepienie , 37 bajtów

Używanie ·do reprezentowania spacji.

Postać

D·
"···
f··
i··
g·
u·
r·
e·ound
"·
;·

Wypróbuj online!

Ziemia

·D
·"fi
·gu
·re
·o
·u
·n
·d····
·"
·;

Wypróbuj online!

Wyjaśnienie

Działa w zasadzie tak samo jak moja> <> odpowiedź (chociaż tak naprawdę znalazłem ją jako pierwszą). Jedyne różnice polegają na tym, "że znaki są drukowane natychmiast w Fission, dlatego te słowa nie są pisane do góry nogami i dlatego musimy tylko zakończyć program ;na końcu.


1

siatkowy, 46 bajtów

                      "ground""figure"" "?$$o;

Wypróbuj online! To drukuje ground.

"ground""figure"""?$$o                 ;      

Wypróbuj online! To drukuje figure.

ziemia

Odpowiedni kod:

"ground""figure"" "?$$o;
................          push these two strings
                " "?$     pop " " off (since " " is truthy, `?` executes `$`)
                     $    pop TOS ("figure")
                      o;  output and terminate

postać

Odpowiedni kod:

"ground""figure"""?$$o;
................         push these two strings
                ""?$     doesn't activate
                    $    pop ""
                     o;  output and terminate

1

Brian & Chuck , 55 53 bajtów

Postać

erugif?dnuorg             
}<.<.<.<.<.<.             

W każdej linii jest 13 końcowych spacji.

Wypróbuj online!

Ziemia

             erugif?dnuorg
             }<.<.<.<.<.<.

Wypróbuj online!

Wyjaśnienie

Ach, minęło trochę czasu od ostatniego użycia Briana i Chucka. Krótko przypominając, Brian i Chuck są dwoma instancjami podobnymi do Brainfuck, które używają kodu źródłowego innych jako taśmy. Tylko Chuck może korzystać z polecenia drukowania ., ?warunkowo przełącza się między dwoma instancjami i }działa podobnie jak [>]w Brainfuck. Nieznane polecenia są po prostu ignorowane.

Ponieważ spacje na początku programów są ignorowane, oba programy są prawie identyczne. Jedyna różnica polega na tym, że po poleceniu przełączania ?wskaźnik instrukcji przesuwa się przed wykonaniem następnego polecenia. Dlatego pierwsze polecenie na taśmie Chucka jest zawsze pomijane. Tak więc jedyną prawdziwą różnicą jest to, że program naziemny wykonuje polecenie, }podczas gdy program figurowy nie. Oto, jak działa kod:

?   Switch control to Chuck.
}   GROUND PROGRAM ONLY: Move the tape head on Brian to the end of the tape.
<.  Move the tape head left and print the character there.
... Do the same another five times to print the remainder of the string.

0

WinDbg, 74 bajty

Ziemia

                      ea2000000"      groundfigure";;;da       2000006  L6

Postać

ea2000000"groundfigure          ";;;da                  2000006       L6  

Figurka ma 2 spacje końcowe. Wydaje mi się, że przynajmniej 2 lub 4 bajty powinny być grywalne ...

Działa poprzez zapisanie ciągu do pamięci i wyświetlenie z niego 6 znaków. Znaki w ciągu są ponownie rozmieszczane, więc wyświetlane znaki zmieniają się między programami:

* Ground:
ea 2000000 "      groundfigure";     * Write string "      groundfigure" starting at 2000000
;                                    * No-op
;                                    * No-op
da 2000006 L6                        * Print 6 ascii chars, from 2000006, ie- ground

* Figure:
ea 2000000 "groundfigure          "; * Write string "groundfigure          " to memory
;                                    * No-op
;                                    * No-op
da 2000006 L6                        * Print 6 ascii chars, ie- figure

Wydajność:

0:000>                       ea2000000"      groundfigure";;;da       2000006  L6
02000006  "ground"
0:000> ea2000000"groundfigure          ";;;da                  2000006       L6  
02000006  "figure"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.