Antiferromagnetische Ordnung

16

Antiferromagnetische Ordnung

Antiferromagnetismus ist das, was IBM-Forscher benutzten, um von einer 1-Terabyte-Festplatte auf eine 100-Terabyte-Festplatte mit der gleichen Anzahl von Atomen zu springen .

In Materialien, die Antiferromagnetismus aufweisen, richten sich die magnetischen Momente von Atomen oder Molekülen, die normalerweise mit den Spins von Elektronen zusammenhängen, in einem regelmäßigen Muster aus, wobei benachbarte Spins (auf verschiedenen Untergittern) in entgegengesetzte Richtungen weisen.

Ihre Aufgabe ist es, ein Programm zu schreiben, das die Reihenfolge der antiferromagnetischen Atome wie im obigen Bild darstellt. Sie müssen in der Lage sein, mindestens vier Sätze von Paaren zu haben, obwohl Sie möglicherweise mehr haben.

Jedes Paar muss wie folgt dargestellt werden, obwohl es sich um tatsächliche Pfeile handeln muss :

 oben unten
runter rauf
 oben unten

Ihre Ausgabe kann in ASCII-Grafik oder grafisch erfolgen.

Sie können nur eine Funktion oder ein ganzes Programm erstellen, aber es muss eine Eingabe nehmen und so viele Paare zeichnen. Beispiele mit nur Worten :

Eingabe: 1

 oben unten
runter rauf
 oben unten

Eingabe: 2

 hoch runter hoch runter 
runter rauf runter rauf  
 hoch runter hoch runter

Akzeptable Pfeile:

  • und
  • und
  • /|\ und \|/

Bitte geben Sie Ihre Antworten im Format Sprache (X Byte) ein , da sie leicht zu lesen sind. Die geringste Anzahl von Bytes gewinnt!

Phase
quelle
5
"Any arrows" klingt für mich ziemlich vieldeutig - was ist mit ^v?
Sp3000,
1
@ Sp3000 Nein, denn sie haben nicht die kleinen Schwänze.
Phase
2
Sind diese Pfeile erlaubt: und ? ( Unicode-Codepunkte U + 21C5 und U + 21F5 )
Digitales Trauma
1
@DigitalTrauma Sie sind perfekt!
Phase
11
@Phase Ich habe deine Bearbeitung zurückgesetzt. Wenn Sie die Bewertung von Bytes in Zeichen ändern, ändern sich die Bewertungen für viele dieser Antworten erheblich. Das Ändern der Regeln nach 15 Antworten wird im Allgemeinen verpönt.
Digital Trauma

Antworten:

16

APL, 18 12 Bytes

⍉(2×⎕)3⍴'↑↓'

Dadurch wird eine 2n x 3-Matrix erstellt, wobei n die Eingabe ( ) ist, die mit den Zeichen und gefüllt ist . Die transponierte ( ) dieser Matrix wird dann gedruckt.

Sie können es online ausprobieren .

Alex A.
quelle
Netter Missbrauch des APL-Zeichensatzes. Andere Antworten können diesen Zeichensatz allerdings auch verwenden.
Jimmy23013
1
@ jimmy23013: Die APL-Codepage ist EBCDIC-basiert. Ich bin mir nicht sicher, wie viele Sprachen das können.
Dennis
@Dennis Kann das Programm selbst nicht in ASCII sein (oder etwas Kauderwelsch in EBCDIC), während es EBCDIC-Zeichenfolgen druckt? Die Abkürzung für Zeilenumbrüche wäre jedoch weg. Alternativ schien die Windows - Konsole zu drucken , \x18\x19wie ↑↓.
Jimmy23013
Oder diese Codepages .
Jimmy23013
@ jimmy23013: Ja, ich habe gerade über alte Konsolen im Chat gesprochen . Der Kauderwelsch mag funktionieren, aber es ist wahrscheinlich eine Metadiskussion wert.
Dennis
12

Pyth, 15 Bytes (11 Zeichen)

V3.>*Q"↑↓"N

Probieren Sie es online aus: Demonstration

Erläuterung:

              implicit: Q = input number
