Ohne weitere Bedingungen!


42

Intro

Es gibt 3 Nägel in der Wand. Sie haben ein Stück Schnur, das mit beiden Enden am Bilderrahmen befestigt ist. Um das Bild aufzuhängen, haben Sie die Schnur mit den Nägeln verwickelt. Aber bevor Sie das Bild loslassen: Können Sie vorhersagen, ob das Bild fallen wird, indem Sie sich nur ansehen, wie die Schnur um die Nägel gewickelt ist?

Im ersten Beispiel wird das Bild nicht fallen. Im zweiten Beispiel wird das Bild fallen.

Herausforderung

NBestimmen Sie anhand des Pfades der Schnur um die Nägel, ob das Bild fallen wird oder nicht. Geben Sie einen wahrheitsgemäßen Wert zurück, wenn das Bild sinken soll, und einen falschen Wert, wenn nicht.

Einzelheiten

  • Sie können davon ausgehen, dass die Nägel und das Bild in einem regelmäßigen N+1Rechteck angeordnet sind , wobei sich das Bild unten befindet.
  • Sie können davon ausgehen, dass sich keine Knoten im Seil befinden, dh das Seil kann kontinuierlich von einem der beiden Enden abgewickelt werden.
  • Jeder Nagel wird im Uhrzeigersinn mit einem Buchstaben des Alphabets aufgezählt. Sie können davon ausgehen, dass es maximal 26 Nägel (AZ) gibt.
  • Ein Umwickeln eines Nagels im Uhrzeigersinn wird mit dem Kleinbuchstaben bezeichnet, ein Umwickeln im Gegenuhrzeigersinn mit dem Großbuchstaben.

Das erste Beispiel von oben wird codiert als BcA, das zweite Beispiel wird codiert als CAbBac.

Für den geneigten Leser: Dieses Problem ist gleichbedeutend mit der Feststellung, ob ein Element der freien Gruppe - das durch den Satz von Nägeln erzeugt wird - die Identität ist oder nicht. Dies bedeutet , es ist ausreichend , um wiederholt abbrechen Strings wie aAoder , Aabis Sie einen festen Punkt erreicht. Wenn der Fixpunkt eine leere Zeichenfolge ist, ist dies das neutrale Element, andernfalls nicht.

Beispiele

Picture will fall:
Aa
CAbBac
aBbA
DAacAaCdCaAcBCBbcaAb
ARrQqRrUuVHhvTtYyDdYyEKRrkeUWwua
AKkQqEeVvBESWwseYQqyXBbxVvPpWwTtKkVHLlWwNBbAanYYyyhWwEJZUuNnzjYyBLQqQqlEGgebeEPLlTtZzpUuevZzSsbXSGgsUuLlHhUQquPpHUuFfhTZzIitGgFAaBRrBbbYXxOoDZTDdtzVvXxUudHhOVvoUuXKkxyBEeLlbFfKkHhfVAaQqHAaJjODdoVvhSsZzMZzmPpXNBbnxBbUuSSsUuDRrdNnUusJDIiUuIidCEGgeMmcLlDPOopdTEeQqCAETtNnYyeGUuPEFfSsWwHheAaBbpgCcOHUuhAaCcoEFBbfeaFHhfcCFFffNncGFfgtjMVUuKAakvKkXxLlTMmtmOFfoUuXSsYZzLXxlyxUuRPZzTtprSsWwRrPLlpGgMmKRrDHhdRCcUurYNnKCckykXJjxWwUSsJjKkLlKkuBbBbOoWwWwIiUuPDdBbCcWHBbCFfcDdYBbLlyVvSsWGgEewCchDdYywAaJjEepPpPpQXxZzFfLGXxglNnZzYDdyqCcKWXxwXxQqXTtxkFfBSSAasTFftZzsXGgxSsLlLlbZzAaCCccXVvYyxTIiOoBbFftCVQqDdBbGgAavQqKkDPpKTCctRrkdcvAaQWOowLOolqVMmvZAaHCBbcPphIiRKkrLlzFMOomDIiXJjIixMmdNnMHhmfNTtIiKkSDdTtsVvHhnAaNSVvTUutNnXxsGIiXxPpPHhUupgNnAaAAOoaaIiHJjhVvLlnYyXxQqSsTtKJjkBbNnVvEYCcFfMHGghBbmNnEeJTtjJjWYywyeNWwDIiZYyzOodnMQqmVvCcQqxVvGNnEeNBbngVvUGgYyBbDdVvIiAAaauPpQKDdEekNnVLlvHhGSDIidPZzpsPCcpgQqKkQqNOonLlIiLlJjqPAaPXxTtppYyCPpHhCIicARBbracXxWwXEVUuUuGgZHhzBSsbvGgFfeVvxLlNKknWwBLlIibWOowNnRSsrSEeKAakOosLZzZRrHhzTtTFfUuNnOKkotXxTtla


