Was für ein Inning ist das?

15

Tor

Da die World Series vor der Tür steht, brauche ich ein Programm, mit dem ich die Ergebnisse der Box ablesen und mir sagen kann, um was es sich handelt. Dies ist etwas kompliziert, da Baseball eine ungerade Methode verwendet, um die Punktzahl aufzuzeichnen. Sie schreiben die Punktzahl des Teams für das Inning erst auf, wenn sie einen Lauf erzielt haben (und immer noch fahren) oder ihren Angriff beendet haben. Somit bedeutet eine 0 auf der Anzeigetafel immer einen beendeten Angriff. Beispielsweise:

Example A:
Inning| 1| 2| 3| 4| 5| 6| 7| 8| 9|
  Them| 0| 0| 0| 0| 0| 2|  |  |  |
    Us| 0| 0| 2| 0| 0| 0|  |  |  |

Example B:
Inning| 1| 2| 3| 4| 5| 6| 7| 8| 9|
  Them| 0| 0| 0| 0| 0| 2|  |  |  |
    Us| 0| 0| 2| 0| 0| 1|  |  |  |

Example C:
Inning| 1| 2| 3| 4| 5| 6| 7| 8| 9|
  Them| 0| 0| 0| 0| 0| 2|  |  |  |
    Us| 0| 0| 2| 0| 0|  |  |  |  |

#Them is the Away Team, Us is the Home Team (who are the guys you root for)
  • Beispiel A: Wir wissen, dass wir am oberen Ende des siebten Platzes sind, weil wir im unteren Bereich des sechsten Platzes eine aufgezeichnete 0 haben und der obere Bereich des siebten Platzes leer ist.
  • Beispiel B: Es kann entweder das untere Ende des sechsten oder das obere Ende des siebten sein.
  • Beispiel C: Es kann entweder das obere oder das untere Ende des sechsten sein.

Ihre Aufgabe ist es, die Innings zurückzugeben, die es sein könnten.

Eingang

Zwei Listen nicht negativer Ganzzahlen. Es wird angenommen, dass die Listen gezackt sind und die Liste der Auswärtsmannschaft entweder dieselbe Größe oder ein Element größer ist als die der Heimmannschaft. Sie können die Ergebnisse in beliebiger Reihenfolge angeben, in Ihrer Antwort jedoch angeben, wenn Sie nicht die Standardeinstellung verwenden. Dh, Auswärtsteam, dann Heimmannschaft (Standardeinstellung) oder Heimmannschaft, dann Auswärtsteam (umgekehrt). Sie können auch mit Dummy-Daten aufgefüllt werden, geben Sie dies in Ihrer Antwort an.

Ausgabe

Eine Zeichenfolge oder etwas Äquivalentes, das die Inning-Nummer identifiziert und angibt, ob es sich um die obere oder die untere handelt. Zum Beispiel 7B 8T, B7 T8, ['7B','8T']sind alle in Ordnung. Wenn es zwei Antworten gibt, müssen Sie beide ausgeben. Das Format ist allerdings ziemlich flexibel.

Regeln

  • Die Eingabe ist immer gültig
  • Spiele können in unbestimmte zusätzliche Innings gehen. Ihr Programm sollte in der Lage sein, bis zu 255 Innings zu unterstützen.
  • Standardlücken sind verboten
  • Das ist also gewinnt der kürzeste Code

Testfälle

#Input:
[[], 
 []] 
#Output: 1T

#Input:
[[0], 
 []] 
#Output: 1B

#Input:
[[0,0,0,1], 
 [0,0,0,0]] 
#Output: 5T

#Input:
[[0,0,0,1], 
 [0,0,0,1]] 
#Output: 4B, 5T

#Input:
[[0,0,0,1,0,0,1,0,0,1],
 [0,0,0,0,1,0,0,1,0,1]] 
#Output: 10B, 11T

#Input:
[[0,0,0,1], 
 [0,0,0]] 
