Wie viele Wazire können auf ein N × N-Schachbrett gelegt werden?


30

Angenommen, eine neue Feenschachfigur namens Wazir wird in das Schach eingeführt. Wazirs können sich von einer Position ( x , y ) bewegen zu:
 ( x +1, y )
 ( x , y +1)
 ( x -1, y )
 ( x , y -1)

Das heißt, sie bewegen sich orthogonal wie der Turm, aber nur einen Schritt nach dem anderen wie der König. Wie viele solcher Wazire können auf ein N × N-Schachbrett gelegt werden, sodass sich keine zwei Wazire gegenseitig angreifen können?

 Auf einem 1 × 1-Brett kann es nur 1 solches Stück geben.
 Auf einem 2 × 2-Brett können 2 solche Teile vorhanden sein.
 Auf einem 3 × 3-Brett können 5 solcher Teile vorhanden sein.

Geben Sie mit N die Anzahl der Wazire zurück, die auf ein N × N-Schachbrett gelegt werden können.

Dies ist die OEIS-Sequenz A000982 .

Weitere Testfälle

725

832

1005000


4
Das Kamel ist also für den Turm das, was der König für die Königin ist? Das heißt, Sie können sich nur orthogonal und nur schrittweise bewegen.
Adám

2
@SashaR Darf ich Ihre Frage als richtige Code Golf Herausforderung umschreiben?
Adám

2
Sicher! Auf diese Weise kann ich auch sehen, wie man in Zukunft Fragen zur Wortkodierung beantwortet
Sasha R

15
Als neuer Benutzer dieser Website haben Sie diesmal großes Glück gehabt. Viele (nicht themenbezogene) Programmierfragen auf dieser Website wurden dauerhaft geschlossen und heruntergestuft, nicht als Herausforderung bearbeitet und wie diese hochgestuft. Wie andere bereits erklärt haben, dient diese Seite nur zum Programmieren von Wettbewerben und nicht zum Nachfragen von Hausaufgaben. Sie können die Sandbox (unter codegolf.meta.stackexchange.com/questions/2140/… ) verwenden, bevor Sie eine Herausforderung veröffentlichen, um häufige Fehler beim nächsten Mal zu vermeiden. und beachten Sie, dass die meisten Benutzer auf dieser Site, wie Sie gesehen haben, "unlesbare" Sprachen verwenden.
User202729

16
Diese Frage ist insofern ziemlich verwirrend, als das Kamel bereits der Standard-Feenschachname für eine Figur wie einen Ritter ist, der längere Sprünge macht, und die von Ihnen beschriebene Figur bereits einen Feenschachnamen hat: Wazir .
Mark S.

Antworten:


33

Leerzeichen , 45 Bytes

   
	
		   
			 
 	  
   	
	      	 
	 	 	
 	

Probieren Sie es online!

Hier ist übrigens ein Beweis, dass die thatn² / 2⌉-Formel korrekt ist.

  • Wir können immer mindestens ⌈n² / 2⌉ Wazire platzieren : Legen Sie sie einfach in einem Schachbrettmuster aus! Angenommen, die oberste linke Kachel ist weiß, befinden sich ⌈n² / 2⌉ weiße Kacheln und ⌊n² / 2⌋ schwarze Kacheln auf der n × n- Tafel. Und wenn wir Wazirs auf die weißen Kacheln legen, greifen sich keine zwei gegenseitig an, da jeder Wazir nur schwarze Kacheln „sieht“.

    So platzieren wir 13 Wazire auf einem 5 × 5-Brett (jedes W ist ein Wazir).

              13 Wazire auf einem 5 × 5 Brett

  • Wir können es nicht besser machen : Kacheln wir das Schachbrett willkürlich mit 2 × 1 Dominostücken, optional mit einem 1 × 1 Stück für die letzte Ecke eines ungeraden Schachbretts, wie folgt:

              Dominoabdeckung eines 5 × 5 Brettes

    Wir brauchen ⌈n² / 2⌉ Dominosteine, um das Schachbrett abzudecken. Wenn Sie zwei Wazire auf einen Domino legen, können diese sich gegenseitig angreifen! Jedes Domino kann also höchstens einen Wazir enthalten, was bedeutet, dass wir möglicherweise nicht mehr als ²n² / 2⌉ Wazire auf dem Brett platzieren können.


Für den letzten Teil brauchen Sie das Einsteckprinzip nicht: Sie haben genau exactlyn² / 2⌉ Kacheln und höchstens Kamel pro Kacheln, also höchstens ⌈n² / 2⌉ Kamele.
ShreevatsaR

8
@ShreevatsaR Was stellt sicher, dass Sie x> >n² / 2⌉ Kamele nicht in ⌈n² / 2⌉ Kacheln legen können? Es ist das Taubenschlag-Prinzip ...
Frarugi87

2
Zuerst dachte ich, der Code würde nicht geladen, also habe ich die Seite aktualisiert und es war immer noch nicht so. Dann wurde mir klar, welcher Sprachname oben geschrieben war.
Arthur