Picture will not fall:
A
BcA
ABCD
aBaA
bAaBcbBCBcAaCdCaAcaCAD
ARrQqRrUatuVHhvTYyDdYyEKRrkeUAua
AEEeQqNneHhLlAIiGgaECXxcJjZzeJFfVWwDdKkvYWwyTJjtCXxANIinaXWwxcTWwtUuWwMmTBbVWIiFLlWwZzfwPLlEepvWZzwKkEYEeWXxwySXTtEexRIiNBbnWAaTtQqNnBMSsWwOombwWwPVPpGPpgYyvDdpBbrQqHhUusKRrDAVvadLlWwOZzokGJCXSSssXxxJPpGIigZzjJjLlOoNRrnPpcMZzmjgJjNDEeQqWKkNTtnSswIidCcnYBGgbyJSsjPpIiMmMmMmSNnWVvwZzIQqLXHhxTPptlisOoeTtTtYMmVvPpyKNnMFfmkXxSVvsCGJjXxgXYJPpjWwQIiXxqyDdxFfDdAaRNnJjrctHBbZzhEQqMmeCcRBbrGgAaAaJNnRrYyWwSDdVvsJOojQGgWWwIBbiwRrqJjjWwOoFPMmDdRrQOoqNnRrDPJjpMmdPpGFfVvWUuwgpWCcNnPpwfUXCcZzJjUSsuXxxUuuRGgHhrSQqJjOosMMTtmHhmKkXxDdLlWwjSUuAaMmKYyksZzVvPZzVEeVvvHhZZOozBbzMmZCczYyGgISsiQqpXxMmXxEMmeRrAGgaGgMOGgomZFfDdzSSssBGPpgbTtBbOoRWWwGgLJjlEeGgLDdRrUulNnZzJjJjUKkuXxFfwATtaZzLVvlWwSsMmrBAaELleGBLFflbgHhbIFfiBbPpTWZzwKkKLASsaTJYyjtBbBbWwIiZCcWwzIiZLlUTtuBbYyBbIizTJjtLTtDOOoBbodBbllSsUGgLlAKkauYykUuUNnPpuDFfAaLNVvnVvlHhdMmBAaBbIiVRrGWOoPpwgWXwKkvJjOoTtYCUucVGgYyLlVvFfvRrMmySsDdbtICZzcNnINSOosDQAaXoxRGgKkrqdZznDdXxZzMGgmiJjNnACcMQqmaNnWZzUOuwTVvAJjSsaRrGgSsTtOMmRroVvRrtAVGgvMmaINniDGCcOogRrWwMVvYFfyTtmTtVvOoOIiodRrGgAxaSsGgiJja

3
Es scheint, als würde das Bild ohnehin fallen, wenn man die Hände frei hätte, um den Pfad der Zeichenfolge aufzuschreiben. Dann wird diese Herausforderung wirklich einfach.
Owacoder

@owacoder Du musst nur schnell genug sein: D
flawr

Antworten:


11

Netzhaut , 21 Bytes