#Output: 4T, 4B

#Input:
[[0,0,0,0], 
 [0,0,0]] 
#Output: 4B
Veskah
quelle
Können wir die beiden Listen in umgekehrter Reihenfolge nehmen? dh unten dann oben?
Jo King
@JoKing Sicher, solange es notiert ist und die Antwort noch korrekt übereinstimmt.
Veskah
Ist der positive / negative ganzzahlige Rückgabewert akzeptabel?
@Rogem Das treibt es ein bisschen an, aber wenn Sie Ihre Artikel lesen, ist das in Ordnung. Ich habe gesagt, die Ausgabe ist sehr flexibel.
Veskah

Antworten:

4

C (gcc) , 50 Bytes

Übernimmt die Eingabe als Zeiger auf eine verschachtelte Liste (dh {them#1, us#1, them#2,...}).

Gibt eine Option über die Änderung und die andere über den Rückgabewert zurück.

Negative Werte geben den unteren Rand des Innings an, positive Werte den oberen Rand des Innings. Nullen sind "leer". Der absolute Wert der Ausgabe ist die Nummer des Innings. Gibt also an, -4,5dass die Möglichkeiten über der fünften und unter der vierten liegen, und 1,0gibt an, dass die einzige Möglichkeit über der ersten liegt.

Der Rückgabewert des Makros kann verwendet werden, um zu bestimmen, ob ein oder zwei mögliche Innings vorhanden sind. Der Rückgabewert ist, 0wenn es kein anderes Inning gibt. Ansonsten ist es die Nummer des Innings.

Null Byte Quellcode. Verwenden Sie Folgendes als Präprozessor-Flag:

-Df(o,n,l)=({o=n%2?~n/2:n/2+1;l[n-1]?-o-~n%2:0;})

Probieren Sie es online!

Degolf

-Df(o,n,l)=({
// Define a function-like macro f(o,n,l)
// o is the output variable, n is the size of the list, 
// l is a pointer to the first element of the list.
o=n%2?~n/2:n/2+1;
// If there's an odd number of elements, first possible inning is -(n+1)/2. 
// Else, it is (n/2)+1.
l[n-1]?-o-~n%2:0})
// If the score from the last inning is non-zero, the other possible inning
// needs to be determined; flip the sign of first output value then deduct 
// 1 from it if the number of elements is even.

quelle
Dies könnte auch um weitere 4 Bytes erweitert werden, wenn ich davon ausgehen kann, dass sich die Liste in umgekehrter Reihenfolge befindet (von zuletzt nach zuerst) oder der Zeiger auf das letzte Element im Array zeigt. Ich habe mich nicht dafür entschieden, da es sich nach einem zu großen Betrug anfühlte.
Ich würde gerne von @veskah hören, wenn es in Ordnung ist, Eingaben so zu nehmen, wie Sie es getan haben, da sie sich von der ursprünglichen Spezifikation deutlich (und nützlich) unterscheiden.
BLT
2
@BLT Interleaving ist die Art und Weise, wie Listen von Listen in C erstellt werden. Die mehrfache Dereferenzierung ist sehr ressourcenintensiv. Eine andere Möglichkeit wäre, eine Liste nach der anderen zu haben, aber dann wäre es sehr unpraktisch, neue Elemente anzufügen.
3

Perl 6 , 52 48 45 Bytes

-3 Bytes dank einiger Umstrukturierungen von nwellnhof!

->\a,\b{(+a,a==b if (b,a)[a>b].tail;b+1,a>b)}

Probieren Sie es online!

Anonymer Codeblock, der die Eingabe als zwei Listen oben und unten annimmt. Die Ausgabe ist eine Liste von Tupeln, wobei das erste Element die Inning-Nummer und das zweite Element True oder False ist, entsprechend Bottom oder Top.

Erläuterung:

       {                                    }  # Anonymous code block
->\a,\b   # That takes input lists a and b
        (                                  )   # Return a list of
                                    b+1,a>b    # A list of 
                                               #  The length of the second list plus 1
                                               #  And top/bottom
         +a,a==b     # And the length of the first list
                     # And the other of top/bottom
                 if  # Only if:
                    (b,a)[a>b]      # The current of top/bottom's
                              .tail # Last element exists and is not 0
Scherzen
quelle
3

R , 103 96 Bytes

function(a,b,l=sum(a|1),k=sum(b|1))I(l,I(l-k,I(a[l],c(l,-l),-l),I(b[l],c(-l,l+1),l+1)),1)
I=`if`

Probieren Sie es online!

@digEmAll 7 Bytes gespeichert!

Nimmt zwei Listenvektoren als Eingabe und gibt eine oder zwei Ganzzahlen aus, die die möglichen Innings darstellen. Positive Ganzzahlen sind die Oberseite des Innings und negative Ganzzahlen sind die Unterseite des Innings.

In R sind positive ganze Zahlen wahr, daher kann ich den Längenunterschied als erstes Argument für verwenden if().

BLT
quelle
Sie haben wahrscheinlich mehr Glück [[als ifErsatz, da Sie [in Ihrem Code verwenden.
Giuseppe
@ Giuseppe Ich habe es mit <und versucht ^. Ich denke, es [war das Beispiel, an das ich mich erinnere.
BLT
Sie können auch einen anderen Namen vergeben 'if'(und entfernen {}und nach f=draußen verschieben): 96 Bytes
digEmAll
2

Jelly , 11 Bytes

ZẎṖṠṪ$СẈd2

Probieren Sie es online!

Erstes Element: 0-basierter Index der Spalte.
Zweites Element: 0für oben, 1für unten.

Die Ausgabe ist eine Liste von ein oder zwei Paaren, wie oben angegeben (zur besseren Darstellung schön gemacht). Die Ausgabe erfolgt in umgekehrter Reihenfolge.

Erik der Outgolfer
quelle
2

Python 2 , 135 129 126 125 123 119 Byte

a,b=input()
c=len(a)
e,f=`c+1`+"T",`c`+"B"
print((f+e,e)[b[-1]<1],(`c`+"T"+f,f)[a[-1]<1])[len(b)<c]if b else"1"+"TB"[c]

Probieren Sie es online!

-1 mit Dank an @ovs

-4 Nochmals vielen Dank an @ovs

ElPedro
quelle
if d else"11BT"[c<1::2]für -3
Ovs
if dIch kann sehen (hätte es nicht verpassen sollen!), else"11BT"[c<1::2]Komme aber nicht kürzer für mich heraus, es sei denn, ich vermisse etwas.
ElPedro
Keine Sorge @ovs, ich habe if dtrotzdem einen anderen Weg gefunden, der von deinem inspiriert ist.
ElPedro
Anstatt dass if dSie dies tun können, müssen if bSie nicht len(b)in Variablen speichern .
Ovs
@ovs ich das sah , sondern auch brauchen dfür [d<c]. Daran kann ich keinen Weg erkennen. Irgendwelche Ideen?
ElPedro
1

Python 2 , 65 Bytes

a,b=input()
exec"a,b=[0]+b,a;print[len(b)][a[-1]<len(a+b)%2:];"*2

Probieren Sie es online!

Druckt zwei Zeilen, zuerst die unterste und dann die oberste, als Singleton-Liste. Wenn eine von beiden nicht möglich ist, ist diese Liste leer.

xnor
quelle
1

Sauber , 84 75 Bytes

import StdEnv
$ =length
?v|last[0:v]>0= $v=0
@a b| $b< $a=(?a,$a)=($a+1,?b)

Probieren Sie es online!

Definiert die Funktion @ :: [Int] [Int] -> (Int, Int)und einige Helfer.
Gibt eine Ausgabe in der Form aus, (Top, Bottom)in der eine Null eine Null-Möglichkeit bedeutet.

Οurous
quelle