7
Ich schätze , dass Sie ging hin und verändert Ihre C‚s W‘ s in Ihrem Beweis Illustration.
Giuseppe

4
Ich schätze auch, dass die W's alle auf den WEISSEN SPACES sind und eine Antwort in WHITESPACE haben.
corsiKa



9

APL (Dyalog) , 9 7 6 Bytes

Verwendet nun die Formel von Mr. Xcoder.

Dies ist eine anonyme implizite Präfixfunktion, die N als Argument verwendet.

2÷⍨×⍨

Probieren Sie es online!

×⍨ Quadrat N (Lit. Multiplikation Selfie, dh Multiplikation mit Selbst)

2÷⍨ durch 2 teilen

 Decke (aufrunden)


Wow, ich habe keine Ahnung, wie du das gemacht hast. Konnte die Logik nicht verstehen
Sasha R

Verdammt, jemand hat das Muster bereits herausgefunden.
Feathercrown

1
Huh, habe gerade gemerkt, dass die Formel auf der OEIS-Seite ist. Hätte das wohl nicht verknüpfen sollen.
Feathercrown





5

C (gcc) , 23 18 17 Bytes

f(n){n=n*n+1>>1;}

Probieren Sie es online!

C (gcc) , 22 Bytes (ohne undefiniertes Verhalten)

f(n){return n*n+1>>1;}

Probieren Sie es online!

Einige Leute mögen es wirklich nicht, das undefinierte Verhalten eines bestimmten Compilers auszunutzen, wenn sie bestimmte Compiler-Flags verwenden. Dies spart jedoch Bytes.


3
Ungewöhnlicher Weg, eine Antwort zu liefern IMO, aber: f (n) {n = n * n + 1 >> 1;}, um ein Byte zu speichern.
Tahg

1
@ Tahg Danke; Aber auf welche Weise finde ich es merkwürdig, eine Antwort zu geben?
Jonathan Frech

2
Ich dachte nicht, dass das Ändern des Eingabearguments eine normale Methode ist, um einen Wert in C zurückzugeben.
Tahg,

2
@YSC Dennoch ist es nach Meinung des Compilers verständlich und erzeugt eine ausführbare Datei, die funktioniert.
Jonathan Frech

5
@YSC Wir glauben hier bei PPCG, dass, wenn das Programm mit einem Interpreter arbeitet, es eine gültige Übermittlung ist. Es funktioniert auf einem Online-Dolmetscher, ist also ohne weitere Bemerkungen gültig.
Conor O'Brien


4

Python 3 , 19 Bytes

lambda x:-(-x*x//2)

Probieren Sie es online!

lambda x:-(-x*x//2)  # Unnamed function
lambda x:            # Given input x:
            x*x      # Square
           -         # Negate
               //2   # Halve and Floor (equivalent of Ceil)
         -(       )  # Negate again (floor -> ceil)

-1 Byte danke an Herrn Xcoder


x**2->x*x
Mr. Xcoder

@ Mr.Xcoder Facepalm danke
HyperNeutrino

Was ist lambda x:x*x+1>>1?
Alix Eisenhardt

Oder lambda x:x*x+1//2 Haftungsausschluss: Ich kenne weder die Syntax noch die Reihenfolge der Operationen in dieser Sprache. Ich sage, addiere 1 vor dir, //2 anstatt zweimal zu negieren.
Dan Henderson

@DanHenderson Du brauchst immer noch Klammern, sonst wird es analysiert (x*x) + (1//2), so dass es eigentlich nicht kürzer ist.
Skyler

4

x86_64-Maschinensprache (Linux), 9 8 Byte

0:       97                      xchg   %eax,%edi
1:       f7 e8                   imul   %eax
3:       ff c0                   inc    %eax
5:       d1 f8                   sar    %eax
7:       c3                      retq

Um es online auszuprobieren! , kompilieren Sie das folgende C-Programm und führen Sie es aus.

#include<stdio.h>
const char *f="\x97\xf7\xe8\xff\xc0\xd1\xf8\xc3";
int main() {
  for(int i=1; i<10; i++) {
    printf("%d\n", ((int(*)())f)(i));
  }
}

3

J , 8 Bytes

Anonyme implizite Präfixfunktion.

2>.@%~*:

Probieren Sie es online!

*: Platz

>. Decke (aufrunden)
@ nach
2%~ Teilen durch zwei


Alternative Lösungen: <.@-:@*:und*:<.@%2:
Conor O'Brien

2
@ ConorO'Brien‽ 2>.@%~*:Woher habe ich das? Ich kann das nicht lesen - sieht für mich nach Leitungsrauschen aus…
Adám

>.@-:@*:bekommt meine Stimme.
Jonah

1
@Jonah Wenn Sie blinzeln, können Sie ein Kamel sehen.
Adám


3

R , 22-21 Bytes

cat((scan()^2+1)%/%2)

Probieren Sie es online!

Quadrat, Inkrement, ganzzahlige Teilung. Kinderleicht.

Eingabe von stdin; Es kann durch Leerzeichen oder Zeilenumbrüche getrennte Eingaben erfordern und die maximalen Wazirs für jede Eingabe-Board-Größe berechnen. Ausgabe auf Standardausgabe.

-1 Byte dank Plannapus


@plannapus behoben, danke.
Giuseppe






2

Cubix , 11 Bytes

Iu*:^\)2,O@

Heheh, :^\)

Probieren Sie es online!

Wird auf den folgenden Würfel erweitert:

    I u
    * :
^ \ ) 2 , O @ .
. . . . . . . .
    . .
    . .

