È lo sprint finale ... e metà della tua squadra è ammalata. Lavori fino a tardi, ti impegni per l'ultima giornata, non vedo l'ora ... perché le luci sono spente? Non ricordo il ragazzo della sicurezza che viene in giro ... oh no! Ho lasciato le chiavi a casa!
Mentre l'orrore della situazione sprofonda, decidi che stai per fuggire .
Riepilogo dell'attività
Per effettuare la tua fuga, hai bisogno di un piano! Tuttavia, sai che qualsiasi piano ha una probabilità di fallire e piani diversi richiedono diversi sforzi.
Essendo affamato, stanco e ingegnere, decidi di scrivere un breve programma per determinare il modo migliore per sfuggire al complesso, bilanciando le preoccupazioni relative alla probabilità di successo e allo sforzo necessario.
Fai una mappa dell'edificio:
#######################
# = #
! = ! <-- window
# ! = # (freedom!)
#################= #
# # = #
# # = #
# # = #
# o ! # # ! = #
##| ! ## # ! = #
#######################
^ ^ ^
me my door ludicrously high shelves
(locked) (climbable)
Per sfuggire all'ufficio, dovrai allontanarti dalla mappa. Qui vedi che ci sono 2 finestre ( !
), o uno ti porterebbe alla libertà, ma solo una di esse accessibile. Definiamo "fuori dalla mappa" come avere i piedi fuori dai limiti della mappa
Tipi di cellule
- empty, you can be here (i.e. the escapee can consume this cell)
# - solid (your desk, your in-tray), you can't be here, but you can stand on it
! - destructible, (co-worker's desk, door, window), you can't be here until you smash it first (turning it into an empty cell)
= - climbable, (fire ladder, filing cabinet, etc.), you can be here
Le celle originariamente consumate dall'evaso considerate vuote.
Specifiche di azione
Hai un numero di possibili azioni a tua disposizione. Questi sono definiti da semplici transizioni di stato con qualche probabilità di successo intera. Ad esempio, per camminare, si sposta l'escapee di una cella, che rappresentiamo con questa transizione:
Passo
1 punto, 100%, specchio
o. o
|. --> |
# #
I punti mostrano celle che devono essere vuote (o scalabili, ma non solide o distruttibili) perché ci muoviamo in essa o attraverso di essa. Il 100% significa che hai una probabilità del 100% di non farti del male e di porre fine alla tua audace fuga. Tutte le probabilità saranno percentuali intere comprese tra l'1% e il 100% incluso. Il primo diagramma mostra lo stato iniziale (in piedi su qualcosa di solido, in piedi accanto a uno spazio vuoto). Il secondo diagramma mostra lo stato del terminale (spostato nello spazio vuoto). Non ci sono requisiti per le celle non specificate (spazi, ) a sinistra (stato iniziale) per essere qualcosa in particolare. Celle non specificate (spazio,
) a destra (stato terminale) dovrebbe essere lo stesso di prima (ad es. qualsiasi cosa fosse dietro la fuga, o qualunque cosa io stia camminando (sia esso spazio vuoto o altro). Nota che tutto a destra (stato terminale ) i diagrammi cambiano solo le celle da distruttibili a vuote, non possono verificarsi altri cambiamenti. "1 punto" significa che costa 1 punto: definiamo "punto" come la quantità di energia necessaria per fare un passo.
"specchio" significa che questa azione ha due forme. Viene visualizzata l'azione "destra", l'azione "sinistra" è un mirror esatto, ad esempio:
.o
.|
#
è la forma speculare (a sinistra) di
o.
|.
#
L'azione destra si chiama "Destra" (es. "Step Right") L'azione sinistra si chiama "Sinistra" (es. "Step Left")
In questi diagrammi, la fuga è mostrata da
o
|
in piedi (2 unità di altezza) e
%
quando si accovaccia (alto 1 unità). Le cellule che devono essere solidi o distruttibili sono indicati da un hash, #
. Le celle che non devono essere solide o distruttibili sono indicate da un punto .
. Le cellule che devono essere distruttibili sono indicate da un botto !
. Uno spazio vuoto appena creato viene mostrato da un carattere di sottolineatura _
.
x
è un punto di riferimento che non si muove (non esiste, nessun vincolo su ciò che deve essere quella cella (come uno spazio )).
Nota: ignoriamo il problema della rapida decelerazione quando colpisci il pavimento e sì, in questo gioco puoi fare salti totalmente epici sulle scale)
Passo
1 punto, 100%, specchio
o. o
|. --> |
x# x#
Scendi
1 punto, 100%, specchio
= =
o. --> o
|. |
x= x=
rimescolare
3 punti, 100%, specchio
%. %
x# --> x#
Clamber Up
10 punti, 95%, specchio
o. %
|# --> #
x# x#
Far cadere
0 punti, 100%
o
| --> o
x. x|
Drop (Stand)
0 punti, 100%
% o
x. --> x|
Salire
2 punti, 100%
= o
o --> |
x| x
accovacciarsi
2 punti, 100%
o
| --> %
x# x#
stare in piedi
4 punti, 100%
. o
% --> |
x# x#
Salto corto
4 punti, 95%, specchio
o.. o
|.. --> |
x# x#
Salto lungo
7 punti, 75%, specchio
o... o
|... --> |
x# x#
Salto in alto
12 punti, 90%, specchio
.. o
o. --> |
|
x# x#
Mettici le spalle!
20 punti, 80%, specchio
o!. _o
|!. --> _|
x# x#
Punch
8 punti, 90%, specchio
o! o_
| --> |
x# x#
Calcio
8 punti, 85%, specchio
o o
|! --> |_
x# x#
Francobollo
8 punti, 90%
o o
| --> |
x! x_
Piani
Un piano è una sequenza delle azioni sopra definite. Per esempio:
Step Left
High Jump Left
Crouch
Shuffle Left
Shuffle Left
Stand
Long Jump Left
Put your back into it! Left
Step Left
Nota l'inclusione delle gocce. Le regole dovrebbero essere impostate per impedirti di fare qualsiasi cosa tranne cadere, ma devi ancora pianificare per questo!
Ogni piano ha uno sforzo richiesto, che è la somma degli sforzi per ogni passaggio. C'è anche una probabilità di successo, che è il prodotto delle probabilità di successo di ogni azione. Esempio semplice:
Step Right: 1stp, 100%
Long Jump Right: 7stp, 75%
Step Right: 1stp, 100%
Stamp: 8stp, 90%
Drop: 0stp, 100%
Drop: 0stp, 100%
Drop: 0stp, 100%
Drop: 0stp, 100%
Step Left: 1stp, 100%
Step Left: 1stp, 100%
High Jump Left: 12stp, 90%
Effort = 1+7+1+8+1+1+12 = 31
Success Probability = 75%*90*90% = 60.75%
Un "esempio funzionante" per la mappa nella parte superiore della pagina può essere trovato come una sintesi .
Ingresso
L'input è disponibile in due parti, un numero intero e una matrice o una stringa di caratteri.
L'intero è la probabilità minima accettabile (percentuale) di successo. Deve essere interpretato come una percentuale, quindi 80 significa che il tuo piano deve avere successo con probabilità non inferiore all'80%.
Una mappa valida è un rettangolo che include la fuga permanente (dimensione minima di 1x2) e nessun simbolo non specificato. Tutte le righe avranno la stessa lunghezza. È possibile accettare l'input come stringa delimitata monodimensionale (il delimitatore deve essere un singolo carattere coerente o una delle coppie CRLF e LFCR), come un array monodimensionale simile o un array bidimensionale. Se il formato di input scelto non indica in alcun modo la larghezza o l'altezza della mappa, è possibile accettare ulteriori argomenti per questi (è necessario dichiararlo chiaramente nella risposta). Puoi mescolare argomenti della riga di comando e input standard se ti va bene (es. Mappa da stdin, probabilità minima di successo da argv). Di seguito sono riportati esempi di mappe valide e non valide.
Valido:
o
|
Valido:
# #
! o #
! | #
#########
Non valido (nessuna fuga):
# #
! #
! #
#########
Non valido (l'escapee inizia sempre in piedi):
# #
! #
! % #
#########
Non valido (simbolo non valido):
# #
! ~ #
! #
#########
Non valido (non un rettangolo / righe di lunghezza diversa):
# #
! o #
! | #
#########
Puoi presumere che il tuo input sia valido (non mi interessa cosa fa il tuo programma se viene consegnato un input non valido).
Produzione
L'output è testo (ASCII). Può essere restituito come stringa o stampato sull'output standard. Il piano deve essere delimitato da un LF, CRLF o LFCR. Allo stesso modo, ci deve essere un altro LF, CRLF o LFCR dopo lo sforzo richiesto. Un'interruzione di riga finale è facoltativa.
È necessario elaborare un piano ottimale insieme allo sforzo richiesto o "Non c'è speranza!" se non esiste un tale piano. Non è necessario generare la probabilità di successo. Questo testo può avere o meno un'interruzione di riga finale.
Un piano ottimale è definito come un piano (vedi sopra) che richiede il minimo sforzo con almeno la data probabilità di successo. Si noti che i calcoli della probabilità devono essere esatti, non si può presumere che il virgola mobile sia abbastanza buono (Ecco perché non mi aspetto che li produciate). Proverò a progettare casi di test per testarlo equamente (se li supererai e non farai ipotesi stupide, potresti considerare valida la tua proposta).
Formato:
Required Effort: <effort>
<plan>
Ad esempio, per l'input
50
# #
! o #
! | #
#########
Un risultato appropriato sarebbe:
Required Effort: 23
Step Left
Step Left
Step Left
Kick Left
Punch Left
Step Left
Step Left
Step Left
Step Left
La probabilità di successo qui è del 76,5%.
Per la stessa mappa, ma con una probabilità minima di successo dell'80%, dovresti "rimetterti le spalle", il che richiederebbe maggiori sforzi ma soddisferebbe i criteri di probabilità di successo. Se la probabilità minima di successo fosse superiore all'80%, avresti bisogno di pensare un po 'più forte (colpisci o colpisci una parte della porta e rimescola). Se la probabilità minima di successo fosse del 100%, dovresti stampare "Non c'è speranza!"
Esempi
È possibile che ci siano più piani validi per un input, che l'output non deve essere esattamente questi, ma deve avere lo sforzo richiesto corretto ed essere un piano valido. Puoi utilizzare il verificatore per verificare le tue soluzioni (vedi sotto)
Ingresso:
100
o
|
Produzione:
Required Effort: 0
Drop
Ingresso:
5
# = #
# = !
# = ! ! !
# =#######
# = #
# = o #
# = ! | #
##########
Produzione:
Required Effort: 57
Step Left
Kick Left
Step Left
Step Left
Step Left
Climb Up
Climb Up
Climb Up
Climb Up
Climb off Right
High Jump Right
Long Jump Right
Step Right
Drop
Kick Right
Crouch
Shuffle Right
Shuffle Right
Ingresso:
60
#########
# ! # #
! ! ! o #
! # ! | #
#########
Produzione:
Required Effort: 58
Step Left
Kick Left
Crouch
Shuffle Left
Shuffle Left
Stand
Punch Left
Clamber Up Left
Shuffle Left
Drop (Stand)
Kick Left
Crouch
Shuffle Left
Shuffle Left
Per la stessa mappa, ma l'80%, l'output dovrebbe essere:
There is no hope!
Per la stessa mappa, ma il 50%, lo sforzo richiesto diventa 56 con un piano diverso)
Ingresso:
50
#######################
# # = #
! # = !
# # = #
###### #####!## =### #
#= ## # = #
#=############# = #
#= = #
#= o = #
#!!| = #
#######################
Produzione:
Required Effort: 121
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Climb Up
Climb Up
Climb Up
Climb Up
Climb Up
Climb Up
Climb off Right
Long Jump Left
Step Left
Step Left
Stamp
Drop
Drop
Crouch
Shuffle Left
Shuffle Left
Shuffle Left
Shuffle Left
Shuffle Left
Shuffle Left
Stand
Clamber Up Left
Stand
Clamber Up Left
Stand
Step Left
Step Left
Step Left
Step Left
Punch Left
Clamber Up Left
Shuffle Left
Ingresso:
66
######
# ###
#o ! !
#| ! !
### ##
######
Produzione:
Required Effort: 37
Step Right
Put your back into it! Right
Kick Right
Crouch
Shuffle Right
Shuffle Right
Ingresso:
Questo è progettato per verificare una serie di false assunzioni alle quali si potrebbe cadere vittima, e di conseguenza possono sembrare un po 'strane
30
###################
# ## # # # # = #
! ## # # # = #
# # # = #
## ############= #
# ## # #= #
# = # #= #
! = # #= #
# = # #= #
#o= ! ==#
#|= ! =#
#!= # ==########==#
# # ! !! =#
# # !! ! = #
# # !!!!#########
# # # #
# # # #
###################
Uscita con possibilità di vincolo di successo 30:
Required Effort: 199
Long Jump Right
Put your back into it! Right
<snip>
Uscita con possibilità di vincolo di successo 32:
Required Effort: 200
Long Jump Right
Punch Right
<snip>
Usando la mappa in alto come input, con probabilità di vincolo di successo dell'1%, dovresti ottenere uno sforzo richiesto di 116 (possibilità di successo ~ 32%, questo ha richiesto circa 20 secondi per essere eseguito nel mio programma di test).
Criteri di vittoria
Questo è code-golf, può vincere il codice più corto.
Per essere idoneo, la tua funzione o programma deve funzionare ed essere in grado di risolvere ciascuno dei test sopra riportati in meno di 30 minuti su una macchina ragionevole. Il mio solutore li fa in meno di 30 secondi. Se lo script di test (sotto) viene eseguito in meno di 30 minuti, sei sicuramente pronto.
Solutore di esempio, verificatore, script di test e test case (con soluzioni)
Il codice C # per un risolutore e il verificatore di soluzioni sono disponibili qui come sintesi . Il gist contiene anche file.txt
, che è una forma (abbastanza) leggibile automaticamente delle azioni sopra descritte, ed è necessario per l'esecuzione del programma. Qualsiasi discrepanza tra quel file e le specifiche non è intenzionale.
L'essenza contiene anche una serie di casi di test (inclusi tutti gli esempi sopra) e uno script di PowerShell per eseguire automaticamente un invio nei loro confronti. Se lo script indica che un determinato test ha avuto esito negativo, è possibile eseguire OfficeEscapeSolver.exe testcase<n>.txt outputFromYourProgram.txt
per visualizzare ulteriori dettagli. Soluzioni esemplificative per questi casi di test sono in un altro Gist .
Tutto il codice è un disastro completo (anche se non risolto), ma non dovresti aver bisogno di allontanarti dall'argomento static void Main(...)
per modificare la quantità di output (sentiti libero di usare queste informazioni, le ho fornite a tuo vantaggio!).
Passare un test-case non significa necessariamente che l'output sia ben formato, poiché lo script e il verificatore sono molto generosi. L'output deve corrispondere alle specifiche sopra riportate affinché l'invio sia valido.
Se ritieni di aver trovato un bug con il solutore o testscript, un errore file.txt
o una testcase non corretta, ti preghiamo di commentare questo post o di eseguire un ping su me su SE Chat; Probabilmente non noterò nessun altro tentativo di comunicare.
Non fornirò lo script di test in Bash o Batch, perché non li conosco, ma sono felice di includere una traduzione e scriverò una versione C # se la gente ne vuole una.
Post Amble
Hai domande? Non perdere tempo, chiediglielo oggi!
Questo compito ha lo scopo di richiedere uno sforzo , per dare ai golfisti seri qualcosa in cui affondare i denti.
I miei ringraziamenti ad ais523 per il suo feedback su Input / Output.
Posso fornire più testcase nel file gist se le persone vogliono di più (non vogliono che questo post diventi più) o se ne vogliono fornire alcuni.