+`(.)(?!\1)(?i)\1

^$

Probieren Sie es online!

Wie bei der Lösung von flawr werden dabei nur wiederholt benachbarte Paare aus Groß- und Kleinbuchstaben gelöscht und anschließend geprüft, ob das Ergebnis leer ist oder nicht.

Wie passt man zu einem Paar aus Groß- und Kleinschreibung?

(.)     # Match and capture a letter.
(?!\1)  # Ensure that the next character is not the same, to avoid matching
        # "aa" and "AA".
(?i)    # Turn on case-insensitivity.
\1      # Match the backreference. In .NET, when using case insensitivity,
        # backreferences also get case-insensitive, so this *can* still match
        # iff the cases of the two letters are different.

7

MATLAB, 76 Bytes Octave, 82 79 77 Bytes

Dies könnte das erste Mal sein, dass ich gesehen habe, dass MATLAB tatsächlich kürzer als Octave ist (um ein ganzes Byte)!

Neue Antwort in MATLAB:

c=input('');k='Aa';while k<1e5,k=k+1;c=strrep(c,65+mod(k,64),'');end;~nnz(c)

Antwort in Oktave:

c=input('');k='Aa';while k++<1e5,c=strrep(c,['',65+mod(k,64)],'');end;~nnz(c)

Gespeichert drei fünf Bytes dank flawr. ~nnz(c)ist kürzer als isempty(c)und 'Aa'zwei Bytes kürzer als [0,32].

Probieren Sie die Octave-Version online aus!


Erläuterung:

c=input('')bittet den Benutzer um Eingabe. Wir definieren k='Aa'als ein Zeichenarray.

while k++<1e5While - Schleife , wo beide Elemente in: kjeweils Iteration inkrementiert, Aa, Bb, Ccund so weiter. Die Schleife wird fortgesetzt, bis das größte Element vorhanden ist 1e5, das für die meisten Zeichenfolgen ausreichend hoch sein sollte. Es kann auf erhöht werden, 9e9ohne die Byteanzahl zu erhöhen .

Wir werden die strrepFunktion schrittweise ab der Mitte ausführen.

Bei Verwendung von erhalten mod(k,64)wir Folgendes, wenn wir das Ende des Alphabets erreichen (wenn wir kzurück in Zeichen konvertieren ):

ans = Yy
ans = Zz
ans = [{
ans = \|
ans = ]}
ans = ^~
ans = _
ans = `�
ans = aA
ans = bB

Wie Sie sehen, gibt es dazwischen einige Symbole, die sich jedoch umschließen und wieder mit dem Alphabet beginnen, jetzt jedoch zuerst mit den Kleinbuchstaben. Dies ist ein sehr kurzer Weg, um beide Aaund zu überprüfen aA.

['',65+mod(k,64)]Verkettet die numerischen Werte aus dem mod-call mit einer leeren Zeichenfolge und konvertiert die Zahlen in Zeichen.

strrepwird verwendet, um Elemente aus dem String zu entfernen cund zurückzugeben. Es wird nach allen Vorkommen kin der Zeichenfolge gesucht und durch eine leere Zeichenfolge ersetzt.

Nach 1e5Iterationen haben wir entweder eine leere Zeichenfolge oder eine nicht leere Zeichenfolge. Wir prüfen, ob Elemente in der cVerwendung sind nnz(c). Wir kehren zurück not(nnz(c)), 1wenn es leer ist und 0Zeichen übrig sindc


6

Minkolang 0,15 , 30 Bytes

od4&x,N.I1=$6&d3~c-$~48*=,2&xx

Probieren Sie es hier aus!

Erläuterung

od                            Take character from input and duplicate it
  4&                          If top of stack is truthy, jump 4 spaces
    x                         Dump top of stack
     ,                        NOT top of stack
      N.                      Output as number and stop

    I1=                       1 if stack has 1 element, 0 otherwise
       $6&                    If top of stack is truthy, jump 16 spaces (to the beginning)
          d3~c                Duplicate top two items of stack, in reversed order
              -               Subtract
               $~             Absolute value
                 48*          Push 32
                    =,        0 if top two items are equal, 1 otherwise
                      2&xx    If top of stack is truthy, dump two elements from top

Minkolangs torische Natur wird hier genutzt, um die Notwendigkeit einer äußeren Schleife zu beseitigen. Die allgemeine Idee hier ist, zu überprüfen, ob die oberen beiden Elemente des Stapels 32 Einheiten voneinander entfernt sind (dh, sie sind ein Paar aus Groß- und Kleinbuchstaben), und wenn ja, beide zu entfernen. Da dies sozusagen "in Echtzeit" erfolgt, wird das Verschachteln von Paaren ordnungsgemäß gehandhabt.


5

Haskell, 62 Bytes

a%l|b:t<-l,abs(a-b)==32=t|1>0=a:l
f=null.foldr((%).fromEnum)[]

Probieren Sie es online aus

Gutschrift an flawr für dieabs und Laikoni für die fromEnumKarte .

Die Hilfsfunktion verwendet %eine bereits vereinfachte Zeichenfolge lund stellt das Symbol voran, abevor das Ergebnis vereinfacht wird. Beginnt lmit dem umgekehrten Zeichen zu a, brechen sie ab. Ansonsten awird einfach vorangestellt. Zu diesem Zeitpunkt ist keine weitere Vereinfachung erforderlich.

Die Hauptfunktion fstellt jedes Zeichen der Reihe nach über a voran und vereinfacht es foldr. Dann wird geprüft, ob das Ergebnis leer ist.