Welches ist der gleiche Algorithmus, den viele verwenden.

  • ^Iu : Eingabe als int einlesen und Richtung ändern
  • :* : Dup oben auf dem Stapel, multiplizieren
  • \) : Richtung ändern, inkrementieren
  • 2, : Drücken Sie 2, ganzzahlige Teilung
  • O@ : Druckausgabe als int, Programm beenden.





1

Japt , 4 Bytes

Ich habe darauf gesessen, seit die Herausforderung beendet war.

²Ä z

Versuch es

Erklärung: Quadrat, addiere 1, dividiere den Boden durch 2


Alternative

²ÄÁ1

Versuch es

Erklärung: Quadrat, 1 addieren, Bit um 1 nach rechts verschieben.


1

Kommentator , 19 Bytes

//{-//-}! {-#  -}<!

Probieren Sie es online!

Wer braucht Golfsprachen? Ich habe verwirrende Sprachen!

Ungolfed-Version:

5//{-8}//{5-}
print(10!= 5)
x={-1,3,4} # Smiley :-}
print(5<!=10)*/ # Weird comparision.

Probieren Sie es online!

Wie funktioniert es? Ich erkläre es mit Eingabe 5

//                         - Take input.                           Tape: [5 0 0]
  {-//-}!                  - Square the input.                     Tape: [25 0 0]
  {-                         - Move one along the tape
    //                       - Copy the input to the tape.         Tape: [5 5 0]
      -}                     - Move one back along the tape
        !                    - Take the product of the tape.       Tape: [25 5 0]
         <space>           - Increment the tape head.              Tape: [26 5 0]
                 {-#  -}<! - Halve the tape head (floor division). Tape: [13 2 0]
                 {-          - Move one along the tape
                   #         - Set the tape head to 2.             Tape: [26 2 0]
                      -}     - Move one back along the tape
                        <!   - Reduce the tape by floor division.  Tape: [13 2 0]

1

OCaml , 19 Bytes

let f n=(n*n+1)/2;;

Probieren Sie es online!

Ich bin ein bisschen verblüfft, dass der Name von "camels" in "wazirs" geändert wurde, bevor ich es geschafft habe, dies zu schreiben, aber ich dachte, ich würde es trotzdem posten.


1

TI-Basic, 7 Bytes

round(Ans²/2,0

Alternativ (8 Bytes):

int(Ans²/2+.5

-int(-.5Ans²funktioniert auch
Oki

@Oki Das tut es sicher. Ich wünschte nur, sie hätten eine ceil(Funktion.
Timtech

1

/// 35 Bytes

/I///,*/+,//+/I//**,/,A//*/A//,//,I

Probieren Sie es online!

Nimmt unäre Eingaben mit dem Symbol *und unäre Ausgaben mit dem Symbol auf A. Dies ist für einige spezifische Sprachen zulässig, einschließlich /// ( Meta )

Da es keine Möglichkeit gibt, Eingaben in /// vorzunehmen, sollte die Eingabe fest codiert sein:

/I/«put input here»//,*/+,//+/I//**,/,A//*/A//,//,I

für die Eingabe = 4.


Erläuterung: (Vor dem Lesen müssen Sie wissen, dass die einzige Syntax von ///are /pattern/replacement/, die jedes Vorkommen von patternby ersetzt replacement, und\ für das Escaping, andere Zeichen für die Ausgabe gedruckt werden.)

Für n=4:

/I/****//,*/+,//+/I//**,/,A//*/A//,//,I    Start program.
/I/****/                                   Replace all `I` in the program by the input.

/,*/+,//+/****//**,/,A//*/A//,//,****      Remaining part of the program.
/,*/+,/                                    Use the `,` as a scanner, scan through `*` after it and convert to `+`.
       /+/****//**,/,A//*/A//,//++++,      Note that only `*` in the second group is affected.
       /+/****/                            Replace all `+` (which is just created) by `n` asterisks (from the first `I` group)

/**,/,A//*/A//,//****************,         Now at the last of the program before the `,` there are `n²` asterisks.
/**,/,A/                                   Scan the `,` to the left to perform division by 2:
                                           replace each `**` by a `A` as the scanner `,` pass through.
/*/A//,//,AAAAAAAA                         Remaining program.
/*/A/                                      If there is any `*` remaining (if `n²` is odd), replace it with `A`.
     /,//                                  Remove the scanner `,`.
          AAAAAAAA                         Output the result.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.