V3            for N in [0, 1, 2]:
      "↑↓"       string "↑↓"
    *Q           repeat Q times
  .>      N      rotate the string by N
Jakube
quelle
12

Java, 313 296 Bytes

Hier ist ein Beispiel, in dem Pfeile grafisch dargestellt werden:

import java.awt.*;void f(int n){new Frame(){public void paint(Graphics g){for(int k=0,l,m,o;k<n*6;o=k%6,l=o/2*10+32,m=k/6*20+(k++%2==0?19:29),g.fillPolygon(new int[]{m+4,m,m+4,m+4,m+6,m+6,m+10},o==1|o==2|o==5?new int[]{l+9,l+5,l+5,l,l,l+5,l+5}:new int[]{l,l+5,l+5,l+9,l+9,l+5,l+5},7));}}.show();}

In einem besser lesbaren Format:

import java.awt.*;
void f(int n) {
    new Frame() {
        public void paint(Graphics g) {
            for (int k = 0, l, m, o; k < n*6;){
                o = k % 6;
                l = o / 2 * 10 + 32;
                m = k / 6 * 20 + (k++ % 2 == 0 ? 19 : 29);
                g.fillPolygon(new int[] {m+4,m,m+4,m+4,m+6,m+6,m+10},
                              o == 1 || o == 2 || o == 5 ?
                                  new int[] {l+9,l+5,l+5,l,l,l+5,l+5} :
                                  new int[] {l,l+5,l+5,l+9,l+9,l+5,l+5},
                              7);
            }
        }
    }.show();
}

Die Anzeige für 5 als Eingabe:

Anzeige für 5 als Eingabe

Sie müssen die Größe des angezeigten Fensters ändern, um die Pfeile sehen zu können. Ich habe versucht, es so zu gestalten, dass keines von ihnen am inneren Rand des Fensters "abgehackt" erscheint, aber auf bestimmten Plattformen kann es so aussehen.

TNT
quelle
9

CJam, 18 Bytes (14 Zeichen)

ri3*"↑↓"*3/zN*

Generieren Sie die Spalten (die ein sich wiederholendes Muster bilden) und transponieren Sie sie.

Probieren Sie es online aus .


Alternative 18 Bytes:

3,ri"↑↓"*fm>N*

Drehen Sie die Zeichenfolge "↑↓"*num 0, 1 oder 2 Mal.

Sp3000
quelle
7

CJam (15 Zeichen, 19 Bytes)

ri"↑↓"*_(+1$]N*

Online-Demo

Peter Taylor
quelle
1
Die Win-Bedingung ist Byte, keine Zeichen.
isaacg
@PeterTaylor: Die von der Challenge angegebene Sprache im X-Byte- Format. Sie haben es im Zeichenformat, aber Unicode-Zeichen sind 2 Bytes wert, so dass Ihre tatsächliche Punktzahl 17 Bytes
Levi
@Levi Nach dieser sie sind 3 Bytes je.
isaacg
@isaacg ah my bad
Levi
7

Befunge, 71 Bytes

Meine erste Antwort, also sei bitte sanft mit mir: o)

Ärgerliche Ausrichtungsprobleme führten zu ein paar verschwendeten Bytes. Wenn Sie Verbesserungen für mich haben, würde ich sie gerne hören!

&::3>:2% #v_0#v" \|/ "<
  >\^,*52<> 0#v" /|\ "<
:#^_$1-:#^_@  >:#,_$\1-

Eingabe: 4

 /|\  \|/  /|\  \|/  /|\  \|/  /|\  \|/ 
 \|/  /|\  \|/  /|\  \|/  /|\  \|/  /|\ 
 /|\  \|/  /|\  \|/  /|\  \|/  /|\  \|/ 
Sok
quelle
6

CJam, 14 Bytes

0000000: 332c 7269 2218 1922 2a66 6d3e 4e2a       3,ri".."*fm>N*

Dies erfordert ein unterstützendes Terminal, das die Codepage 850 wie folgt darstellt:

Der nicht spitze Teil des Codes entpuppte sich als identisch mit der alternativen Version von @ Sp3000 .