Um zu überprüfen, ob zwei Zeichen entgegengesetzte Groß- / Kleinschreibung haben und daher abgebrochen werden sollten, prüfen Sie, ob sich ihre ASCII-Werte um 32 unterscheiden. Jedes Element wird von verarbeitet, fromEnumbevor es an übergeben wird %.


Nett! Und danke für die Erklärung, ich lerne jedes Mal neue Dinge!
Fehler

4

05AB1E , 17 Bytes

DvADu‚øDíìvyK}}õQ

Probieren Sie es online!

Erläuterung

Dv                 # input number of times do:
  A                # push lowercase alphabet
   Du              # push uppercase alphabet
     ‚ø            # zip the alphabets together (['aA', ..., 'zZ'])
       Díì         # prepend a copy with each element reversed ('Aa' ...)
          v        # for each pair in the resulting list
           yK      # remove it from the accumulated string (starts as input)
             }}    # end loops
               õQ  # check result for equality to empty string

4

Haskell , 98 97 85 81 Bytes

Dies ist nur eine naive Implementierung, die wiederholt versucht, benachbarte Buchstaben abzubrechen, bis keine Änderung mehr vorliegt, und dann das Ergebnis daraus bestimmt.

Vielen Dank an @nimi für -12 Bytes und @xnor für weitere -4 Bytes!

o=fromEnum
r(a:b:l)|abs(o a-o b)==32=l|1>0=a:r(b:l)
r x=x
f=null.until((==)=<<r)r

Probieren Sie es online! oder Überprüfen Sie alle Beispiele!


f=null.until(\a->r a==a)r.map fromEnumsollte zwei Bytes speichern.
Laikoni

Ich denke (\a->r a==a)kann sein ((==)=<<r).
Xnor

1
In der zweiten Zeile, ich glaube , Sie ändern können , =r lum lreicht die Idee ist es nur einen Ersatz pro Lauf zu machen.
13.

Danke! Ich verstehe den zweiten Hinweis, aber ich habe keine Ahnung, was mit dem los ist =<<, scheint wie Magie XD
Fehler

1
@flawr Siehe diesen Tipp . Das =<<ist wie >>=aber mit den Argumenten getauscht. Der Ausdruck kommt oft in der Form ((==)=<<r)"ist unveränderlich unter r" vor.
xnor

3

Mathematica, 102 Bytes