CJam, 17 Bytes

ri"⇅⇵⇅"f*N*

Cheaty Doppelpfeil-Version, mit Credits zu @DigitalTrauma.

Probieren Sie es online aus.

Dennis
quelle
5

Pyth, 16 Bytes (12 Zeichen)

J"↑↓"V3*~_JQ

Beispiel:

Input: 4
Output:
↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓
isaacg
quelle
5

Python 2, 131 122 Bytes

from turtle import*
for k in range(input()*6):z=k/3+k%3&1;pu();goto(k/3*32,z*32^k%3*64);pd();seth(z*180+90);fd(32);stamp()

Nun ... ich habe C Java geschlagen, denke ich?

Bildbeschreibung hier eingeben


Ich habe die Höhe 32für die Pfeile gewählt, die ziemlich groß ist. Nach einer Weile beginnt die Schildkröte, außerhalb des Bildschirms zu zeichnen. Wenn Sie möchten, dass alles für große Eingaben passt, können Sie entweder die Pfeile verkleinern, indem Sie das 32s ersetzen , oder verwenden screensize()(ich bin nicht sicher, ob es einen Meta-Post auf der Offscreen-Ausgabe gibt ...).

Sp3000
quelle
1
Also ... wann werden Pyth Schildkrötengrafiken hinzugefügt?
Digitales Trauma
Sicherlich für Golfzwecke sollten Sie eine einstellige Zahl für die Größe wählen ...
Beta Decay
@BetaDecay Bei einstelliger Größe ist der Schwanz kaum sichtbar, da er von der Schildkröte verdeckt wird
Sp3000
4

GNU sed, 25 Bytes

Ich habe die und Unicode-Pfeilsymbole gefunden, die mehr Kürzung ermöglichen und die durch diesen Kommentar zugelassen wurden :

h
s/1/⇅/g
H
G
s/1/⇵/g

Die Eingabe ist unär , also ist zB 4 1111:

$ echo 1 | sed -f antiferro.sed
⇅
⇵
⇅
$ echo 1111 | sed -f antiferro.sed
⇅⇅⇅⇅
⇵⇵⇵⇵
⇅⇅⇅⇅
$ 

Vorherige Antwort für den Fall und sind nicht erlaubt:

GNU sed, 39 Bytes

s/1/↑↓/g
s/.*/&a&↑\n&/
s/a↑/\n/
Digitales Trauma
quelle
3
Immer wenn ich "GNU sed" oben in einem Beitrag sehe, muss ich nicht einmal nach unten scrollen, um zu wissen, wer es gepostet hat.
Alex A.
@AlexA. Dieser Typ? ;-)
Digitales Trauma
Eingabe ist in unary ?! Ist das ein General für die Sprache oder etwas, in dem Sie programmiert haben?
Beta Decay
1
Was für eine schändliche Antwort :-)
Xebtl
1
@BetaDecay ist die einzigartige Eigenschaft von unären Strings - ihr numerischer Wert entspricht ihrer Länge. Die Meta-Frage / Antwort erlaubt dies ausschließlich für Sprachen, die keine native Arithmetik haben (zB sed). Dies ist besonders praktisch für diese Frage, da die Ausgabe der erforderlichen Länge leicht aus der unären Eingabe generiert werden kann. Cheaty? vielleicht - aber der Meta-Antwort-Konsens scheint damit einverstanden zu sein.
Digital Trauma
3

Schnelle 2, 66 Bytes

let f={n in(0..<n*3).map{print("↑↓",appendNewline:$0%n==n-1)}}

Wenn Swift nur ein bisschen weniger wortreich wäre, wäre es nicht mal so schlimm zum Golfen (ich sehe dich an, benannter Parameter appendNewline)

Kametrixom
quelle
3

Ruby 39 (oder 44) Zeichen, 43 (oder 48) Bytes

Laut https://mothereff.in/byte-counter sind die Pfeilzeichen jeweils 3 Bytes!

->(n){a=['↑↓'*n]*3;a[1]=a[1].reverse;a}

Eine anonyme Funktion, die ein Array zurückgibt. Wenn die Funktion das Array drucken muss, sollte es mit puts a5 weiteren Bytes enden .

Beispielgebrauch

f=->(n){a=['↑↓'*n]*3;a[1]=a[1].reverse;a}

puts f.call(6)

Gibt

↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓
Level River St
quelle
3

J, 41 35 32 Bytes (28 Zeichen)

3$(,:|.)(2*".1!:1[1)$ucp'↑↓'

Ich habe noch nie etwas in J programmiert, daher habe ich eine Weile gebraucht, und es ist definitiv nicht der beste Weg, dies zu tun.

Dies wartet darauf, dass Sie beim Ausführen eine Zahl eingeben, bevor Sie die Pfeile ausgeben.

Tödlich
quelle
Was meinst du damit, dass du in J nichts programmiert hast? Ich scheine mich an eine bestimmte Antwort zu erinnern, die Sie über 1 km Wiederholung gebracht hat. ;)
Alex A.
@AlexA. Einfache Arithmetik ist nicht das, was ich Programmierung nennen würde. Als ich diese Antwort gepostet habe, wusste ich wirklich nichts über J außer der Priorität von rechts nach links
Fatalize
2

Javascript (ES6), 66 63 53 47 Bytes ( 62 55 49 41 Zeichen)

f=n=>`⇅
⇵
⇅`.replace(/./g,'$&'.repeat(n))

Props to Digital Trauma, um die Zeichen ⇅ und ⇵ zu finden und mehr Bytes zu entfernen.

George Reith
quelle
2

J, 30 Bytes