""==StringDelete[""|##&@@#<>#2&~MapThread~{Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}]~FixedPoint~#&

Unbenannte Funktion, die eine alphabetische Zeichenfolge als Eingabe verwendet und Trueoder zurückgibt False.

Das Herzstück der Implementierung ist das Erstellen einer Funktion, mit der ein stornierendes Paar wie "Pp"oder "gG"aus einem String gelöscht wird. Der Ausdruck {Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}erzeugt ein geordnetes Paar von Zeichenlisten, wobei die erste Liste {"a","b",...,"Z"}und die zweite Liste sind {"A","B",...,"z"}. Dann #<>#2&~MapThread~wird eine Liste erstellt, in der die entsprechenden Elemente dieser beiden Listen verkettet wurden, d {"aA","bB",...,"Zz"}. H. Der spaßige Ausdruck erzeugt ""|##&@@dann (durch die Magie der Argumentfolge ##) eine Liste von Alternativen "" | "aA" | "bB" | ... | "Zz"; Schließlich StringDelete[...]ist es eine Funktion, die jedes Vorkommen einer dieser Alternativen aus einer Zeichenfolge löscht.

Es genügt jetzt, diese Funktion wiederholt auf die Eingabezeichenfolge anzuwenden, bis sich das Ergebnis nicht mehr ändert, was durch erreicht wird ~FixedPoint~#, und dann zu testen, ob das Ergebnis die leere Zeichenfolge mit ist ""==.


3

JavaScript (ES6), 73 Byte

f=(s,t=s.replace(/(.)\1+/gi,s=>s.replace(/(.)(?!\1)./,'')))=>s==t?!s:f(t)

Im Gegensatz zu .NET hat JavaScript keine Möglichkeit, die Groß- / Kleinschreibung während einer Übereinstimmung zu deaktivieren. Stattdessen müssen wir alle Teilzeichenfolgen von Buchstaben, bei denen die Groß- / Kleinschreibung wiederholt wird, unempfindlich finden und dann alle nicht übereinstimmenden Paare benachbarter Zeichen löschen, die zu diesem Zeitpunkt vorhanden sein müssen ein Paar aus Groß- und Kleinschreibung.


3

Perl, 28 Bytes

1 while s/.(??{$&^' '})//;$_

Erläuterung:

Mit Perl kann ein dynamisch generierter regulärer Ausdruck in einen regulären Standardausdruck eingefügt werden.

Das .passt zu allem.

Das (??{ist der Beginn der erzeugten regex.

Die $&Variable enthält die gesamte bisher übereinstimmende Zeichenfolge, die in diesem Fall genau die .übereinstimmende ist.

Der ^Operator führt je nach den Werten der Operanden entweder ein numerisches xoder oder ein String xoder aus. In diesem Fall ist es string xor.

Dies ' 'ist nur eine Zeichenfolge, die ein Leerzeichen enthält, das günstigerweise den ASCII-Wert (oder Unicode!) 32 hat. Wenn ein Leerzeichen mit einem Zeichen im Bereich von az oder AZ xor-tiert wird, wechselt es von Groß- zu Kleinbuchstaben oder umgekehrt umgekehrt.

Das })ist das Ende des erzeugten regulären Ausdrucks.

1 while s/whatever// sucht wiederholt nach einem Muster und ersetzt es durch die leere Zeichenfolge.

$_ist die Standardvariable. Diese Variable ist das, worauf Perl Spaß macht und aufregende Dinge, wenn Sie keine andere Variable angeben. Hier verwende ich es, um einen wahrheitsgemäßen oder falschen Wert zurückzugeben, da eine Zeichenfolge mit der Länge Null falsch ist und eine Zeichenfolge mit der Länge ungleich Null, die nicht gleich "0"ist, wahr ist. Ich gehe auch davon aus, dass die Eingabezeichenfolge ursprünglich darin platziert wurde.

Probieren Sie es hier aus


Technisch gesehen ist dies das Gegenteil von dem, wonach die Herausforderung verlangt (Sie geben die Wahrheit zurück, wenn sie falsch sein sollte und umgekehrt). Um es zu beheben, fügen Sie es einfach !vor dem Finale hinzu $_. Wenn es für Sie in Ordnung ist, diese Einstellung beizubehalten, können Sie 4 Byte einsparen, indem Sie sie auf s/.(??{$&^' '})//&&redo+1 Byte für das -pFlag ändern . Es funktioniert in einer Subroutine nicht so, wie Sie es jetzt haben, weil { code }es eigentlich keine Schleife ist (also &&redonicht funktioniert), sondern -pes in eine whileSchleife einfügt.
Gabriel Benamy

Sie können auch ein anderes Byte speichern durch Ersetzen ' 'mit $". Schauen Sie sich das an, um zu sehen, wie der Code aussieht.
Gabriel Benamy

2

Prolog (SWI) , 151 Bytes

f(S):-S="";string_code(I,S,X),string_code(J,S,Y),J is I+1,32is abs(X-Y),B is J+1,sub_string(S,0,I,_,T),sub_string(S,B,_,0,U),string_concat(T,U,V),f(V).

Es dauert lange, bis die längeren falschen Fälle aufgrund von Backtracking ausgeführt werden.

Probieren Sie es online!

Ungolfed

f(S):-                       The string S corresponds to a falling picture if:
  S="";                      S is the empty string, or...
  string_code(I,S,X),        X is the character code at some index I
  string_code(J,S,Y),        Y is the character code at some index J
  J is I+1,                  J is I+1
  32 is abs(X-Y),            X and Y differ by 32 (difference between lower/upper case)
  B is J+1,                  ...
  sub_string(S,0,I,_,T),     ...
  sub_string(S,B,_,0,U),     ...
  string_concat(T,U,V),      ...
  f(V).                      The concatenation of the substrings before and after 
                             the letters X and Y corresponds to a falling picture.

1

MATL , 20 Bytes

t"[]yd|32=fX<tQh(]n~

Probieren Sie es online! Oder überprüfen Sie alle Testfälle (es dauert eine Weile).

Erläuterung

t       % Input string implicitly. Duplicate
"       % Do as many times as input size
  []    %   Push empty array
  y     %   Duplicate current string onto the top
  d|    %   Absolute consecutive differences
  32=   %   Convert to true if 32, false otherwise
  fX<   %   Index of first occurrence of true, or empty of all false
  tQ    %   Duplicate, add 1. This gives the next index, or empty
  h     %   Concatenate. Gives the two consecutive indices of letters
        %   to be removed, or empty
  (     %   Assign an empty array to those positions, i.e. delete them
]       % End
n~      % Number of elements, negate

1

Mathematica, 65 Bytes

(ToCharacterCode@#//.{x___,y_,z_,w___}/;Abs[y-z]==32:>{x,w})=={}&


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.