|:((2*".1!:1<1),3)$ucp'↑↓'
gar
quelle
2

C 169 170 162 125 123 105 119 107 Bytes

Also, ich denke, ich könnte es genauso gut versuchen, auch wenn dies offensichtlich nicht der Gewinner ist :)

Golf gespielt:

n,i,j;main(){n=getchar();n=atoi(&n);for(;j++<3;){for(i=0;i++<n;)printf("%.3s ","⇅⇵"+(j%2)*3);puts("");}}

Ungolfed:

#include <stdio.h>
#include <stdlib.h>

/* n -> Number of columns, i & j -> Loop counters */
n,i,j;

main()
{
    /* Get the number of iterations from stdin */
    n = getchar();
    n = atoi(&n); /* Thanks @AndreaBiondo */

    for (; j++ < 3;)
    {
        /* Print rows of arrows */
        for (i = 0; i++ < n;)
            printf("%.3s ","⇅⇵" + (j % 2) * 3);

        /* Print a newline */
        puts("");
    }
}

Beispiel:

Input: 4
⇵ ⇵ ⇵ ⇵ 
⇅ ⇅ ⇅ ⇅ 
⇵ ⇵ ⇵ ⇵ 

Aktualisieren:

Sehen Sie es hier laufen

Levi
quelle
Sie können for(j=0;j++<3;)und das gleiche miti
Lirtosiast
@ThomasKwa aha ... gut gesehen. danke
Levi
iund jsind global, also werden sie auf Null initialisiert. Sie können fallen i=0und j=0.
Andrea Biondo
Außerdem können Sie Little-Endianess und Null-Initialisierung zur Verwendung ausnutzen n als Puffer verwenden:n=getchar();n=atoi(&n);
Andrea Biondo
@AndreaBiondo Wenn ich i = 0 und j = 0 entferne, ist die gesamte Ausgabe in einer Zeile. kannst du das reproduzieren Ich benutze gcc 4.9.2
Levi
2

Oktave, 37 Bytes

BEARBEITEN: korrigiert von der früheren streifenantiferromagnetischen Version. Danke @ beta-decay, dass du meinen Fehler aufgefangen hast.

f=@(n)repmat(["⇅";"⇵";"⇅"],1,n)

Definiert eine Funktion f(n). Beispielausgabe:

octave:4> f(1)
ans =

⇅
⇵
⇅

octave:5> f(5)
ans =

⇅⇅⇅⇅⇅
⇵⇵⇵⇵⇵
⇅⇅⇅⇅⇅
xebtl
quelle
1

CoffeeScript, 60 Bytes (58 Zeichen)

Verständnis macht es einfach, ohne Rekursion:

f=(n,x='')->x+='\n⇵⇅'[i%(n+1)&&1+i%2]for i in[1..n*3+2];x
rink.attendant.6
quelle
1

Ruby, 33 Bytes

Als eine Funktion:

f=->n{[s="↑↓"*n,s.reverse,s]}

Beispiel:

> puts f[3]
↑↓↑↓↑↓
↓↑↓↑↓↑
↑↓↑↓↑↓

Ruby, 37 Bytes

Volles Programm, das Eingaben von stdin übernimmt:

puts s="↑↓"*gets.to_i,s.reverse,s
daniero
quelle
Sie können nur eine Funktion oder ein ganzes Programm erstellen, aber es muss eine Eingabe nehmen und so viele Paare zeichnen.
Dennis
@ Tennis ok, ich bin dabei
daniero
Wir scheinen ein Missverständnis zu haben. Ich habe das Zitat gepostet, um zu zeigen, dass eine Funktion tatsächlich gültig ist, da Sie in Ihrer ursprünglichen Revision angedeutet haben, dass für die Frage ein vollständiges Programm erforderlich war.
Dennis
@ Tennis Kein Problem. Ich habe nur gedacht, dass das Zurückgeben von 3 Saiten nicht wirklich "Zeichnen" ist, aber ich denke, es spielt keine Rolle. Jedenfalls haben beide Versionen ein bisschen
golfen
1

> <>, 55 Bytes

"⇅⇵⇅"{:&3*1-:0(?;\
|.!09v!?%&:&:{o:}/
oa{~}/|.!09

Probieren Sie es hier online aus und geben Sie die gewünschte Länge als Anfangsstapelwert ein.

Nicht ⇅⇵-Lösung, 59 Bytes:

"↓↑"{:&3*>1-:0(?;{:{\
 |.!09v!?%&:&:oo}}@:/
9oa{$}/|.!0
Fongoid
quelle
1

BBC BASIC, 70 Bytes

INPUTx:n$=STRING$(x,"/|\\|/"):PRINTn$:PRINTSTRING$(x,"\|//|\"):PRINTn$

Damit kann wohl mehr golfen werden

Beta-Zerfall
quelle
1

C 97 Bytes

Übernimmt die Eingabe vom ersten Befehlszeilenparameter, z main 4. Unterstützt bis zu 357913940Paare. In C können Sie keine Multibyte-Zeichen als chars verwenden, aber sie funktionieren gut als Zeichenfolgen.

i,n;main(c,v)char**v;{n=atoi(v[1]);for(i=6*n+3;i--;)printf("%s",i%(2*n+1)?i%2?"↓":"↑":"\n");}

Es ist kleiner als eine Funktion, aber die anderen C-Antworten waren vollständige Programme, also habe ich das auch getan. Es wären 69 Bytes:

i;f(n){for(i=6*n+3;i--;)printf("%s",i%(2*n+1)?i%2?"↓":"↑":"\n");}
Andrea Biondo
quelle
1

Python 2, 47 Bytes

Port meiner BBC-BASIC-Antwort , die ausnutzt, wie Python Strings leicht umkehren kann.

n=r"/|\\|/"*input();print n+"\n"+n[::-1]+"\n"+n
Beta-Zerfall
quelle
1

C 117 89 85 Bytes

i;main(j,v)char**v;{j=2*atol(v[1])+1;for(;i++<3*j;)printf(i%j?i%2?"↑":"↓":"\n");}

Ungolfed:

i;
main(j,v)
char**v; // Credit to @AndreaBiondo for brilliant idea that I will use a lot in future golfed programs :)
{
    j = 2*atol(v[1])+1;
    for(;i++<3*j;)
        printf(i%j?i%2?"↑":"↓":"\n");
}
Cole Cameron
quelle
1

JavaScript (ES6), 66 Byte (62 Zeichen)

Dazu gehören das jeweils drei Byte lange Unicode-Zeichen sowie die ein Byte lange obligatorische Newline.

Verwendet die von dieser Antwort inspirierte Rekursion . Ich habe es nicht rekursiv versucht, aber das Generieren eines definierten Arrays hat zu viele Zeichen gedauert, obwohl vielleicht jemand anderes es besser kann als ich.

f=n=>(g=(a,i)=>i?g(`
↓↑`[i%(n*2+1)&&1+i%2]+a,i-1):a)('',n*6+2)

Demo

Wie bei allen ES6-Antworten sind sie in Firefox, Edge und Safari 9 nur zum Zeitpunkt des Schreibens nachweisbar:

f = n => (g = (a, i) => i ? g(`
↓↑` [i % (n * 2 + 1) && 1 + i % 2] + a, i - 1) : a)('', n * 6 + 2)

console.log = x => document.getElementById('O').innerHTML += x + '\n';

console.log(f(1));
console.log(f(2));
console.log(f(4));
console.log(f(32));
<pre><output id=O></output></pre>

rink.attendant.6
quelle
1

Java, 150 Bytes

static void g(int n){n*=2;f(n,0);f(n,1);f(n,0);}static void f(int n,int d){String l="";for(n+=d;n-->d;)l+=(n%2==0)?"↓":"↑";System.out.println(l);}

Ausgabe von g(2):

↑↓↑↓
↓↑↓↑
↑↓↑↓
DeadChex
quelle
1
Ich denke, dass Sie Pfeile ausgeben müssen, daher würde ich vorschlagen, dass Sie die Beispielausgabe und den Code ändern, um absolut klar zu machen , dass Sie nicht gegen die Regeln verstoßen :)
Beta Decay
@BetaDecay Ich sehe, dass einige zugelassene Pfeile aufgelistet wurden und ich den Schnitt nicht gemacht habe! Also habe ich deinen Rat
befolgt und
0

Python 2, 45 55 Bytes

Bearbeiten: Geänderte Pfeile

Ziemlich unkomplizierter Ansatz. Funktioniert allerdings nicht mit Unicode-Pfeilen.

def f(n):x=" /|\\ \\|/"*n;print x+"\n "+x[::-1]+"\n"+x
heo
quelle
Wenn Sie sich die Kommentare im ursprünglichen Beitrag ansehen, werden Sie feststellen, dass Sie ausdrücklich keine ^vPfeile verwenden dürfen, da sie keinen Schwanz haben
Levi
1
Danke, das habe ich nicht bemerkt. Änderte es in "/ | \", hoffe, es ist jetzt in Ordnung.
Heo
0

R 60 62 Bytes

Übernimmt die Eingabe von STDIN und gibt sie an STDOUT aus. Erstellt ein 3 x (2 * Eingabe) -Array, fügt eine Spalte mit Zeilenumbrüchen hinzu und gibt dann das transponierte Array aus.

cat(t(cbind(array(c('↑','↓'),c(3,2*scan())),'\n')),sep='')

Testlauf

cat(t(cbind(array(c('↑','↓'),c(3,2*scan())),'\n')),sep='')
1: 25
2: 
Read 1 item
↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓
MickyT
quelle
0

Tcl 49 Bytes

Kein Gewinner, aber immerhin ist es wettbewerbsfähig:

foreach x {⇅ ⇵ ⇅} {puts [string repeat $x $argv]}
Slebetman
quelle
Sie können Bytes mit speichern lmapstattforeach
sergiol
Und string repeatkann abgekürzt werdenstring re
Sergiol 20.11.17
Und ich bin mir nicht sicher, aber die Implementierung als procNebeneffekt des lmapZurückgebens von Werten und des Ersetzens $argvdurch eine aus einem Buchstaben bestehende Variable kann Byte sparen.
Sergiol
-1

Swift 2.0, 79 Bytes

Nichts Schlaues ...

let p=3;for x in 0...2{print((0..<p*2).reduce(""){$0+["↑","↓"][($1+x)%2]})}
GoatInTheMachine
quelle
3
Dies müsste in eine Funktion gestellt werden, die Änderung des Codes für die Eingabe ist nicht erlaubt
Downgoat